Articulo de referencia

Algoritmo de Held-Karp

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 po...

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 ciudades1,2,,norte{\displaystyle 1,2,\ldots ,n}, con1{\displaystyle 1}designada 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 ciudadesS{2,,norte}{\displaystyle S\subseteq \{2,\ldots ,n\}}y cada ciudadmi1{\displaystyle e\neq 1}no está contenido enS{\displaystyle S}, el camino más corto de ida desde1{\displaystyle 1}ami{\displaystyle e}que pasa por cada ciudad enS{\displaystyle S}en algún orden (pero no a través de ninguna otra ciudad). Denotemos esta distanciagramo(S,mi){\displaystyle g(S,e)}y escribird(,v){\displaystyle d(u,v)}para la longitud del borde directo desde{\displaystyle u}av{\displaystyle v}Calcularemos los valores degramo(S,mi){\displaystyle g(S,e)}comenzando con los conjuntos más pequeñosS{\displaystyle S}y terminando con el más grande.

CuandoS{\displaystyle S}tiene dos o menos elementos, entonces calculandogramo(S,mi){\displaystyle g(S,e)}requiere examinar uno o dos posibles caminos más cortos. Por ejemplo,gramo(,mi){\displaystyle g(\emptyset ,e)}es simplemented(1,mi){\displaystyle d(1,e)}, ygramo({2},3){\displaystyle g(\{2\},3)}es solo la longitud de123{\displaystyle 1\rightarrow 2\rightarrow 3}. Asimismo,gramo({2,3},4){\displaystyle g(\{2,3\},4)}es la longitud de cualquiera de1234{\displaystyle 1\rightarrow 2\rightarrow 3\rightarrow 4}o1324{\displaystyle 1\rightarrow 3\rightarrow 2\rightarrow 4}, lo que sea más corto.

Una vezS{\displaystyle S}contiene tres o más ciudades, el número de caminos a través deS{\displaystyle S}aumenta rápidamente, pero solo es necesario examinar unos pocos caminos de este tipo para encontrar el más corto. Por ejemplo, si1234{\displaystyle 1\rightarrow 2\rightarrow 3\rightarrow 4}es más corto que1324{\displaystyle 1\rightarrow 3\rightarrow 2\rightarrow 4}, entonces12345{\displaystyle 1\rightarrow 2\rightarrow 3\rightarrow 4\rightarrow 5}debe ser más corto que13245{\displaystyle 1\rightarrow 3\rightarrow 2\rightarrow 4\rightarrow 5}y la longitud de13245{\displaystyle 1\rightarrow 3\rightarrow 2\rightarrow 4\rightarrow 5}no es un valor posible degramo({2,3,4},5){\displaystyle g(\{2,3,4\},5)}. De manera similar, si el camino más corto desde1{\displaystyle 1}a través de{2,3,4}{\displaystyle \{2,3,4\}}a5{\displaystyle 5}es14325{\displaystyle 1\rightarrow 4\rightarrow 3\rightarrow 2\rightarrow 5}y el camino más corto desde1{\displaystyle 1}a través de{2,3,4,5}{\displaystyle \{2,3,4,5\}}a6{\displaystyle 6}termina con el borde56{\displaystyle 5\rightarrow 6}, entonces todo el camino desde1{\displaystyle 1}a6{\displaystyle 6}debe ser143256{\displaystyle 1\rightarrow 4\rightarrow 3\rightarrow 2\rightarrow 5\rightarrow 6}y no ninguno de los otros cinco caminos creados al visitar{2,3,4}{\displaystyle \{2,3,4\}}en un orden diferente.

De forma más general, supongamos queS={s1,,sk}{\displaystyle S=\{s_{1},\ldots ,s_{k}\}}es un conjunto dek{\displaystyle k}ciudades. Para cada entero1ik{\displaystyle 1\leq i\leq k}, escribirSi=S{si}={s1,,si1,si+1,,sk}{\displaystyle S_{i}=S\setminus \{s_{i}\}=\{s_{1},\ldots ,s_{i-1},s_{i+1},\ldots ,s_{k}\}}para el conjunto creado al eliminarsi{\displaystyle s_{i}}deS{\displaystyle S}Entonces, si el camino más corto desde1{\displaystyle 1}a través deS{\displaystyle S}ami{\displaystyle e}tienesi{\displaystyle s_{i}}como su penúltima ciudad, entonces quitar el borde final de este camino debe dar el camino más corto desde1{\displaystyle 1}asi{\displaystyle s_{i}}a través deSi{\displaystyle S_{i}}Esto significa que solo hayk{\displaystyle k}posibles rutas más cortas desde1{\displaystyle 1}ami{\displaystyle e}a través deS{\displaystyle S}, uno por cada posible penúltima ciudadsi{\displaystyle s_{i}}con longitudgramo(Si,si)+d(si,mi){\displaystyle g(S_{i},s_{i})+d(s_{i},e)}, ygramo(S,mi)=min1ikgramo(Si,si)+d(si,mi){\displaystyle g(S,e)=\min _{1\leq i\leq k}g(S_{i},s_{i})+d(s_{i},e)}.

Esta etapa del algoritmo finaliza cuandogramo({2,,i1,i+1,,norte},i){\displaystyle g(\{2,\ldots ,i-1,i+1,\ldots ,n\},i)}es conocido para cada entero2inorte{\displaystyle 2\leq i\leq n}, dando la distancia más corta desde la ciudad1{\displaystyle 1}a la ciudadi{\displaystyle i}que pasa por todas las demás ciudades. La segunda etapa, mucho más corta, suma estas distancias a las longitudes de los bordes.d(i,1){\displaystyle d(i,1)}darnorte1{\displaystyle n-1}posibles 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 agramo(S,mi){\displaystyle g(S,e)}la etiqueta de la penúltima ciudad en el camino desde1{\displaystyle 1}ami{\displaystyle e}a través deS{\displaystyle S}, aumentando los requisitos de espacio solo en un factor constante.

Complejidad algorítmica

El algoritmo de Held-Karp tiene una complejidad temporal exponencial.Θ(2nortenorte2){\displaystyle \Theta (2^{n}n^{2})}significativamente mejor que el rendimiento superexponencialΘ(norte¡){\displaystyle \Theta (n!)}de un algoritmo de fuerza bruta. Sin embargo, Held-Karp requiereΘ(norte2norte){\displaystyle \Theta (n2^{n})}espacio para almacenar todos los valores calculados de la funcióngramo(S,mi){\displaystyle g(S,e)}, mientras que la fuerza bruta solo necesitaΘ(norte2){\displaystyle \Theta (n^{2})}espacio para almacenar el gráfico en sí.

Tiempo

Calcular un valor degramo(S,mi){\displaystyle g(S,e)}por unk{\displaystyle k}subconjunto de elementosS{\displaystyle S}de{2,,norte}{\displaystyle \{2,\ldots ,n\}}requiere encontrar el más corto dek{\displaystyle k}posibles rutas, cada una obtenida al sumar un valor conocido degramo{\displaystyle g}y una longitud de arista del grafo original; es decir, requiere un tiempo proporcional ak{\displaystyle k}. Hay(norte1k){\textstyle {\binom {n-1}{k}}}k{\displaystyle k}subconjuntos de elementos de{2,,norte}{\displaystyle \{2,\ldots ,n\}}; y cada subconjunto danortek1{\displaystyle nk-1}posibles valores demi{\displaystyle e}. Calculando todos los valores degramo(S,mi){\displaystyle g(S,e)}dónde|S|=k{\displaystyle |S|=k}por lo tanto requiere tiempok(nortek1)(norte1k)=(norte1)(norte2)(norte3k1){\textstyle k(nk-1){\binom {n-1}{k}}=(n-1)(n-2){\binom {n-3}{k-1}}}, para un tiempo total en todos los tamaños de subconjunto(norte1)(norte2)k=1norte2(norte3k1)=(norte1)(norte2)2norte3=Θ(norte22norte){\textstyle (n-1)(n-2)\sum _ {k=1}^{n-2}{\binom {n-3}{k-1}}=(n-1)(n-2)2^{n-3}=\Theta (n^{2}2^{n})}. La segunda etapa del algoritmo, encontrar un ciclo completo desdenorte1{\displaystyle n-1}candidatos, tomaΘ(norte){\displaystyle \Theta (n)}tiempo y no afecta al rendimiento asintótico.

Para grafos no dirigidos , el algoritmo puede detenerse pronto después de lak=norte12{\textstyle k=\lfloor {\frac {n-1}{2}}\rfloor }paso y encontrar el mínimogramo(S,mi)+gramo(Sdo{1,mi},mi){\textstyle g(S,e)+g(S^{c}\setminus \{1,e\},e)}por cada{(S,mi):|S|=norte12,miSdo{1}}{\textstyle \{(S,e):|S|=\lfloor {\frac {n-1}{2}}\rfloor ,e\in S^{c}\setminus \{1\}\}}, dóndeSdo{\textstyle S^{c}}es el conjunto complementario deS{\textstyle S}Esto es análogo a una búsqueda bidireccional que comienza en1{\textstyle 1}y encontrándonos a mitad de camino.mi{\textstyle e}Sin embargo, se trata de una mejora constante y no afecta al rendimiento asintótico.

Espacio

Almacenar todos los valores degramo(S,mi){\displaystyle g(S,e)}para subconjuntos de tamañok{\displaystyle k}requiere mantener(nortek1)(norte1k)=(norte1)(norte2k){\textstyle (nk-1){\binom {n-1}{k}}=(n-1){\binom {n-2}{k}}}valores. Una tabla completa de valores degramo(S,mi){\displaystyle g(S,e)}por lo tanto requiere espaciok=0norte2(norte1)(norte2k)=(norte1)2norte=Θ(norte2norte){\textstyle \sum _{k=0}^{n-2}(n-1){\binom {n-2}{k}}=(n-1)2^{n}=\Theta (n2^{n})}Esto supone quenorte{\textstyle n}es suficientemente pequeño como para queS{\textstyle S}se 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álculogramo(S,mi){\displaystyle g(S,e)}por unS{\displaystyle S}de tamañok{\displaystyle k}requiere únicamente valores degramo{\displaystyle g}para subconjuntos de tamañok1{\displaystyle k-1}. Conservando solo el(norte1)[(norte2k1)+(norte2k)]{\textstyle (n-1)\left[{\binom {n-2}{k-1}}+{\binom {n-2}{k}}\right]}valores degramo(S,mi){\displaystyle g(S,e)}dóndeS{\displaystyle S}tiene tamañok1{\displaystyle k-1}ok{\displaystyle k}reduce los requisitos máximos de espacio del algoritmo, alcanzados cuandok=norte2{\textstyle k=\left\lfloor {\frac {n}{2}}\right\rfloor }, aΘ(norte2norte){\displaystyle \Theta ({\sqrt {n}}2^{n})}.

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 function

Referencias

  1. 'Tratamiento de programación dinámica del problema del viajante', Richard Bellman, Journal of Assoc. Computing Mach. 9. 1962.
  2. '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
  3. "Programación dinámica" (PDF) . Enero de 2020. Archivado del original (PDF) el 8 de febrero de 2015.