Title: Recherche de chemins de co
1Recherche de cheminsde coût minimalavec
lalgorithme AMise en Å“uvre pratique
IUT de Reims-Châlons-Charlevillerue des
crayères, BP 103551687 Reims Cedex 2
2Introduction
- Objectif Déterminer, pour un agent donné, un
chemin de coût minimum depuis un sommet source
vers un sommet destination au sein dun graphe
orienté. - Un agent est un objet informatique autonome
utilisé pour représenter une entité mobile dotée
dun comportement (humain, animal, véhicule, )
3Applications
- Jeux vidéo
- Animation des personnages non joueurs (RPG, FPS)
- Déplacement réaliste dun personnage contrôlé par
le joueur vers un objectif désigné par le joueur
(RTS) - Simulation vie artificielle
- Etude du comportement dune foule, du traffic
automobile, - Effets spéciaux (scènes de bataille, )
4Représentation du graphe à partir dinformations
topographiques
5Relations dadjacence grille carrée
Pont
Prairie
Rivière
6Relations dadjacence grille hexagonale
Prairie
Pont
Rivière
7Relations dadjacence points visibles
Obstacles
Couloirs
8Coût des arcs
- Signification du coût dun arc
- Distance kilométrique
- Recherche de chemins de longueur minimale
- Temps (nécessaire au franchissement de larc)
- Recherche de chemins en temps minimum
- Consommation de carburant
- Rechercher de chemins  économesÂ
9Coût des arcs grille carrée
10
10
10
10
10Coût des arcs grille hexagonale
Triangle équilatéral
11Coût des arcs pondération en fonction de la
nature de lenvironnement
Prairie
Montagne
12Coût des arcs pondération en fonction de la
nature de lagent
Coût du franchissement dun pont C 10
pour un humain. C 50 pour une voiture. C
500 pour un semi-remorque.
C
C
13Algorithme A
14Principe général évaluation du coût total dun
sommet
- Coût total (F) Coût depuis la source (G)
Coût vers la destination (H) - G Coût depuis la source
- Algorithmes classiques (Ford, Bellman, Dijkstra)
- Gi min Gj Cij / i prédecesseur de j
Cij coût de larc (i,j) - H Coût vers la destination
- Difficile puisque le reste du chemin (vers la
destination) est encore inconnu.
15Coût vers la destination
- Pourquoi évaluer un coût vers la destination ?
- Afin de resserrer lensemble des sommets Ã
explorer en privilégiant les sommets qui
semblent nous rapprocher de la destination. - RemarqueDans le cas dun algorithme de recherche
plus classique (Dijsktra), on effectue une
recherche exhaustive parmi TOUS les sommets. - Conséquencelalgorithme A est plus performant
que nimporte quel autre algorithme puisquil
diminue lensemble des sommets à explorer.
16Coût vers la destination
- Comment évaluer un coût vers la destination ?
- En utilisant des heuristiques (prédictions) afin
dévaluer un coût vers la destination INFERIEUR
au coût réel (encore inconnu). - A ce titre, A est un algorithme optimiste.
- RemarqueSi lheuristique était supérieur au coût
réel, on risquerait de générer un chemin qui ne
soit pas minimal.
17Distance euclidienne
Théorème de Pythagore H 2 (Coté oppose) 2
(Coté adjacent) 2 H 2 40 2 20 2
2000 H 20 x (5) 1/2
S
40
H
20
D
18Distance de Manhattan
Nombre de cellules, en horizontal et en vertical
entre la source et la destination. Plus conforme
à la nature des déplacements autorisés (haut,
bas, gauche, droite)
S
D
19Algorithme A
- Initialisation
- Sommet source (S)
- Sommet destination (D)
- Liste des sommets à explorer (E) sommet source
S - Liste des sommets visités (V) vide
- Tant que (la liste E est non vide) et (D nest
pas dans E) Faire - Récupérer le sommet X de coût total F minimum.
- Ajouter X Ã la liste V
- Ajouter les successeurs de X (non déjÃ
visités) à la liste E en évaluant leur coût
total F et en identifiant leur prédécesseur. - Si (un successeur est déjà présent dans E) et
- (nouveau coût est inférieur à lancien)
Alors - Changer son coût total
- Changer son prédécesseur
- FinSi
- FinFaire
20Exemple 1
S
Sommet source
D
Sommet destination
D
Obstacle
S
21Exemple 1
Sommet déjà visité
Sommet à explorer
10 30
D
Coût depuisla source
Coût versla destination
10 50
S
G H
10 50
Référence auprédécesseur
22Exemple 1
20 40
Sommet déjà visité
Sommet à explorer
10 30
20 40
D
Coût depuisla source
Coût versla destination
10 50
S
G H
10 50
Référence auprédécesseur
23Exemple 1
20 40
Sommet déjà visité
Sommet à explorer
10 30
20 40
D
Coût depuisla source
Coût versla destination
10 50
S
G H
10 50
20 60
Référence auprédécesseur
24Exemple 1
20 40
Sommet déjà visité
Sommet à explorer
10 30
20 40
D
Coût depuisla source
Coût versla destination
10 50
S
G H
10 50
20 60
20 60
Référence auprédécesseur
25Exemple 1
20 40
30 50
Sommet déjà visité
Sommet à explorer
10 30
20 40
D
Coût depuisla source
Coût versla destination
10 50
S
G H
10 50
20 60
20 60
Référence auprédécesseur
26Exemple 1
20 40
30 50
30 30
Sommet déjà visité
Sommet à explorer
10 30
20 40
D
Coût depuisla source
Coût versla destination
10 50
S
G H
10 50
20 60
20 60
Référence auprédécesseur
27Exemple 1
20 40
40 20
30 50
30 30
Sommet déjà visité
Sommet à explorer
10 30
20 40
D
Coût depuisla source
Coût versla destination
10 50
S
G H
10 50
20 60
20 60
Référence auprédécesseur
28Exemple 1
20 40
40 20
50 10
30 50
30 30
Sommet déjà visité
Sommet à explorer
10 30
20 40
D
50 10
Coût depuisla source
Coût versla destination
10 50
S
G H
10 50
20 60
20 60
Référence auprédécesseur
29Exemple 1
20 40
40 20
50 10
30 50
30 30
Sommet déjà visité
Sommet à explorer
10 30
20 40
60 0
50 10
Coût depuisla source
Coût versla destination
10 50
S
60 20
G H
10 50
20 60
20 60
Référence auprédécesseur
30Exemple 1
D
S
31Exemple 2
S
Sommet source
D
Sommet destination
D
Obstacle
S
32Exemple 2
Sommet déjà visité
Sommet à explorer
D
Coût depuisla source
Coût versla destination
10 30
10 50
S
G H
Référence auprédécesseur
33Exemple 2
Sommet déjà visité
Sommet à explorer
D
Coût depuisla source
Coût versla destination
10 30
10 50
S
G H
Référence auprédécesseur
34Exemple 2
Sommet déjà visité
Sommet à explorer
20 40
D
Coût depuisla source
Coût versla destination
10 30
10 50
S
G H
20 60
Référence auprédécesseur
35Exemple 2
30 50
Sommet déjà visité
Sommet à explorer
20 40
D
Coût depuisla source
Coût versla destination
10 30
10 50
S
G H
20 60
Référence auprédécesseur
36Exemple 2
30 50
Sommet déjà visité
Sommet à explorer
20 40
D
Coût depuisla source
Coût versla destination
10 30
10 50
S
G H
20 60
Référence auprédécesseur
37Exemple 2
30 50
Sommet déjà visité
Sommet à explorer
20 40
D
Coût depuisla source
Coût versla destination
10 30
10 50
S
G H
20 60
30 70
Référence auprédécesseur
38Exemple 2
30 50
Sommet déjà visité
Sommet à explorer
20 40
D
Coût depuisla source
Coût versla destination
10 30
10 50
S
G H
20 60
40 60
30 70
Référence auprédécesseur
40 80
39Exemple 2
30 50
Sommet déjà visité
Sommet à explorer
20 40
D
Coût depuisla source
Coût versla destination
10 30
10 50
S
G H
20 60
40 60
50 50
30 70
Référence auprédécesseur
40 80
50 70
40Exemple 2
30 50
Sommet déjà visité
Sommet à explorer
20 40
D
Coût depuisla source
Coût versla destination
10 30
10 50
S
G H
20 60
40 60
50 50
60 40
30 70
Référence auprédécesseur
40 80
50 70
60 60
41Exemple 2
30 50
Sommet déjà visité
Sommet à explorer
20 40
D
Coût depuisla source
Coût versla destination
10 30
10 50
S
G H
20 60
40 60
50 50
60 40
70 30
30 70
Référence auprédécesseur
40 80
70 50
50 70
60 60
42Exemple 2
30 50
Sommet déjà visité
Sommet à explorer
20 40
D
Coût depuisla source
Coût versla destination
10 30
10 50
S
G H
80 20
20 60
40 60
50 50
60 40
70 30
30 70
Référence auprédécesseur
40 80
70 50
80 40
50 70
60 60
43Exemple 2
30 50
Sommet déjà visité
Sommet à explorer
20 40
D
Coût depuisla source
Coût versla destination
10 30
90 10
10 50
S
G H
80 20
20 60
40 60
50 50
60 40
70 30
30 70
Référence auprédécesseur
40 80
70 50
80 40
50 70
60 60
44Exemple 2
30 50
Sommet déjà visité
Sommet à explorer
20 40
100 0
Coût depuisla source
Coût versla destination
10 30
90 10
10 50
S
G H
80 20
20 60
40 60
50 50
60 40
70 30
30 70
Référence auprédécesseur
40 80
70 50
80 40
50 70
60 60
45Exemple 2
D
S
46Structure des données détail dimplémentation
- Initialisation
- Sommet source (S)
- Sommet destination (D)
- Liste des sommets à explorer (E) sommet source
S - Liste des sommets visités (V) vide
- Tant que (la liste E est non vide) et (D nest
pas dans E) Faire - Récupérer le sommet X de coût total F minimum.
- Ajouter X Ã la liste V
- Ajouter les successeurs de X (non déjÃ
visités) à la liste E en évaluant leur coût
total F et en identifiant leur prédécesseur. - Si (un successeur est déjà présent dans E) et
- (nouveau coût est inférieur à lancien)
Alors - Changer son coût total
- Changer son prédécesseur
- FinSi
- FinFaire
47Structure des données détail dimplémentation
- Nécessité de mettre en œuvre un conteneur
permettant de - Récupérer un élément de coût total minimum.
- Insérer un nouvel élément et trier le conteneur.
- Mettre à jour le coût total dun élément déjÃ
présent dans le conteneur. - Déterminer si le conteneur est vide.
48Solution  élégante files
- Template ltclass Tgt
- class stdqueue
-
- public
-
- bool empty()
- T pop() return pop_front()
- void push(T t) push_back(t)
t
push(t)
pop()
49Solution  élégante files à priorité
- Le type T doit surcharger lopérateur de
comparaison lt - Template ltclass Tgt
- class stdpriority_queue
-
- public
-
- bool empty()
- T pop() return pop_front()
- void push(T t) /insertion triée/
t
push(t)
pop()
50Insertion triée  efficaceÂ
- Utilisation dun arbre binaire déléments
- Le fils gauche est strictement inférieur au nœud
courant. - Le fils droit est supérieur ou égal au nœud
courant.
5
3
12
4
1
7
20
15
25
51Structure des données stdpriority_queue
- Nécessité de mettre en œuvre un conteneur
permettant de - Récupérer un élément de coût total minimum OUI
- Insérer un nouvel élément et trier le conteneur
OUI - Mettre à jour le coût total dun élément déjÃ
présent dans le conteneur NON - Déterminer si le conteneur est vide OUI
52Structure de données personnalisée
MyPriorityQueue
- templateltclass Tgt
- class MyPriorityQueue
-
- public
- T pop()
- void push()
-
- private
- stdvectorltTgt heap
53Structure de données personnalisée
MyPriorityQueue
- templateltclass Tgt
- T MyPriorityQueuepop()
-
- // Lélément le plus grand est au début
- // du conteneur heap position 0.
- T value heap.front()
- // 1. Déplace le premier élément à la position
N-1. - // 2. Trie les éléments de la position 0 à N-2
- stdpop_heap(heap.begin(), heap.end(), Inf())
- // Supprime lélément en position N-1
- // cest à dire, lancien premier.
- heap.pop_back()
- return value
54Structure de données personnalisée
MyPriorityQueue
- templateltclass Tgt
- T MyPriorityQueuepush(T value)
-
- // Ajout de la valeur en queue du conteneur
- // position N.
- heap.push_back(value)
- // Trie les éléments de la position 0 à N.
- stdpush_heap(heap.begin(), heap.end(), Inf())
-
- return value
55Un peu de lecture
Game Programming Gems 1 by Mark de
DeLoura (Charles River Media ) August, 2000
http//www.gamedev.net http//www.gamasutra.com