Si je fais ce poste aujourd’hui c’est parce que je pense avoir
trouvé une solution au problème du voyageur de commerce. Quand je dis solution, je veux dire une méthode ou algorithme permettant de trouver le plus court chemin « rapidement » et ce, dans tous les cas.
Le problème du voyageur de commerce :
Le problème est posé de la façon suivante : Imaginons que vous ayez un certain nombre de villes à visiter, une seule fois, et que vous souhaitiez revenir au point de départ à la fin. Ainsi vous connaissez les villes à visiter ainsi que toutes les distances qui les séparent. Le but est de trouver le chemin le plus court qui vous fera passer par toutes les villes, une fois, et vous ramènera au point de départ. Il existe plusieurs façons de résoudre ce problème (plus ou moins longues à réaliser) comme par exemple, en testant tous les chemins afin de les comparer entre eux, mais en ne gardant que le plus court. Vous imaginez bien que, plus on a de villes à visiter, plus il y a de chemins à tester et cette technique devient vite irréalisable même avec un ordinateur « très puissant ». Toute la difficulté est là. Il faut trouver un moyen d’obtenir le plus court chemin à chaque fois, et cela quel que soit le nombre de villes, les distances qui les séparent et tout ça dans un temps raisonnable (bien plus rapide qu’avec la méthode dite « brutale »). Pour plus d’information sur ce problème, je vous laisse consulter la page Wikipédia. Passons donc à ma solution.
Voici ce que je propose :
Prenons un schéma composé de n points (appelons ces points : k0, k1, k2, …, kn-1.). Tous ces points sont reliés entre eux et espacés par des distances (appelons ces distances : d0 la distance de k0 à k1, d1 la distance de k1 à k2, …, dn la distance de kn-2 à kn-1.). Maintenant, prenons les 3 points qui composent ce schéma ainsi que les distances correspondantes de façon totalement aléatoire, cela n’a aucune importance vous le verrez par la suite. (Avec un schéma à trois points vous pouvez tester plusieurs chemins, mais vous verrez que la distance totale sera la même pour tous, on peut représenter ça par un triangle). De plus, dans notre schéma de départ, tous les points sont reliés entre eux, ce qui veut dire que si vous partez du point k0 ou de n’importe quel autre point du schéma, vous pourrez obtenir le même chemin le plus court. Tout ça pour dire que le point de départ n’a aucune importance. Bref, vous vous retrouvez avec un schéma à 3 points. Maintenant il vous faut arriver à un schéma avec vos n points. Pour cela rajoutons un point supplémentaire à votre schéma avec les distances correspondantes (ce point doit appartenir à votre schéma) de sorte à avoir un chemin passant par 4 points différents. Bien entendu, il ne faut pas rajouter ce point n’importe où, il faut faire en sorte que ce chemin soit le plus court de tous et pour cela voilà comment procéder : Soit x,y,z vos trois points sélectionnés et xyzx votre chemin avec les distances correspondantes, vous voulez rajouter w (w appartient à votre schéma). Trois possibilités s’offre à vous soit xwyzx, soit xywzx ou xyzwx. Ensuite il faut simplement prendre l’un des trois chemins, celui qui est le plus court et répéter ça jusqu’à avoir un chemin passant par vos n points et revenant au point départ. Par ailleurs, calculer la taille totale de chaque chemin demanderait 𝑛2 −𝑛−6 ( ) étapes, où n est le nombre de points de votre schéma initial. 2
Pour que ce soit plus simple, illustrons cela par un exemple.
Exemple : Votre schéma de départ est composé de 5 points : A, B, C, D, E. Pour ma part je note les distance de cette façon-ci (dans le cas où d(x,y) = d(y,x) ): A :{AB ; AC ; AD ; AE} B :{BC ; BD ; BE} C :{CD ; CE} D :{DE} A :{4 ; 2 ; 1 ; 3} B :{6 ; 1 ; 3} C :{7 ; 2} D :{1} Comme cela on peut facilement voir d0(AB) ; d1(AC) …etc. Prenons 3 points du schéma au hasard : A, D et C et fixons le premier chemin ADCA. (Notez que l’on peut fixer des paramètres en plus comme par exemple imposer le point de départ). Maintenant, je veux rajouter un point. (Là aussi ça peut être n’importe lequel) Rajoutons B au chemin : 3 possibilités : ABDCA, ADBCA ou ADCBA. ABDCA = 14 ; ADBCA = 10 ; ADCBA = 18. Le chemin ADBCA étant le plus court, je le garde. Maintenant je dois rajouter le dernier point E pour avoir mon chemin complet. Ici 4 possibilités : AEDBCA, ADEBCA, ADBECA ou ADBCEA. AEDBCA =13, ADEBCA = 13, ADBECA = 9, ADBCEA = 13. Alors le chemin le plus court passant par A, B, C, D et E en partant de A et en revenant à A est ADEBCA. Je tiens à préciser tout de même qu’il est possible qu’il y ait plusieurs chemin partant du même point de départ qui soit les plus courts mais nous devons trouver au moins un chemin qui est le plus court. Je vous remercie d’avoir pris le temps de lire ce post et je vous remercie d’avance pour tous les commentaires que vous ferais au sujet de cette solution (pour me dire si elle est valide, ce qu’elle vaut, ce que je peux en faire …etc.). De plus si quelqu’un veut m’aider pour réaliser le programme informatique pas de soucis, il suffit de me demander ;). Bonne journée.