Adición a continuación, aclarando los términos k(k−1) :
Entonces, si examina los términos en la expresión, puede imaginar (como analogía) el término es una enumeración de todas las cadenas binarias que contienen 1 que tienen un 1 en la primera posición. En otras palabras, dejamos que cada posición en la cadena binaria represente la elección de si una de las ciudades del problema está en el subconjunto exacto que estamos considerando en ese momento. Entonces, para 5 ciudades, 10101 corresponde al subconjunto {1,3,5}.(n−1k)kn
Por lo tanto, para calcular en todos los subconjuntos de {1, ..., }, simplemente contamos a través de cada subconjunto binario (es decir, contamos a través de cadenas binarias) de tamaño = 2 (es decir, cadenas binarias de tamaño que contienen dos 1), luego tamaño = 3, luego tamaño = 4, ... luego tamaño = n. (Tenga en cuenta que el subconjunto size = 1 debe contener solo la primera ciudad y, por lo tanto, es irrelevante calcular su distancia parcial, ya que la distancia desde 1 -> todas las demás ciudades del subconjunto -> 1 es exactamente 0).nn
En cada subconjunto con ciudades, tenemos que considerar hasta candidatos, rutas parciales óptimas. Específicamente, la ruta total óptima podría atravesar el subconjunto dado y terminar en cualquiera de las ciudades , excluyendo la primera ciudad. Luego, para cada subruta candidata, calculamos el recorrido óptimo hasta ese punto como el mínimo de cualquiera de las subrutas anteriores, size = más la distancia desde la ciudad terminal para esa subruta hasta el ciudad terminal para la actual ruta secundaria candidata. Esto le da a las comparaciones que debemos hacer. La discrepancia entre mi término y elkk−1k−1k−1(k−1)(k−2)(k−1)(k−2)k(k−1)El término en el análisis vinculado es una diferencia de notación (sumaría en un rango diferente, dada mi definición de de lo que hicieron). Por lo menos, sin embargo, debería ilustrar la complejidad de orden cuadrático de ese término.k
Qué interesante: acabo de terminar de codificar este algoritmo exacto en C ++ hace unos minutos. (Así que perdona la tangente de la teoría pura a una pequeña discusión práctica. :))
Cuesta tiempo y espacio, al menos en mi implementación. Sin embargo, en términos prácticos, cuando sus requisitos de espacio crecen tan rápido, se vuelven mucho más dolorosos que los requisitos de tiempo. Por ejemplo, en mi PC (con 4 GB de RAM), puedo resolver instancias con hasta 24 ciudades, algo más que eso, y me quedo sin memoria.O(2nn2)O(2nn)
Por supuesto, podría ser un mal programador, y podrías hacerlo mejor que yo en la práctica. :)
Editar: Un poco más de detalles sobre un detalle de su pregunta: el término proviene del hecho de que, en el peor de los casos, debe calcular la distancia parcial y óptima de los subconjuntos anteriores (hay como máximo de ellos; tenga en cuenta que se suma sobre en el análisis que vinculó) al actual. Esto requiere, nuevamente en el peor de los casos, comparaciones de con subconjuntos de tamaño para un total de .k(k−1)nknO(k)k−1O(k2)
Además, si mi explicación no fue lo suficientemente clara, aquí hay algunas notas agradables de Vazirani ( PDF ). Desplácese hacia abajo hasta P. 188 para una discusión sobre TSP, incluido un análisis de Held-Karp.
Nota principal
Es importante tener en cuenta que calcular y almacenar no
"distancia de la ruta óptima para
combination of k cities
"pero
"a distancia de la ruta óptima para
combination of k cities
Y paraend-point city from this combination
".Comprenderlo ayudará con el significado de los dos primeros multiplicadores en la siguiente fórmula.
Primera fase
El número de operaciones en la primera fase es:∑k>=2(n−1k−1)choose city combinationof size = k−1⋅(k−1)choose city to be the lastfrom k−1 citiesin chosen combination⋅((n−1)−(k−1))choose citythat is not in chosen combinationto add to path
Falta superíndice en suma significak=n−1
(n−1n−2)⋅(n−2)⋅1 n−1
for all k>=2 that is valid for binomial coefficient
. Entonces, el último término de suma no nulo válido será para Esto significa que nuestra suma no captura las últimas opciones de ciudad para conectar a la primera ciudad. Hay ciudades para conectarse a la primera ciudad. Así que finalmente agregaremos este término a la suma.Deje transformar la fórmula en el formulario que proporcione y que también se encuentre en la página de Held-Karp Wikipedia .
Segunda fase
La segunda fase está restaurando el camino óptimo mediante las marcas que hemos realizado en la primera fase simultáneamente con las distancias de cálculo.
Para cada ruta óptima "para
combination of k cities
Y paraend-point city from this combination
" hemos guardado la penúltima ciudad.Para dar marcha atrás a la ruta óptima, necesitamos pedir alguna estructura de datos para devolver la penúltima ciudad "para
∑k>=2n−1k=(n)(n−1)2−1
combination of k cities
Y paraend-point city from this combination
". Entonces esta estructura de datos debe ser algo asíMap<combination of k cities, Map<last city, second-to-last city>>
. Como índice decombination of k cities
podemos usar, por ejemplobinary_string[city id]=1 if city id is in combination
,. Por lo tanto, debemos analizar todos los elementoscombination of k cities
para identificar la combinación e indexar nuestra estructura de datos. Esto nos da el número de operaciones para la segunda fase:fuente