El algoritmo de Held-Karp , también llamado algoritmo de Bellman-Held-Karp , es un algoritmo de programación dinámica propuesto en 1962 independientemente por Bellman [ 1 ] y por Held y Karp [ 2 ] para resolver el problema del viajante (TSP), en el que la entrada es una matriz de distancias entre un conjunto de ciudades, y el objetivo es encontrar un recorrido de longitud mínima que visite cada ciudad exactamente una vez antes de regresar al punto de partida. Encuentra la solución exacta a este problema, y a varios problemas relacionados, incluido el problema del ciclo hamiltoniano , en tiempo exponencial .
Descripción y motivación del algoritmo
Numera las ciudades, condesignada arbitrariamente como una ciudad "inicial" (ya que la solución al TSP es un ciclo hamiltoniano, la elección de la ciudad inicial no importa). El algoritmo de Held-Karp comienza calculando, para cada conjunto de ciudadesy cada ciudadno está contenido en, el camino más corto de ida desdeaque pasa por cada ciudad enen algún orden (pero no a través de ninguna otra ciudad). Denotemos esta distanciay escribirpara la longitud del borde directo desdeaCalcularemos los valores decomenzando con los conjuntos más pequeñosy terminando con el más grande.
Cuandotiene dos o menos elementos, entonces calculandorequiere examinar uno o dos posibles caminos más cortos. Por ejemplo,es simplemente, yes solo la longitud de. Asimismo,es la longitud de cualquiera deo, lo que sea más corto.
Una vezcontiene tres o más ciudades, el número de caminos a través deaumenta rápidamente, pero solo es necesario examinar unos pocos caminos de este tipo para encontrar el más corto. Por ejemplo, sies más corto que, entoncesdebe ser más corto quey la longitud deno es un valor posible de. De manera similar, si el camino más corto desdea través deaesy el camino más corto desdea través deatermina con el borde, entonces todo el camino desdeadebe sery no ninguno de los otros cinco caminos creados al visitaren un orden diferente.
De forma más general, supongamos quees un conjunto deciudades. Para cada entero, escribirpara el conjunto creado al eliminardeEntonces, si el camino más corto desdea través deatienecomo su penúltima ciudad, entonces quitar el borde final de este camino debe dar el camino más corto desdeaa través deEsto significa que solo hayposibles rutas más cortas desdeaa través de, uno por cada posible penúltima ciudadcon longitud, y.
Esta etapa del algoritmo finaliza cuandoes conocido para cada entero, dando la distancia más corta desde la ciudada la ciudadque pasa por todas las demás ciudades. La segunda etapa, mucho más corta, suma estas distancias a las longitudes de los bordes.darposibles ciclos más cortos, y luego encuentra el más corto.
Finalmente, el camino más corto en sí (y no solo su longitud) puede reconstruirse almacenándolo junto ala etiqueta de la penúltima ciudad en el camino desdeaa través de, aumentando los requisitos de espacio solo en un factor constante.
Complejidad algorítmica
El algoritmo de Held-Karp tiene una complejidad temporal exponencial.significativamente mejor que el rendimiento superexponencialde un algoritmo de fuerza bruta. Sin embargo, Held-Karp requiereespacio para almacenar todos los valores calculados de la función, mientras que la fuerza bruta solo necesitaespacio para almacenar el gráfico en sí.
Tiempo
Calcular un valor depor unsubconjunto de elementosderequiere encontrar el más corto deposibles rutas, cada una obtenida al sumar un valor conocido dey una longitud de arista del grafo original; es decir, requiere un tiempo proporcional a. Haysubconjuntos de elementos de; y cada subconjunto daposibles valores de. Calculando todos los valores dedóndepor lo tanto requiere tiempo, para un tiempo total en todos los tamaños de subconjunto. La segunda etapa del algoritmo, encontrar un ciclo completo desdecandidatos, tomatiempo y no afecta al rendimiento asintótico.
Para grafos no dirigidos , el algoritmo puede detenerse pronto después de lapaso y encontrar el mínimopor cada, dóndees el conjunto complementario deEsto es análogo a una búsqueda bidireccional que comienza eny encontrándonos a mitad de camino.Sin embargo, se trata de una mejora constante y no afecta al rendimiento asintótico.
Espacio
Almacenar todos los valores depara subconjuntos de tamañorequiere mantenervalores. Una tabla completa de valores depor lo tanto requiere espacioEsto supone quees suficientemente pequeño como para quese puede almacenar como una máscara de bits de un múltiplo constante de palabras de máquina , en lugar de una k-tupla explícita.
Si solo se necesita la longitud del ciclo más corto, y no el ciclo en sí, entonces la complejidad espacial se puede mejorar un poco al observar que el cálculopor unde tamañorequiere únicamente valores depara subconjuntos de tamaño. Conservando solo elvalores dedóndetiene tamañooreduce los requisitos máximos de espacio del algoritmo, alcanzados cuando, a.
Pseudocódigo
Fuente: [ 3 ]
El algoritmo de función TSP (G, n) es para k := 2 a n hacer g({k}, k) := d(1, k) fin parapara s := 2 a n−1 hacer para todo S ⊆ {2, ..., n}, |S| = s hacer para todo k ∈ S hacer g(S, k) := min m≠k,m∈S [g(S\{k}, m) + d(m, k)] fin para fin para fin para opt := min k≠1 [g({2, 3, ..., n}, k) + d(k, 1)] return (opt) end functionReferencias
- ↑ 'Tratamiento de programación dinámica del problema del viajante', Richard Bellman, Journal of Assoc. Computing Mach. 9. 1962.
- ↑ 'Un enfoque de programación dinámica para problemas de secuenciación', Michael Held y Richard M. Karp, Journal for the Society for Industrial and Applied Mathematics 1:10. 1962
- ↑ "Programación dinámica" (PDF) . Enero de 2020. Archivado del original (PDF) el 8 de febrero de 2015.
- Programación dinámica
- El problema del viajante