Addendum ci-dessous, clarifiant les termes k(k−1) :
Donc, si vous examinez les termes dans l'expression, vous pouvez imaginer (par analogie) que le terme est une énumération de toutes les chaînes binaires contenant 1 qui ont un 1 en première position. En d'autres termes, nous laissons chaque position dans la chaîne binaire représenter le choix de savoir si l'une donnée des villes du problème se trouve dans le sous-ensemble exact que nous considérons à l'époque. Ainsi, pour 5 villes, 10101 correspond au sous-ensemble {1,3,5}. kn(n−1k)kn
Ainsi, pour calculer à travers tous les sous-ensembles de {1, ..., }, nous comptons simplement à travers chaque sous-ensemble binaire (c'est-à-dire compter à travers des chaînes binaires) de taille = 2 (c'est-à-dire des chaînes binaires de taille qui contiennent deux 1), puis taille = 3, puis taille = 4, ... puis taille = n. (Notez que le sous-ensemble size = 1 ne doit contenir que la première ville, et donc il n'est pas pertinent de calculer sa distance partielle, car la distance de 1 -> toutes les autres villes du sous-ensemble -> 1 est exactement 0.)nnn
Pour chaque sous-ensemble avec villes, nous devons considérer jusqu'à chemins partiels optimaux pour les candidats. Plus précisément, le chemin optimal optimal pourrait traverser le sous-ensemble donné et aboutir à n'importe laquelle des villes, à l'exclusion de la première ville. Ensuite, pour chacun de ces sous-chemins candidats, nous calculons le tour optimal jusqu'à ce point comme le minimum de l'un des sous-chemins précédents, size = plus la distance de la ville terminale pour ce sous-chemin vers le ville terminale pour le sous-chemin candidat actuel. Cela donne telles comparaisons que nous devons faire. L'écart entre mon terme et lek - 1 k - 1 k - 1 ( k - 1 ) ( k - 2 ) ( k - 1 ) ( k - 2 )kk−1k−1k−1(k−1)(k−2)(k−1)(k−2)kk(k−1)terme dans l'analyse liée est une différence de notation (je résumerais sur une plage différente, étant donné ma définition de qu'ils ne l'ont fait). À tout le moins, cependant, il devrait illustrer la complexité d'ordre quadratique de ce terme.k
Comme c'est intéressant - je viens de terminer de coder cet algorithme exact en C ++ il y a quelques minutes. (Alors pardonnez la tangente de la théorie pure à une petite discussion pratique. :))
Cela coûte temps et espace - au moins sous mon implémentation. En pratique, cependant, lorsque vos besoins d'espace augmentent aussi rapidement, ils deviennent beaucoup plus douloureux que les besoins en temps. Par exemple, sur mon PC (avec 4 Go de RAM), je peux résoudre des instances avec jusqu'à 24 villes - plus que cela, et je manque de mémoire.O ( 2 n n )O(2nn2)O(2nn)
Bien sûr, je pourrais juste être un mauvais programmeur, et vous pourriez peut-être faire mieux que moi dans la pratique. :)
Edit: Un peu plus de détails sur un détail de votre question: le terme vient du fait que vous devez, dans le pire des cas, calculer la distance optimale partielle à partir des sous-ensembles précédents (il y a au plus d'entre eux; notez que est additionné de dans l'analyse que vous avez liée) à l'analyse en cours. Cela nécessite, là encore dans le pire des cas, des comparaisons avec des sous-ensembles de taille pour un total de .n k n O ( k ) k - 1 O ( k 2 )k(k−1)nknO(k)k−1O(k2)
De plus, si mon explication n'était pas assez claire, voici quelques belles notes de cours de Vazirani ( PDF ). Faites défiler jusqu'à P. 188 pour une discussion sur le TSP, y compris une analyse de Held-Karp.
Note principale
Il est important de noter que nous calculons et stockons non pas
"la distance du chemin optimal pour
combination of k cities
"mais
"la distance du chemin optimal pour
combination of k cities
ET pourend-point city from this combination
".Le comprendre aidera à la signification des deux premiers multiplicateurs dans la formule suivante.
Première phase
Le nombre d'opérations dans la première phase est:∑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
L'exposant manquant dans la somme signifiek=n−1
(n−1n−2)⋅(n−2)⋅1 n−1
for all k>=2 that is valid for binomial coefficient
. Ainsi, le dernier terme de somme non nul valide sera pour Cela signifie que notre somme ne capture pas les derniers choix de la ville pour se connecter à la première ville. Il y a villes pour se connecter à la première ville. Enfin, nous ajouterons ce terme à la somme.Laisser transformer la formule à la forme que vous fournissez c'est aussi détenus Karp la page Wikipedia .
Seconde phase
La deuxième phase restaure le chemin optimal par les marques que nous avons faites dans la première phase simultanément avec le calcul des distances.
Pour chaque chemin optimal "pour
combination of k cities
ET pourend-point city from this combination
", nous avons enregistré l'avant-dernière ville.Pour revenir en arrière sur le chemin optimal, nous devons demander à une structure de données de renvoyer l'avant-dernière ville "pour
∑k>=2n−1k=(n)(n−1)2−1
combination of k cities
ET pourend-point city from this combination
". Cette structure de données doit donc ressembler à quelque choseMap<combination of k cities, Map<last city, second-to-last city>>
. Comme index decombination of k cities
nous pouvons utiliser, par exemplebinary_string[city id]=1 if city id is in combination
,. Nous devons donc examiner tous les éléments decombination of k cities
pour identifier la combinaison et indexer notre structure de données. Cela nous donne le nombre d'opérations pour la deuxième phase:la source