Vous êtes sur la page 1sur 3

L3-E3A TEI 2023-2024

Le Voyageur de Commerce
Le problème du voyageur de commerce est un problème d’optimisation combinatoire qui consiste à
trouver la meilleure solution parmi un ensemble de choix possible: pour un nombre de villes n, on
cherche à trouver le chemin le plus court passant une fois et une seule par chacune des villes. Ceci
s’apparente, par exemple, à un livreur voulant optimiser le temps passé pour livrer tous ses colis ou à
l’optimisation de l’ordre de déplacement d’une fraiseuse sur une ligne de production.

Sur ce schéma par exemple, sont représentés 4 points ainsi


que les coûts des trajets entre les différents points. Pour cette
configuration il existe N! chemins possible (ici 4! = 24), en
spécifiant le point de départ on se réduit à (N-1)! chemins (ici
3! = 6).

En général on représente les distances séparant les villes sous forme d’une matrice telle que:
𝑑1,1 𝑑1,2 𝑑1,3 𝑑1,4
⎡ ⎤
𝑑2,1 𝑑2,2 𝑑2,3 𝑑2,4
⎢ ⎥
⎢𝑑3,1 𝑑3,2 𝑑3,3 𝑑3,4 ⎥
⎣𝑑4,1 𝑑4,2 𝑑4,3 𝑑4,4 ⎦

Ici on a donc la matrice symétrique:


0 10 15 20
10 0 35 25
� �
15 35 0 30
20 25 30 0

On peut utiliser un arbre pour visualiser


les solutions possibles. En partant du
point 1 on obtient l’arbre ci-contre.

On voit que les trajets optimaux sont :

1-2-4-3-1 et 1-3-4-2-1

NB : On peut remarquer que ces trajets


sont les mêmes, mais parcourus en sens
inverse, il est donc normal qu’ils aient les
mêmes coûts puisque notre matrice
initiale est symétrique. Attention, ce
n’est pas toujours le cas.
L3-E3A TEI 2023-2024
Ce problème est notoirement connu pour avoir une complexité augmentant très rapidement avec le
nombre de points considérés : ainsi pour 10 points, on dépasse déjà les 3 millions de chemins
possibles… Pour un grand nombre de point, obtenir une résolution exacte de ce problème devient
donc très compliqué et demande de faire appel à des algorithmes d’optimisation.

Dans ce projet, on propose de programmer trois algorithmes permettant la résolution exacte du


problème du voyageur de commerce et d’en comparer les forces et les faiblesses.

1) La méthode Brute Force


Cette méthode consiste simplement à trouver et calculer le coût de tous les chemins possibles, puis à
sélectionner la meilleure option.

A faire pour générer les points:

• Une fonction générant un nombre N de points (N petit ici <8) avec un positionnement
aléatoire.
• Une fonction calculant et enregistrant en mémoires les distances entre les différents points.
(On peut supposer dans un premier temps que chaque point est relié à tous les autres et que
la distances entre deux points est la même que l’on aille de A à B ou de B à A).

Pour réaliser cet algorithme on peut utiliser :

• Une fonction récursive calculant toute les combinaisons de points possibles et une fonction
calculant le cout de chaque chemin trouvé.
• Ou bien mixer les deux et faire une seule fonction récursive calculant les couts en même
temps que les chemins sont générés.

2) La méthode Held Krap


Il s’agit aussi d’une méthode bottom up de résolution exacte du problème du voyageur de
commerce, mais en utilisant la programmation dynamique. Le principe de cette méthode est de
stocker en mémoire les trajets déjà calculés et si un chemin apparait plusieurs fois, le programme va
chercher les données correspondantes en mémoires plutôt que tout recalculer entièrement.

Description de l’algorithme :

Le principe est de découper le problème en sous-problèmes, et comme on ne sait pas à priori


de quels sous-problèmes on aura besoin, tous les sous-problèmes doivent être résolus en
commençant par les plus petits. De cette façon, lorsque l’on a besoin de calculer un nœud de
niveau n, toutes les solutions des nœuds de niveau n-1 sont déjà calculées et disponibles en
mémoire.

Formulation Récursive :

On considère un ensemble E de N points tel que 𝐸 = {1,2, … , 𝑁}. On suppose par la suite
que l’on partira toujours du point 1.

On note dij la distance entre les point i et j avec 𝑖, 𝑗 ∈ 𝐸. On note S tous sous ensemble de E
tel que 𝑆 ⊆ {2, … , 𝑁}, S peut donc contenir n’importe quel élément de E sauf {1}.
L3-E3A TEI 2023-2024
Pour tout élément 𝑐 ∈ 𝑆 on note 𝐷(𝑆, 𝑐) la distance du chemin le plus court, partant de 1,
passant par tous les points de S et finissant à c.

1ere partie:

Si 𝑆 = {𝑐}, alors 𝐷(𝑆, 𝑐) = 𝑑1,𝑐

Si 𝑆 ≠ {𝑐}, alors 𝐷(𝑆, 𝑐) = min𝑥∈𝑆−{𝑐} (𝐷(𝑆 − {𝑐}, 𝑥) + 𝑑𝑥,𝑐 )

2eme partie :

La distance minimale pour faire le tour de toutes les villes est

𝑀 = min(𝐷(𝑆, 𝑐) + 𝑑𝑐,1 )
𝑐∈𝑆

Idée de programmation :

• On peut soit utiliser une fonction récursive (comme précédemment) en ajoutant les
processus nécessaires de mémorisation et de recherche dans la mémoire.
• Ou bien on peut utiliser une méthode itérative en faisant bien attention à l’ordre dans lequel
les chemins sont calculés.
• Il faudra aussi utiliser une fonction permettant de reconstituer le trajet exact une fois que la
distance minimale est trouvée.

3) La méthode Branch and Bound


La méthode branch and bound est une méthode top down de résolution exacte. Le principe des cet
algorithme est d’orienter la recherche de la solution optimale en explorant en priorité les chemins
dont les couts sont les plus faibles.

La méthode de résolutions est plus simple que dans le cas précédant : on part du point de départ, ici
1, et on calcule les coûts reliant ce point à tous les autres. On choisit d’explorer le nœud dont le coût
est le plus faible. On recommence la procédure pour ce nouveau nœud.

Ainsi, pour chaque nœud sélectionné, l’algorithme doit calculer les coûts de tous les sous-nœuds,
enregistrer ces coûts en mémoire et sélectionner le nœud ayant le coût minimal parmi tous les
nœuds déjà calculés (attention, cela signifie qu’on peut remonter une branche si un nœud plus
avantageux se présente plus haut dans l’arbre).

Vous aimerez peut-être aussi