El problema del viajante Heurstica voraz Descripcin Problema
El problema del viajante Heurística voraz
Descripción: Problema: dado un grafo no dirigido, completo y con pesos G = (V, A), encontrar un ciclo de coste mínimo que pase por todos los nodos. 10 55 40 25 5 50 2 4 30 20 45 1 25 3 15 • Es un problema NP-completo, pero necesitamos una solución eficiente. • Problema de optimización, la solución está formada por un conjunto de elementos en cierto orden: podemos aplicar el esquema voraz.
Heurística voraz: Ir seleccionando parejas de puntos que serán visitados de forma consecutiva: – se seleccionará primero aquella pareja de puntos entre los que la distancia sea mínima; – a continuación, se selecciona la siguiente pareja separada con una distancia mínima siempre que esta nueva elección no haga que se visite un punto dos veces o más (es decir, que el punto aparezca tres o más veces en las parejas de puntos seleccionadas), o se cierre un recorrido antes de haber visitado todos los puntos. De esta forma, si hay que visitar n puntos (incluido el origen), se selecciona un conjunto de n parejas de puntos (que serán visitados de forma consecutiva) y la solución consiste en reordenar todas esas parejas de forma que constituyan un recorrido.
Planteamiento • Primera cuestión: ¿cuáles son los candidatos? • Dos posibilidades: 1) Los nodos son los candidatos. Empezar en un nodo cualquiera. En cada paso, moverse al nodo no visitado más próximo al último nodo seleccionado. 2) Las aristas son los candidatos. Hacer igual que en el algoritmo de Kruskal, pero garantizando que se forme un ciclo. 10 55 25 25 40 5 50 2 4 30 20 45 1 3 15
Planteamiento mediante heurística voraz 1) Usando los nodos como candidatos Heurística voraz 1) Candidatos = V Una solución será un cierto orden en el conjunto de nodos. Representación de la solución: s = (c 1, c 2, . . . , cn), donde ci es el nodo visitado en el lugar i-ésimo. Inicialización: empezar en un nodo cualquiera. Función de selección: de los nodos candidatos seleccionar el más próximo al último (o al primero) de la secuencia actual (c 1, c 2, . . . , ca). Acabamos cuando tengamos n nodos.
Resolución mediante heurística voraz 1) Ejemplo 1. Empezando en el nodo 1. 50 4 30 20 5 2 55 25 40 10 25 1 45 3 15 Solución: (1, 2, 3, 4, 5) Coste total: 10+20+15+50+45=140
Resolución mediante heurística voraz 1) Ejemplo 2. Empezando en el nodo 5. 5 50 55 25 40 2 4 20 45 1 10 25 30 3 15 Solución: (5, 3, 4, 2, 1) Coste total: 30+15+25+10+45 = 125 • Conclusión: el algoritmo no es óptimo.
Planteamiento mediante heurística voraz 2) Usando las aristas como candidatos Heurística voraz 2) Candidatos = A – Una solución será un conjunto de aristas (a 1, a 2, . . . , an) que formen un ciclo hamiltoniano, sin importar el orden. – Representación de la solución: s = (a 1, a 2, . . . , an), donde cada ai es una arista, de la forma ai = (vi, wi). – Inicialización: empezar con un grafo sin aristas. – Selección: seleccionar la arista candidata de menor coste. – Factible: una arista se puede añadir a la solución actual si no se forma un ciclo (excepto para la última arista añadida) y si los nodos unidos no tienen grado mayor que 2.
Resolución mediante heurística voraz 2) 1 50 4 30 20 5 2 55 25 40 10 25 Ejemplo 3. 45 3 15 Solución: ((1, 2), (4, 3), (2, 3), (1, 5), (4, 5)) Coste total = 10+15+20+45+50 = 140
Resultados de la heurística voraz Conclusiones: Ninguno de los dos algoritmos garantiza la solución óptima. Sin embargo, “normalmente” ambos dan soluciones buenas, próximas a la óptima. En todos los casos la eficiencia es la del algoritmo de ordenación que se use Posibles mejoras: – Buscar heurísticas mejores, más complejas. – Repetir la heurística 1 con varios orígenes. – A partir de la solución del algoritmo intentar hacer modificaciones locales para mejorar esa solución.
Pseudocódigo usando nodos como candidatos //Problema del viajante usando heurística voraz método viajante. Voraz(Grafo g) Lista ciudades por visitar=g. listade. Nodos() c=ciudadespor. Visitar. extrae. Primera() Lista= itinerario = {c} mientras ciudades por visitar no esté vacía hacer cprox= ciudad más próxima a c en ciudadespor. Visitar //elimina la más próxima de la lista a visitar // y la añade al itinerario ciudadespor. Visitar. extrae(cprox) Itinerario. añade. Al. Final(cprox) c=cprox //cprox pasa a ser la ciudad actual fhacer fmientras //vuelve al comienzo itinerario. añade. Al. Final(itinerario. primera()) fmétodo
Análisis de la Heurística voraz usando nodos como candidatos Para encontrar la solución mas óptima, éste algoritmo crece de forma exponencial con la entrada del problema, que en éste caso, sería el numero de nodos o vértices, que son las ciudades a visitar. Por lo tanto, cuanto mayor sea el numero de nodos, mayor va a ser el numero de rutas posibles y por consiguiente mayor será el esfuerzo requerido todas ellas. * Así que O(N!)
Algoritmo El algoritmo aproximado para el problema del viajante “métrico” consistirá en: • encontrar el árbol de expansión mínima del grafo - utilizando el algoritmo de Prim (O(n 2)) • y posteriormente ordenar sus nodos en preorden (O(n)) • luego su eficiencia es O(n 2) El itinerario obtenido por este algoritmo nunca será más de dos veces más largo que el que habríamos obtenido utilizando el algoritmo óptimo • d. aprox<2 d. óptima
Aplicaciones practicas El problema tiene considerables aplicaciones prácticas, aparte de las de logística de transporte, que cualquier negocio de reparto, grande o pequeño, conoce. Por ejemplo en robótica, permite resolver problemas de fabricación para minimizar el numero de desplazamientos al realizar una serie de perforaciones en una plancha o en un circuito impreso. También puede ser usado en el control optimizado de semáforos.
- Slides: 14