Apprentissage interactif de la théorie des graphes
Apprentissage interactif de la théorie des graphes
Guest User
Using app without sign in
Solveur en ligne du voyageur de commerce
Itinéraire le plus court visitant tous les sommets exactement une fois et retournant au départ
Sélectionnez un algorithme et générez les étapes pour commencer la visualisation
Le problème du voyageur de commerce (TSP) demande le tour le plus court qui visite chaque ville exactement une fois et revient au départ. C'est le problème NP-difficile le plus célèbre de l'optimisation combinatoire, simple à énoncer mais exponentiellement difficile à résoudre exactement.
La solution par programmation dynamique de Held-Karp mémorise, pour chaque sous-ensemble de villes et chaque ville d'arrivée, la façon la moins chère de visiter ce sous-ensemble. Chaque état est étendu d'une ville non visitée à la fois, donnant O(n au carré fois 2 puissance n) temps, exact mais praticable seulement pour environ 20 villes. Les instances plus grandes reposent sur des heuristiques comme le plus proche voisin et 2-opt, ou sur des métaheuristiques et des solveurs par séparation et évaluation atteignant des tours quasi optimaux pour des milliers de villes.
Le TSP modélise la planification de tournées de livraison, la préparation de commandes en entrepôt, le perçage de circuits imprimés, l'assemblage de séquences d'ADN et la planification d'observations de télescopes. Il ancre l'étude de la NP-complétude et des algorithmes d'approximation, et les recruteurs l'emploient pour sonder la compréhension des classes de complexité et de la programmation dynamique sur masques de bits.
Il n'existe pas d'algorithme exact rapide pour le problème du voyageur de commerce, la réponse pratique tient donc en deux étapes: construire vite un circuit correct, puis l'améliorer localement jusqu'à ce que plus rien ne progresse.
// Étape 1: plus proche voisin, construit un circuit en O(n^2)
circuit = [depart]
tant qu une ville reste non visitee:
suivante = ville non visitee la plus proche de circuit.derniere
circuit.ajouter(suivante)
circuit.ajouter(depart) // fermer la boucle
// Étape 2: 2-opt, supprime les croisements
repeter jusqu a absence d amelioration:
pour chaque paire d aretes (a,b) et (c,d) du circuit:
si dist(a,c) + dist(b,d) < dist(a,b) + dist(c,d):
inverser le segment entre b et c
// Exact, pour petit n: programmation dynamique de Held-Karp
dp[S][j] = min sur k dans S\{j} de dp[S\{j}][k] + dist(k, j)Le mouvement 2-opt gagne à être compris géométriquement. Si deux arêtes d'un circuit se croisent, échanger leurs extrémités et inverser le segment intermédiaire raccourcit toujours le circuit, par l'inégalité triangulaire. 2-opt est donc littéralement l'opération qui défait les nœuds d'une boucle de ficelle.
Applique le plus proche voisin puis 2-opt à quatre villes placées aux coins d'un rectangle, là où le choix glouton peut démontrablement se tromper.
Graphe d'exemple: Villes A(0,0), B(0,3), C(4,3), D(4,0). Distances: A-B 3, B-C 4, C-D 3, A-D 4, et les deux diagonales A-C et B-D valent 5.
Le circuit optimal est le périmètre du rectangle à 14, et non l'un des circuits à diagonales croisées à 18. C'est toute l'histoire des heuristiques du TSP en miniature: une passe constructive rapide s'approche du but, et la recherche locale supprime les croisements introduits par le choix glouton.
Temps: O(n^2) heuristique, O(n^2 · 2^n) exact · Espace: O(n^2) heuristique, O(n · 2^n) exact
Le plus proche voisin parcourt toutes les villes restantes à chacune des n étapes, d'où O(n au carré). Chaque passe de 2-opt teste les O(n au carré) paires d'arêtes et se répète tant qu'il y a amélioration, ce qui est rapide en pratique mais sans borne utile dans le pire cas. Held-Karp est exact et remplit une table indexée par sous-ensemble et extrémité: il y a 2 puissance n sous-ensembles fois n extrémités, et chaque entrée coûte O(n), d'où O(n au carré fois 2 puissance n) en temps et O(n fois 2 puissance n) en mémoire. C'est un mur net autour de n = 20 à 25, puisque 2 puissance 25 fois 25 dépasse déjà le milliard d'entrées. La force brute sur toutes les permutations est bien pire, en O(n factorielle).
La bonne méthode dépend presque entièrement du nombre de villes et du fait que tu exiges ou non un optimum démontrable.
| Alternative | À préférer quand | Coût |
|---|---|---|
| Programmation dynamique de Held-Karp | Moins d'une vingtaine de villes et tu veux un circuit optimal garanti. | O(n^2 · 2^n) |
| Christofides | Les distances respectent l'inégalité triangulaire et tu veux une borne prouvée: jamais pire que 1,5 fois l'optimum. | O(n^3) |
| Plus proche voisin puis 2-opt | Des centaines à des milliers de villes, et un circuit à quelques pour cent de l'optimum suffit. | O(n^2) par passe |
| Lin-Kernighan | Grandes instances où la qualité prime sur l'effort d'implémentation. L'état de l'art pratique. | environ O(n^2.2) |
| Solveurs de tournées de véhicules | Le vrai problème comporte plusieurs véhicules, des capacités ou des fenêtres horaires. Ce n'est alors pas du TSP. | variable |
Lire l'article complet: The Traveling Salesperson Problem Explained
Algorithmes associés: Chemin Hamiltonien, Répartition de Flotte (mTSP), Routage de Véhicules avec Capacité (CVRP)