# Problème du voyageur de commerce

En informatique théorique, le problème du voyageur de commerce, ou problème du commis voyageur, est un problème d'optimisation qui consiste à déterminer, étant donné un ensemble de villes, le plus court circuit passant par chaque ville une seule fois.
C'est un problème algorithmique célèbre, qui a donné lieu à de nombreuses recherches et qui est souvent utilisé comme introduction à l'algorithmique ou à la théorie de la complexité. Il présente de nombreuses applications, que ce soit en planification, en logistique ou dans des domaines éloignés, comme la génétique, les gènes étant les villes et la similarité la distance.

## Description

Étant donné n villes et leurs distances par paire, il s'agit de déterminer le chemin le plus petit qui passe exactement une fois par chaque ville et revienne à la ville de départ. On modélise le problème du voyageur de commerce comme un problème sur un graphe non orienté pondéré. Les villes sont les sommets du graphe. Le voyageur emprunte les arêtes du graphe. Le coût d'une arête entre deux sommets est la distance entre les deux villes correspondantes. Souvent, on considère un graphe complet, i.e. il y a une arête entre toutes paires de sommets : $G=(V,E,\omega )$ avec $V$ un ensemble de sommets, $E=V\times V$ un ensemble d'arêtes, et $\omega :E\rightarrow \mathbb {R} ^{+}$ une fonction de coût sur les arêtes. Le problème est de trouver le plus court cycle hamiltonien dans le graphe G.

### Exemple

On considère la liste des villes A, B, C, D et les distances données par le dessin ci-dessous à gauche.
Un premier chemin qui part de A, revient en A et qui visite toutes les villes est ABDCA.
Un chemin plus court est ACBDA. Ce dernier est optimal.
Attention, les distances dans l'exemple ne respectent pas l'inégalité triangulaire : d(A,B) < d(A,D) + d(D,B).
| Instance du problème du voyageur de commerce. | Le chemin ABDCA de longueur 4+2+5+3 = 14 km. | Le chemin ACBDA est le chemin le plus court qui part de A, revient à A et passe par toutes les villes. Il est de longueur 3+1+2+1 = 7 km. Le chemin ADBCA propose également une longueur de 7km. |

### Explosion combinatoire

Nombre de chemins candidats en fonction du nombre de villes :
| Nombre de villes $n$ | Nombre de chemins candidats ${\frac {1}{2}}(n-1)!$ |
| 3 | 1 |
| 4 | 3 |
| 5 | 12 |
| 6 | 60 |
| 7 | 360 |
| 8 | 2 520 |
| 9 | 20 160 |
| 10 | 181 440 |
| 15 | 43 589 145 600 |
| 20 | 6,082 × 10$^{16}$ |
| 71 | 5,989 × 10$^{99}$ |
Ce problème est plus compliqué qu'il n'y paraît ; on ne connaît pas de méthode de résolution permettant d'obtenir des solutions exactes en un temps raisonnable pour de grandes instances (grand nombre de villes) du problème. Pour ces grandes instances, on devra donc souvent se contenter de solutions approchées, car on se retrouve face à une explosion combinatoire.
Pour un ensemble de $n$ points, il existe au total $n!$ chemins possibles (factorielle de $n$). Le point de départ ne changeant pas la longueur du chemin, on peut choisir celui-ci de façon arbitraire, on a ainsi $(n-1)!$ chemins différents. Enfin, chaque chemin pouvant être parcouru dans deux sens et les deux possibilités ayant la même longueur, on peut diviser ce nombre par deux.
Premier exemple : si on nomme les points, $a,b,c,d$, les chemins abcd et dcba, cdab et badc, adcb et bcda, cbad et dabc ont tous la même longueur ; seul le point de départ et le sens de parcours changent. On a donc ${\frac {(n-1)!}{2}}$ chemins candidats à considérer.
Deuxième exemple : pour 71 villes, le nombre de chemins candidats est d'environ 6 × 10$^{99}$, ce qui est bien supérieur au nombre d'atomes dans l'univers connu.

## Variantes
### Orientation

Rien n'interdit au graphe donné en entrée d'être orienté.
Dans ce cas, on considère qu'un chemin existe dans un sens mais pas dans l'autre.
Exemples : route à sens unique, lien "following" (suivre) dans un réseau social ...

### Asymétrie

On parle parfois de problème symétrique ou asymétrique.
* Problème du voyageur de commerce symétrique : Étant donné un ensemble de $n$ nœuds et de distances pour chaque paire de nœuds, trouver un cycle de longueur minimale qui visite chaque nœud exactement une fois. Pour $i$ et $j$ deux nœuds d'une arête, la distance de $i$ à $j$ est la même que celle de $j$ à $i$.
* Problème du voyageur de commerce asymétrique : Étant donné un ensemble de $n$ nœuds et de distances pour chaque paire de nœuds, trouver un cycle de longueur minimale qui visite chaque nœud exactement une fois. Cette fois-ci la distance entre deux nœuds $i$ et $j$ d'une arête n'est pas forcément la même qu'on aille de $i$ à $j$ ou bien de $j$ à $i$.
Aussi, divers problèmes de recherche opérationnelle se ramènent au voyageur de commerce. Un voyageur de commerce peu scrupuleux serait intéressé par le double problème du chemin le plus court (pour son trajet réel) et du chemin le plus long (pour sa note de frais).

## Résolution exacte
### Complexité du problème

Le problème de décision associé au problème d'optimisation du voyageur de commerce est NP-complet. Il peut notamment être réduit à partir du problème du cycle Hamiltonien, qui fait partie des 21 problèmes NP-complets de Karp. Christos Papadimitriou a démontré en 1977 que le problème reste NP-dur même si les distances sont données par des distances euclidiennes.
Ainsi, le problème reste NP-dur même si on supprime la condition "ne passer au plus qu'une seule fois par une ville".

### Algorithmes

Une approche de résolution naïve, mais qui donne un résultat exact, est l'énumération de tous les chemins possibles par recherche exhaustive. La complexité en temps de cet algorithme est en $O(n!)$ (plus exactement ${\frac {(n-1)!}{2}}$, ce qui devient vite impraticable même pour de petites instances).
Par exemple, si le calcul d'un chemin prend une microseconde, alors le calcul de tous les chemins pour 10 points est de 181 440 microsecondes soit 0,18 seconde, mais pour 15 points, cela représente déjà 43 589 145 600 microsecondes soit un peu plus de 12 heures et pour 20 points de 6 × 10$^{16}$ microsecondes soit presque deux millénaires (1 901 années). Pour 25 villes, le temps de calcul dépasse l'âge de l'Univers.
Held et Karp ont montré que la programmation dynamique permettait de résoudre le problème en $O(n^{2}2^{n})$.
Les méthodes d'optimisation linéaire sont à ce jour parmi les plus efficaces pour la résolution du problème de voyageur de commerce et permettent désormais de résoudre des problèmes de grande taille (à l'échelle d'un pays), moyennant éventuellement un temps de calcul important.

### Cas particuliers
#### Tournée bitonique dans un graphe euclidien

Dans le cas d'un graphe euclidien, c'est-à-dire lorsque les arêtes ont pour poids les distances entre les $n$ sommets comme c'est par exemple le cas entre des villes sur une carte routière, certaines variantes du problème du voyageur de commerce ont une solution exacte qui peut être déterminée en temps polynomial. C'est le cas lorsque l'on cherche le circuit bitonique le plus rapide, où l'on part du point le plus à l'ouest pour aller toujours vers l'est jusqu'au point le plus à l'est avant de revenir au point de départ en allant toujours vers l'ouest. Dans ce cas particulier introduit pour la première fois par Jon Louis Bentley, une solution optimale peut être déterminée en $O(n^{2})$ par programmation dynamique.

## Approximation

Dans cette section, nous discutons l'existence ou non d'algorithmes d'approximation. Ce sont des algorithmes d'approximation, qui ne calculent pas forcément un tour optimal, mais un tour qui est suffisamment de bonne qualité. Généralement, on mesure la qualité de l'algorithme avec un facteur d'approximation $\alpha$ : le poids du tour calculé par l'algorithme est au pire plus petit que $\alpha$ fois le poids d'un tour optimal.

### Cas général

Dans le cas général, et en supposant ${\mathtt {P}}\neq {\mathtt {NP}}$, il n'existe pas d'algorithme d'approximation de facteur d'approximation constant pour résoudre le problème du voyageur de commerce. Pour le montrer on procède par l'absurde en supposant que pour un certain $\epsilon >0$ il existe un algorithme d'approximation de facteur $1+\epsilon$. On montre alors que cet algorithme d'approximation permet de résoudre le problème de la recherche de cycle hamiltonien en temps polynomial alors même que celui-ci est NP-complet.
On considère un graphe $G$, on peut supposer sans perte de généralité que toutes ses arêtes sont de poids 1. On le transforme en le graphe complet $G'$ en ajoutant à $G$ entre chaque paire de sommets non connectés une arête de poids $|S|(1+\epsilon )+1$ où $|S|$ est le nombre de sommets de $G$. Si le graphe $G$ possède un circuit hamiltonien, alors $G'$ possède une tournée minimale de poids $|S|$, sinon la tournée minimale contient au moins une arête de poids $|S|(1+\epsilon )+1$ et son poids vaut donc au moins $|S|(1+\epsilon )+1+|S|-1=|S|(2+\epsilon )$. Dans le premier cas, notre algorithme d'approximation trouvera en temps polynomial une tournée de poids au plus $|S|(1+\epsilon )$, dans l'autre il trouvera une tournée de poids au moins $|S|(2+\epsilon )>|S|(1+\epsilon )$. Comme on peut discriminer entre les deux situations en temps polynomial, il s'ensuit que l'existence d'un circuit hamiltonien peut s'effectuer en temps polynomial ce qui aboutit à une contradiction ; il n'existe donc pas d'algorithme générique d'approximation pour résoudre le problème du voyageur de commerce.

### Cas métrique

Le cas métrique signifie que les poids des arêtes respectent l'inégalité triangulaire : aller de A à C est toujours plus court qu'aller de A à la ville intermédiaire B, puis de B à C. Dans ce cas, l'algorithme de Christofides est un algorithme d'approximation de facteur 3/2. Dans ce cas, le problème est APX-difficile même avec des poids 1 ou 2. La meilleure borne inférieure pour le facteur d'approximation est 123/122.
Un preprint de 2020 améliore le facteur de 3/2 - 10$^{-36}$$^,$.

### Cas euclidien

Le cas euclidien signifie que les sommets du graphe sont des points dans un espace euclidien, par exemple un plan euclidien. Le poids d'une arêtes entre deux points A et B est la distance euclidienne entre A et B. Dans le cas euclidien, il existe un schéma d'approximation en temps polynomial. Il a été découvert indépendamment par Sanjeev Arora et Joseph S. B. Mitchell, et leur a valu le prix Gödel en 2010.

### Techniques
#### Formulation par optimisation linéaire

La formalisation du problème qui suit, sous forme d'optimisation linéaire en nombres entiers du problème, est utilisée pour la conception d'algorithmes d'approximation. On note $\delta (S)$ l'ensemble des arêtes sortant de l'ensemble de sommets S.
    ${\begin{aligned}&{\text{minimiser}}&&\sum \mathbf {c} _{e}\mathbf {x} _{e}\\&{\text{tel que}}&&\mathbf {x(\delta (S))} \geq 2,{\text{ pour tout sous-ensemble }}\mathbf {S} {\text{ de }}\mathbf {V} ,\\&{\text{et}}&&\mathbf {x(\delta (v))} \geq 2,{\text{ pour tout élément }}\mathbf {v} {\text{ de }}\mathbf {V} ,\\&{\text{et}}&&\mathbf {x_{e}} {\text{ dans }}\mathbf {0,1} \\\end{aligned}}$
La relaxation de ce programme pour un problème d'optimisation linéaire (c'est-à-dire sans les contraintes d'intégralité) est appelée relaxation de Held et Karp ou subtour LP. Cette relaxation a un nombre exponentiel de contraintes, mais peut être résolue en temps polynomial en résolvant le problème de séparation, qui se révèle être le calcul d'une coupe minimum.
Il est conjecturé que la relaxation de Held et Karp a un trou d'intégralité (integrality gap) de 4/3.

#### Approximation de facteur 2 utilisant des arbres couvrants

L'algorithme de Christofides est basé sur un algorithme simple d'approximation de facteur 2 qui utilise la notion d'arbre couvrant de poids minimal. Comme toute tournée a un poids cumulé supérieur à celui de l'arbre couvrant minimal et comme un parcours préfixe de l'arbre passe deux fois par chacun des nœuds internes une tournée qui suit un parcours préfixe a un poids cumulé inférieur au double de la solution minimale au problème du voyageur de commerce. Il reste à convertir ce parcours en un parcours qui passe une fois et une seule par chacun des sommets du graphe. On exploite alors l'inégalité triangulaire : si entre deux sommets le parcours considéré fait passer par un sommet intermédiaire déjà visité, on le saute pour passer directement au premier sommet non encore visité. L'inégalité triangulaire assure alors que le poids total du trajet n'augmente pas ; par conséquent on obtient un circuit hamiltonien dont le poids est inférieur au double de celui du circuit minimal.

## Heuristiques

De fait de la complexité initiale du problème ($O(n!)$), de son importance, et de sa NP-complétude, de nombreuses heuristiques ont été proposées.

### Heuristiques de recherche locale

Une heuristique classique, appelée 2-opt est une recherche locale qui consiste à partir d'une solution et à essayer de l'améliorer en échangeant itérativement les sommets de deux arêtes. L'heuristique de Lin-Kernighan en est une amélioration.
Une autre heuristique de recherche locale appelée Ruiner et recréer, proche du recuit simulé, consiste à partir d'une solution, de ruiner une région de celle-ci puis de la recréer en l'améliorant.

### Méta-heuristiques

Les algorithmes génétiques peuvent aussi être adaptés au problème du voyageur de commerce. L'idée a été proposée la première fois par John Holland au début des années 1970.

### Heuristiques gloutonnes

Pour le problème du voyageur de commerce, une heuristique gloutonne construit une seule solution, par une suite de décisions définitives sans retour arrière, parmi ces méthodes on cite le plus proche voisin, la plus proche insertion, la plus lointaine insertion et la meilleure insertion.
Dans la méthode du plus proche voisin, on part d'un sommet quelconque et à chacune des $(n-1)$ itérations on relie le dernier sommet atteint au sommet le plus proche au sens coût, puis on relie finalement le dernier sommet au premier sommet choisi.
Dans les méthodes d'insertion, on part d'un cycle réduit à une boucle au départ, à chaque itération on choisit un sommet libre $j$ puis on cherche la position d'insertion $i$ et $j$ de cycle qui minimise l'augmentation totale des coûts :
* dans la plus lointaine insertion $j$ est le sommet libre le plus loin du cycle au sens des coûts ;
* dans la plus proche insertion $j$ est le plus proche du cycle ;
* enfin dans la meilleure insertion on teste tous les sommets $j$ non encore insérés et on choisit celui qui donne la plus faible augmentation du coût.

## Histoire et importance
### Origines et cas particuliers

Le principe d'un tel voyage est décrit dès 1832, dans un écrit d'un commis-voyageur et des itinéraires efficaces étaient référencés dans des guides. Plusieurs problèmes anciens peuvent être vus comme des cas particuliers du problème ; par exemple, en 1856, William Rowan Hamilton s'était intéressé à un problème géométrique de ce type sur un dodécaèdre, d'ailleurs le terme cycle hamiltonien désigne un cycle passant par tous les sommets dans un graphe.

### Terminologie

Le terme problème du voyageur de commerce, vient de la traduction de l'anglais américain Traveling salesman problem, qui est apparu dans les années 1930 ou 40, sans doute à l'université de Princeton où plusieurs chercheurs s'y intéressaient. C'est aussi à cette période que le problème est formulé indépendamment dans plusieurs communautés de chercheurs, notamment autour de Karl Menger.

### Développements

Le problème a alors intéressé une plus large communauté et a notamment été à l'origine de la découverte de plusieurs techniques, comme l'optimisation linéaire mixte (mixed integer programming), et la méthode de séparation et évaluation (branch-and-bound).
En 1972, Richard Karp montra que le problème de décision associé est NP-complet.

### Importance dans l'enseignement et la recherche

Le voyageur de commerce est l'un des problèmes algorithmiques ayant le plus été étudiés. De plus, du fait de la simplicité de son énoncé, il est souvent utilisé pour introduire l'algorithmique, d'où une relative célébrité.

## Variantes

La variante PTSP (pour physical traveler salesman problem) consiste à visiter une et une seule fois un nombre fini dans un environnement 2D avec des obstacles. La variante mTSP (pour multiple traveler salesman problem) généralise le problème à plusieurs voyageurs, lui-même se généralisant en le problème de tournées de véhicules.

## Applications

Le problème du voyageur du commerce a de nombreuses applications, et a d'ailleurs été motivé par des problèmes concrets, par exemple le parcours des bus scolaires.
Un premier type d'application classique est bien sûr dans la logistique, par exemple pour la poste, la distribution de repas à domicile, l'inspection d'installations, etc.. On peut aussi optimiser les mouvements de machines, par exemple, pour minimiser le temps total que met une fraiseuse à commande numérique pour percer n points dans une plaque de tôle, ou minimiser les mouvements des grands télescopes (qui sont très lents).
On peut citer des applications plus surprenantes, par exemple : en biologie, le problème aide au séquençage du génome (pour relier des petits fragments en des chaînes plus grandes), et en production il est utilisé pour le test des circuits imprimés.