Le problème du voyageur de commerce
Temps de lecture10 minEn bref
Résumé de l’article
Dans cet article, vous découvrirez un problème célèbre en informatique, appelé le « problème du voyageur de commerce » (ou « Traveling Salesperson Problem », TSP). Ce problème consiste à déterminer dans quel ordre parcourir tous les sommets d’un graphe complet en minimisant la distance totale. Ce problème a de nombreuses applications pratiques… mais il est difficile à résoudre !
Points clés à retenir
-
Le TSP est le problème de trouver le chemin le plus court qui passe par tous les sommets d’un graphe.
-
Il est connu pour être un problème très difficile : sa version de décision est NP-complète.
-
Le TSP peut être utilisé pour prouver que d’autres problèmes sont au moins aussi complexes, grâce à une technique appelée « réduction ».
Contenu de l’article
Vidéo
Veuillez consulter la vidéo ci-dessous (en anglais, affichez les sous-titres si besoin). Nous fournissons également une traduction du contenu de la vidéo juste après, si vous préférez.
Information
Combien de solutions possibles ?
Dans PyRat, le rat part d’une case fixée, et doit ramasser $k$ morceaux de fromage, sans revenir à son point de départ. Une solution est donc un ordre dans lequel ramasser les morceaux de fromage, et il y a $k!$ ordres possibles : $k$ choix pour le premier morceau, $k - 1$ pour le deuxième, etc.
Un algorithme qui essaie tous ces ordres doit donc en examiner :
| Morceaux de fromage $k$ | Nombre d’ordres $k!$ | Temps à $10^9$ ordres par seconde |
|---|---|---|
| 5 | 120 | 120 ns |
| 10 | 3 628 800 | 3,6 ms |
| 15 | $1,3 \cdot 10^{12}$ | 22 min |
| 20 | $2,4 \cdot 10^{18}$ | 77 ans |
| 21 (partie par défaut) | $5,1 \cdot 10^{19}$ | 1600 ans |
Dans la variante où l’on revient au point de départ, un tour ne dépend pas du sommet par lequel on le commence, ni du sens dans lequel on le parcourt : il y a alors $\frac{(n-1)!}{2}$ tours différents pour $n$ villes. Cela ne change pas grand-chose à la croissance du nombre de solutions.
Pour aller plus loin
Les propriétés du méta-graphe
Son coût de construction
Le méta-graphe a $k + 1$ sommets (la position de départ et les morceaux de fromage). Pour calculer les poids de ses arêtes, il suffit de lancer un algorithme de Dijkstra depuis chacun de ces sommets, soit $k + 1$ parcours. Dans un labyrinthe à $n$ cases, chacun coûte $O(n \cdot log(n))$ (voir l’article sur l’algorithme de Dijkstra), donc la construction du méta-graphe coûte $O(k \cdot n \cdot log(n))$.
C’est une complexité polynomiale, négligeable devant celle de la résolution du TSP sur le méta-graphe. C’est d’ailleurs ce qui fait de cette transformation une réduction au sens de la vidéo.
L’inégalité triangulaire
Les poids du méta-graphe vérifient l’inégalité triangulaire : pour tous sommets $a$, $b$ et $c$ du méta-graphe, on a $d(a, c) \leq d(a, b) + d(b, c)$. Autrement dit, faire un détour par $b$ ne raccourcit jamais le trajet de $a$ à $c$.
Preuve
Cette propriété n’est pas qu’une curiosité. Le TSP sur des graphes qui la vérifient, appelé TSP métrique, reste NP-complet, mais il admet des algorithmes d’approximation avec des garanties : par exemple, l’algorithme de Christofides trouve un tour au plus 1,5 fois plus long que le tour optimal. C’est aussi elle qui justifie l’intuition, exploitée dans l’activité pratique, qu’il vaut mieux ramasser les morceaux de fromage proches les uns des autres à la suite, plutôt que de faire des allers-retours.
Un algorithme exact plus rapide : Held-Karp
Essayer tous les ordres est très coûteux, car de nombreux calculs sont refaits. Par exemple, les ordres qui commencent par $(A, B, C)$ et par $(B, A, C)$ continuent de la même manière à partir de $C$ : seul compte le meilleur des deux débuts. L’algorithme de Held-Karp (1962) exploite cette remarque grâce à la programmation dynamique vue en cours d’algorithmique.
Pour chaque ensemble $S$ de morceaux de fromage et chaque morceau $v$ de $S$, on calcule $best(S, v)$, la longueur d’un plus court chemin qui part de la position de départ $s$, ramasse exactement les morceaux de $S$, et termine par $v$ :
- Si $S$ ne contient que $v$, alors $best(\{v\}, v) = d(s, v)$.
- Sinon, l’avant-dernier morceau $u$ est un autre élément de $S$, et $best(S, v) = \min\limits_{u \in S \setminus \{v\}} \left( best(S \setminus \{v\}, u) + d(u, v) \right)$.
On calcule ces valeurs par taille croissante de $S$, et la longueur du meilleur chemin est le minimum des $best(S, v)$ quand $S$ contient tous les morceaux de fromage. Voici une implémentation, qui prend en entrée les distances du méta-graphe :
Il y a $2^k$ ensembles $S$, et pour chacun, $k$ valeurs à calculer en considérant $k$ avant-derniers possibles : la complexité est $O(k^2 \cdot 2^k)$ en temps, et $O(k \cdot 2^k)$ en mémoire. C’est toujours exponentiel, mais bien plus petit que $k!$. Voici les temps mesurés en Python, sur des méta-graphes construits à partir de labyrinthes PyRat :
| Morceaux de fromage $k$ | Essayer tous les ordres | Held-Karp | Mémoire utilisée par Held-Karp |
|---|---|---|---|
| 8 | 19 ms | 0,7 ms | négligeable |
| 10 | 1,9 s | 5 ms | négligeable |
| 12 | environ 4 min (estimé) | 26 ms | négligeable |
| 14 | environ 12 h (estimé) | 0,14 s | quelques dizaines de Mo |
| 16 | plusieurs mois (estimé) | 0,8 s | 185 Mo |
| 18 | plus d’un siècle (estimé) | 4,8 s | 670 Mo |
Held-Karp trouve la solution optimale en quelques secondes là où essayer tous les ordres prendrait plus d’un siècle. Mais sa consommation de mémoire, multipliée par environ 4 tous les 2 morceaux de fromage, devient vite la vraie limite : avec les 21 morceaux de fromage d’une partie par défaut, il faudrait plusieurs gigaoctets. Le TSP reste un problème difficile, et c’est pourquoi les séances suivantes s’intéressent à des algorithmes qui renoncent à trouver la solution optimale.
Pour aller encore plus loin
-
Si vous voulez plus de détails sur le TSP.
-
Comme mentionné, le TSP a de nombreuses applications pratiques. Voici quelques exemples supplémentaires.
-
Plus de détails sur l’algorithme de Held-Karp, et sur ses variantes.
-
Un solveur exact qui combine de nombreuses techniques, et a résolu des instances de dizaines de milliers de villes.















