Académique Documents
Professionnel Documents
Culture Documents
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.
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 ⎦
1-2-4-3-1 et 1-3-4-2-1
• 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).
• 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.
Description de l’algorithme :
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:
2eme partie :
𝑀 = 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.
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).