1/6
Voyageur de commerce et solution exacte
Auteurs : F. Védrine, B. Monsuez
Ce projet consiste à réaliser un outil capable de trouver le plus court trajet pour un
commercial qui doit visiter n villes, les n villes étant placées sur un plan.
une solution
parmi les
plus courtes
C’est un problème bien connu en recherche opérationnelle sous le nom de « Traveling
Salesman Problem » ou TSP. Ce problème est NP-Complet. Diverses approches ont été
proposées pour les résoudre : des approches exactes (l’outil retourne effectivement le plus
court trajet) et des approches approchées (l’outil retourne un trajet proche du plus court). Ce
problème a donné lieu à beaucoup de recherches et a fourni pas mal de résultats en
algorithmique et en recherche opérationnelle.
Scénario : Vous vous trouvez dans la situation où votre supérieur vous demande :
1. Analysez le problème, sachant qu’il est souhaitable d’avoir la solution optimale
2. Réalisez un démonstrateur pour convaincre tel client que nous sommes capables de
traiter ce problème et/ou de lui fournir une première solution.
3. Si le client est convaincu, vous aurez vraisemblablement des ressources
supplémentaires pour transformer le démonstrateur en outil afin de le faire rentrer de
manière opérationnelle chez le client.
Votre objectif est d’une part d’arriver à finaliser le premier démonstrateur, tout en sachant que
les personnes qui transformeront l’outil seront des spécialistes de leur domaine et qu’ils ne
pourront pas connaître l’ensemble de l’outil pour faire leurs améliorations.
Pour le projet, vous aurez à réaliser les étapes 1 et 2 et à mettre en place et réaliser un axe
d’amélioration pour l’étape 3.
Ce projet peut alors être décomposé en 3 phases fonctionnelles :
la première phase correspond à l’acquisition des données soit au fait de représenter n
villes dans un plan,
la seconde phase correspond à la résolution de l’algorithmique soit la recherche du
trajet optimal,
la troisième phase correspond à afficher le trajet optimal trouvé.
2/6
Étape 1 : Analyse du problème
Question A :
Déterminez l’architecture qui permet de faire évoluer les trois phases fonctionnelles
(acquisition, algorithmique et affichage) indépendamment les unes des autres.
Question B :
En pensant aux états dans lequel se trouve votre système (avant l’acquisition des données,
après l’acquisition et avant la résolution, après la résolution sachant que l’affichage ne
modifie pas le système), définissez l’interface exportée par chaque partie du système pour
effectuer les trois phases fonctionnelles.
Pour la question B, une des personnes du projet peut travailler à l’aide de diagrammes UML
(c’est simplement une option parmi d’autres), pendant que les autres réfléchissent à ce qui
peut bouger entre les différentes phases et comment ce sera exploité.
Il faut voir que lors de l’évolution de votre projet, l’acquisition des données pourra être
partiellement découplée de la recherche du meilleur trajet, et qu’il est assez dur d’anticiper sur
le couplage acquisition/résolution. Certaines structures de données correspondant au résultat
de l’acquisition des n villes dans le plan sont plus adéquates que d’autres pour
l’algorithmique. Ce couplage n’est pas forcément visible au niveau de l’interface que vous
définirez.
L’analyse architecturale du projet étant terminée, voici une présentation succincte
d’algorithmes de type Branch & Bound permettant une résolution exacte du problème du
voyageur de commerce. Cette présentation peut être sautée par le lecteur dans un premier
temps. Vous pouvez y revenir lorsque vous implanterez les algorithmes. Nous présentons
deux algorithmes différents. Noter que pour l’étape 2, vous pouvez implanter un algorithme
de recherche de type Branch & Bound, comme un algorithme plus approché que vous aurez
fait ou trouvé sur le Web. Dans ce dernier cas, vous pouvez consacrer l’étape 3 à remplacer
l’algorithme approché par un algorithme de recherche assez poussé parmi les deux que nous
vous présentons.
Représentation des villes
Nous représentons l’ensemble des villes placées sur un plan par une matrice de coût. Cette
matrice stocke la distance entre deux points.
matrice de
coût
A
BCD
E
F
G
H
I
J
A
B
C
D
...
I
J
ABCD ... I J
247 76
2
4
7
7
6
26 77
2
6
7
7
455
4
5
5
... ... ... ... ... ...
...
...
...
...
...
...
35
3
52
2
La matrice de coût peut être symétrique ou non : Si elle est symétrique, cela signifie que
d(x,y) = d(y,x) quelles que soient les villes concernées.
La matrice de coût peut représenter une distance euclidienne, reflétant la propriété
d(x,y)+d(y,z)
d(x,z).
3/6
L’algorithme d’insertion de nœud peut être bien optimisé pour une distance euclidienne, alors
que l’algorithme d’insertion d’arc fonctionne bien sans cette contrainte.
Algorithmes de type Branch & Bound (séparation-évaluation)
Les algorithmes de type Branch & Bound (séparation-évaluation) cherchent généralement à
minimiser une fonction de coût. La fonction de coût dans notre cas est la fonction qui à un
trajet associe sa la longueur totale.
La partie Branch ou séparation est une méthode de parcourt de l’espace des solutions. Cette
partie porte ce nom, car le parcourt est généralement un parcourt d’arbre en profondeur
d’abord pour avoir rapidement. À chaque nœud de l’arbre s’offrent alors plusieurs
possibilités. Le branchement consiste à choisir une de ces possibilités, généralement celle qui
a le plus de chance d’être choisie : l’aspect « plus de chance » est en liaison avec la partie
Bound ou évaluation.
La partie Bound ou évaluation donne une borne minimale pour le meilleur trajet (au sens de la
fonction de coût), validant les décisions (branchements ou séparations) déjà effectuées : ce
meilleur trajet aura alors une fonction de coût supérieure à cette borne.
L’algorithme effectue un certain nombre de décisions jusqu’à avoir un chemin complet. Ce
chemin a alors une fonction de coût que nous stockerons dans lmax. Nous savons que la
meilleure fonction de coût pour toutes les sous-branches d’un nœud est comprise entre
l’évaluation de la borne minimale du nœud et lmax. Ainsi si lmax est supérieur à cette borne
minimale, alors nous n’avons aucune chance de trouver une meilleure fonction de coût dans
tous les descendants du nœud. Il est inutile d’explorer dans cette partie ce qui peut faire
gagner énormément de temps.
branch1
branch2
branch3
l1min
l2min
l3min = lmax
evaluation part
= lower bound
A priori l3min
l2min
l1min
branch1
branch2
branch3
l1min
l2min
branch4l4min
inutile d'explorer
si lmax
l4min
l3min
exploration si lmax > l4min
lmax peut alors diminuer si une meilleure
fonction de coût est découverte
branch1
branch2
branch3
l1min
l2min
inutile d'explorer
si lmax
l5min
l3min exploration si lmax > l5min
lmax peut alors diminuer
branch5l4min
Nous concrétisons cet algorithme de deux manières différentes pour résoudre le problème du
voyageur de commerce.
4/6
Algorithme d’insertion de nœuds
L’algorithme par insertion de nœuds procède en partant d’un trajet de longueur 3 et en
insérant progressivement des nœuds dans ce trajet. La première décision (branch) consiste à
choisir le trajet initial de longueur 3. Étant donné que les points se trouveront dans cet ordre
dans le trajet optimal, il n’y a pas lieu de revenir sur cette décision. Les 3 points initiaux ont
donc tout intérêt à se trouver éloignés les uns des autres. Les décisions suivantes consistent à
choisir un nœud en même temps que son emplacement d’insertion.
La borne minimale de coût peut être la longueur du trajet déjà construit. Cette borne est bien
minimale si nous avons affaire à une distance euclidienne.
L’algorithme se comporte de la manière suivante sur un petit exemple, ne comparant que 10
trajets complets au lieu des (6-1)!/2 = 60 possibilités.
lmin = 19 lmin = 21 lmin = 30, abandonné si lmax
30
lmin = 26
lmin = 21, trajet conservé
lmin = 23
lmin = 27
lmin = 24
lmin = 26
lmin = 25
lmin = 27
lmin = 24
lmin = 28
trajet final
lmin = 25
finalement ces 2
possibilités et les
3 autres sont
abandonnées
lmin = 25
5/6
Algorithme d’insertion d’arc
Cet algorithme est généralement plus efficace que le précédent. Il détermine si des arcs
peuvent faire partie du trajet optimal. La décision (branchement ou séparation) est tel arc
appartient au trajet optimal ou tel arc n’y appartient pas. La borne minimale de coût est un peu
plus complexe à calculer. Elle contient la somme des longueurs des arcs insérés +
) présent}arcd'n destinatio uneest pas y n' /y){d(x,min(
'
présentarcundorigineennonx = soustrait des
lignes + ce qui reste à soustraire des colonnes.
Il est possible d’améliorer cette fonction de coût, sachant qu’elle fonctionne aussi bien pour
des distances euclidiennes que d’autres distances.
matrice de
coût
BD
F
A
E
C
A
B
C
D
E
F
ABCDEF
448 3
4
4
8
3
55 2
5
5
2
53
5
3
6623 4
6
6
2
3
4
4
4
A
B
C
D
E
F
ABCDEF
114 0
1
1
4
0
33 0
3
2
0
21
2
1
3400 2
3
4
0
0
2
1
1
On soustrait de chaque ligne l'ément minimal.Idem pour les colonnes
Evaluation minimale = ce qui a été soustrait + Σ longueurs des arcs lections
lmin = 16
A
B
C
D
E
F
ABCDEF
114 0 (1)
1
1
4
33
3
221
2
1
34 2
3
4
2
1
1
paration : On essaye de choisir si un couple
n'est pas dans le chemin optimal (estimer de
combien augmentera la fonction de coût
= ce qui peut être soustrait)
0 (1)
0 (1)
0 (1)
0 (1)0 (1)
0 (1)0 (1)
B
C
D
E
F
ABCDE
1
1
4
0
33
3
2
0
2
2
1
3400
4
0
0
21
AF
A
B
C
D
E
F
ABCDEF
114
1
1
4
0
33 0
3
2
0
21
2
1
3400 2
3
4
0
0
2
1
1
lmin = 17 B
C
D
E
F
ABCDE
1
4
22
3
22
2
1
34
3
21
0 (1)
0 (2)
0 (1)0 (1)
0 (2)0 (0)
0 (2)
B
C
D
E
F
ABCDE
1
4
0
22
3
2
0
2
2
1
3400
3
0
0
21
BA
C
D
E
F
BCDE
3
22
2
1
400
0
0
21
BA
lmin = 22
lmin = 17 lmin = 19
C
D
E
F
BCDE
12
2
21
0 (1)
0 (0)
0 (0)0 (0)
0 (0)0 (0)
0 (1)
CE
D
E
F
BCD
02
0
20
AF = AF exclus
B
C
D
E
F
ABCDE
1
43
22
2
1
34
1
21
0 (1)
0 (2)
0 (2)0 (1)
0 (0) 0 (0)
0 (0) 0 (0)
DE
lmax = lmin = 22
B
C
D
E
F
ABCDE
1
4
0
22
3
2
0
2
2
1
3400
3
0
0
21
DE
lmin = 21
B
C
E
F
ABCD
1
0
00
3
0
2
1
3400
1
lmin = 20
B
C
E
F
ABCD
2
31
0 (0)
1
0 (0)4
0 (2)0 (0)
0 (1)
0 (0)
1
0 (0)
FB
FB
B
C
E
ACD
000
1
300
B
C
E
ACD
3
0 (0)
1
0 (0)
0 (4)
0 (0)
0 (0)
lmin = 20
inutile, car dans
ce cas, lmin = 22
B
E
CD
0
0
CA
lmax = lmin = 20
invali par le
2nd lmax
Encore des
branches
potentielles
avec lmax = 20
invali par le
2nd lmax
1 / 6 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !