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.