Une question récente a discuté de l'algorithme de programmation dynamique désormais classique pour TSP, dû indépendamment à Bellman et Held-Karp . Il est universellement rapporté que l' algorithme s'exécute en temps . Cependant, comme l'un de mes étudiants l'a récemment souligné, ce temps d'exécution peut nécessiter un modèle de calcul excessivement puissant.
Voici une brève description de l'algorithme. L'entrée consiste en un graphe orienté avec sommets et une fonction de longueur non négative . Pour tout sommet et , et tout sous-ensemble de sommets qui exclut et , soit la longueur du chemin hamiltonien le plus court de à dans le sous-graphique induit . L'algorithme de Bellman-Held-Karp est basé sur la récurrence suivante (ou comme les économistes et les théoriciens du contrôle aiment l'appeler «l'équation de Bellman»):ℓ : E → R + s t X s t L ( s , X , t ) s t G [ X ∪ { s , t } ]
Pour tout sommet , la durée de la visite optimale du vendeur itinérant est . Étant donné que le premier paramètre est constant dans tous les appels récursifs, il existe différents sous-problèmes, et chaque sous-problème dépend d'au plus autres. Ainsi, l'algorithme de programmation dynamique s'exécute en temps .
Ou est-ce?!
Le modèle de RAM à nombres entiers standard permet la manipulation en temps constant d'entiers avec des bits , mais au moins pour les opérations arithmétiques et logiques , les entiers plus grands doivent être divisés en morceaux de taille mot. (Sinon, des choses étranges peuvent se produire.) N'est-ce pas également le cas pour l'accès à des adresses mémoire plus longues? Si un algorithme utilise un espace superpolynomial, est-il raisonnable de supposer que les accès à la mémoire ne nécessitent qu'un temps constant?
Pour l'algorithme de Bellman-Held-Karp en particulier, l'algorithme doit transformer la description du sous-ensemble en description du sous-ensemble , pour chaque , afin d'accéder à la table de mémorisation. Si les sous-ensembles sont représentés par des entiers, ces entiers nécessitent bits et ne peuvent donc pas être manipulés en temps constant; s'ils ne sont pas représentés par des nombres entiers, leur représentation ne peut pas être utilisée directement comme index dans la table de mémorisation.
Donc: Quel est le temps d'exécution asymptotique réel de l'algorithme Bellman-Held-Karp?
Réponses:
C'est moins une réponse mathématique qu'une réponse philosophique, mais je préfère penser à un modèle RAM qui permet une manipulation en temps constant d'entiers avec un nombre B de bits inconnu mais au moins aussi grand que , où S est la quantité d'espace requise par l'algorithme. Parce que, si les entiers n'étaient pas si gros, comment pourriez-vous même adresser votre mémoire? Pour les algorithmes polynomiaux de temps et d'espace, c'est la même chose que les bits O (log n), mais pour les algorithmes d'espace exponentiels, cela évite le problème.Journal2S
Bien sûr, si S dépasse la quantité de mémoire que vous avez réellement, votre algorithme ne fonctionnera pas du tout. Ou, il s'exécutera en paginant des informations dans et hors de la mémoire et vous devriez utiliser un modèle de hiérarchie de mémoire au lieu du modèle de RAM.
la source
Il y a une discussion de cette question dans le livre récent de Fedor V. Fomin et Dieter Kratsch " Exact Exponential Algorithms " où ils spécifient le temps d'exécution dans le modèle RAM à coût unitaire et le modèle RAM à coût journalier ( - la distance maximale entre les villes et f ( n ) = O ∗ ( g ( n ) ) si f ( n ) = O ( g ( n ) p o l y ( n ) ) ):W F( n ) = O∗( g( n ) ) F( n ) = O ( g( n ) p o l y( n ) )
la source