El problema del agente viajero resuelto por fuerza, programación dinámica y voraz
1. EL AGENTE VIAJERO
Análisis y diseño de algoritmos, MCC 2015
Luis Alfredo Moctezuma Pascual
BENEMÉRITA UNIVERSIDAD AUTÓNOMA DE PUEBLA
FACULTAD DE CIENCIAS DE LA COMPUTACIÓN
2. INTRODUCCIÓN
El problema del agente viajero(TSP) ha sido
estudiado desde hace mucho tiempo, debido a su
complejidad computacional y por la gran cantidad
de aplicaciones a la vida real
La minimización de rutas de transporte, es decir
encontrar la ruta que nos cueste menos para ir de
un lugar a otro
En la industria por ejemplo se ha usado para la
distribución de mercancía
Logística en general
3. INTRODUCCIÓN
En la computación es muy importante analizar
estos problemas ya que inicialmente se
propusieron soluciones que tardaban mucho
tiempo
Lo que se busca es minimizar la complejidad
computacional que requiere un problema para
dar una solución
4. EL AGENTE VIAJERO
El problema consta de un conjunto de ciudades
por las que se tiene que pasar exactamente una
vez y regresar al punto de origen con el menor
costo posible.
5. EL AGENTE VIAJERO
Para esta tarea se han realizado distintos tipos
de algoritmos, como lo son:
Fuerza bruta
Divide y vencerás
Decrece y conquista
Programación dinámica
Algoritmos voraces
Algoritmos genéticos
Entre otros
6. EL AGENTE VIAJERO
Algunos de los métodos listados anteriormente
dan una solución parcial del problema, o también
llamadas soluciones locales. Cuando se resuelve
por fuerza bruta se asegura que se obtendrá la
mejor ruta, es decir la ruta que cuesta menos.
7. MÉTODOS
Se presentan tres diferentes técnicas usadas para
resolver el problema del agente viajero, así como
su complejidad computacional.
Con este análisis de cada uno de los métodos
usados se pueden mostrar las ventajas y
desventajas de usar cada uno de ellos.
9. 1 FUERZA BRUTA
En el problema del agente viajero la solución más
directa puede ser, intentar todas las
permutaciones y ver cuál de estas es la menor.
El tiempo de ejecución es un factor polinómico
del orden O(n!), el factorial del número de
ciudades, esta solución es impracticable para
dado solamente 20 ciudades por ejemplo.
2,432,902,008,000,000,000 permutaciones
10. 1 FUERZA BRUTA
En general, se pueden resolver problemas con
subestructuras óptimas siguiendo estos tres
pasos:
Paso 1: Generar una permutación con cada vecino
hasta llegar al destino.
Paso 2: Guardar la posible ruta y calcular el costo
Repetir paso 1 y 2
Comparar todas las iteraciones, la ruta mínima es el
resultado óptimo.
11. 1 FUERZA BRUTA
Es posible generar las permutaciones de todos los
nodos usando el algoritmo de Jhonson Trotter
para posteriormente usar como posible ruta cada
una de las permutaciones.
12. 1 FUERZA BRUTA
Para generar las permutaciones se usó una clase
predeterminada de java llamada
nextPermutation, que aplica el algoritmo de
Jhonson Trotter.
Johnson Trotter(n)
//Input: Un entero positive n
initialize the first permutation with: <0, <1, <2
//(Todos los elementos apuntando hacia la izquierda)
while ( //La ultima permutacion tenga un element movil)
// k ← el elemento movil k mas grande
//Intercambiar K con el elemento que lo apunta
//Invertir la direccion de todos los elementos > K
//Agregar la permutacion a la lista
13. 1 FUERZA BRUTA
Al tener las iteraciones realizadas, podemos
tomar todas las rutas planteadas y calcular el
costo, después buscar la de menor costo y
proponer como la mejor.
Para cada permutación i
Para j=0 hasta permutacion.length
Costo[i] += path[j]+ path[j+1]
fin i++
fin
//Buscar el arreglo de menor costo.
mejorRuta=min(costo)
14. 1 FUERZA BRUTA
TSP con 4 ciudades:
Permutaciones
C0C1C2C3C0
C0C1C3C2C0
C0C3C1C2C0
C0C3C2C1C0
C0C2C3C1C0
C0C2C1C3C0
Total de permutaciones: 3! si se parte de una ciudad
especifica.
Ejemplo 1
C0 C1 C2 C3
C0 0 3 4 2
C1 3 0 1 5
C2 4 1 0 2
C3 2 5 2 0
23. 1 FUERZA BRUTA
Por fuerza bruta se ha logrado encontrar el
camino con un óptimo global, es decir el que
cuesta menos para recorrer el camino del agente
viajero.
Con 16 ciudades el algoritmo genera 16! 20, 922,
789, 888, 000 permutaciones, luego cada
permutación es usada para calcular el costo y
finalmente poder comparar cada ruta en busca de
la menor.
24. 1 FUERZA BRUTA
Análisis de complejidad
Para realizar las permutaciones con el algoritmo de
Jhonson Trotter se necesita un tiempo de O(n!),
mas el tiempo que se necesite para recuperar la
distancia de cada posible ruta, necesita recorrer
todas las permutaciones, esto es O(n!),
En general el agente viajero resuelto por esta
técnica necesita un tiempo de O(n!).
26. 2 PROGRAMACIÓN DINÁMICA
En este tipo de programación utiliza un método
para reducir el tiempo de ejecución de un
algoritmo mediante la división en subproblemas y
resolver recordando todas las soluciones por si en
las siguientes iteraciones fuera necesarias
nuevamente.
TSP con algoritmo Held–Karp
Resuelve el problema en 𝜃 𝑛2 2 𝑛
Necesita 𝑛2 2 𝑛 espacio para almacenar operaciones
27. 2 PROGRAMACIÓN DINÁMICA
𝐷(𝑉𝑖 𝑆) Será la longitud del camino mínimo
partiendo del vértice Vi que pasa por todos los
vértices del conjunto S y vuelve al vértice 𝑉𝑖
En general la relación de recurrencia es la
siguiente:
𝑔 𝑖, { } = 𝐿𝑖1 Cuando S es { }
𝑔 𝑖, 𝑆 = 𝑀𝑖𝑛𝑗∈𝑆 𝐿𝑖𝑗 + 𝑔 𝑗, 𝑆 𝑗
𝒈(𝒊, 𝑺) Será la longitud del camino mínimo
partiendo del vértice i que pasa por todos los
vértices del conjunto S y vuelve al vértice 𝒊.
35. 2 PROGRAMACIÓN DINÁMICA
Análisis de complejidad
Cálculo de g(j,Ø): n-1 consultas a una tabla, para
llenar la primera iteración.
Cálculo de los g(j,S) tales que 1≤ S=k ≤ n-2 :
Tiempo de cálculo:
𝜃 𝑛 − 1 + 𝑛 − 1 𝐾
𝑛 − 2
𝑘
𝑛−2
𝑘=1 = 𝜃(𝑛2 2 𝑛)
Costo en espacio (para conservar g y J): 𝑛2
2 𝑛
Complejidad en tiempo: 𝜃(𝑛2
2 𝑛
)
(n 1) n 2
k
k sumas en total ,
37. 3 ALGORITMO VORAZ
El vecino más cercano
Permite al viajante elegir la ciudad no visitada más
cercana como próximo movimiento.
En promedio, retorna un camino de un 25% más largo
que el menor camino posible.
Revuelve el problema del agente viajero hasta con
14,900 ciudades rápidamente.
38. 3 ALGORITMO VORAZ
Para el caso del agente viajero no se asegura que la
solución dada sea la mejor. En general el proceso
seguido es el siguiente.
Paso 1: Se inicia la distancia en 0 ”cero” y un arreglo de
vecinos vacía
Paso 2: Se toma un nodo inicial, generalmente el primero
del grafo.
Paso 3: Se calculan las distancias con todos sus vecinos que
no estén en la lista de visitados.
Paso 4: Se elige el vecino más cercano al nodo inicial
Paso 5: La distancia se actualiza con la distancia
acumulada más la distancia del vecino más próximo.
Paso 6: El nodo inicial se guarda en la lista de visitados, el
vecino seleccionado ahora es el nodo inicial.
Paso 7: Repetir desde el paso 2 mientras no se llegue al
destino.
44. 3 ALGORITMO VORAZ
Análisis de complejidad
El algoritmo toma un nodo y visita a sus vecinos para
calcular las distancias, elige el costo menor y repite el
proceso
En un grafo totalmente conectado y calculará todos
los vecinos que no hayan sido visitados antes,
eligiendo al menor costo. El problema es más pequeño
en cada iteración hasta llegar al destino. Por lo
tanto: 𝜃 𝑛 log 𝑛 , donde n son las ciudades.