Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parRoxanne Evrard Modifié depuis plus de 10 années
1
Recherche de chemins de coût minimal avec l’algorithme A
Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique Olivier NOCENT IUT de Reims-Châlons-Charleville rue des crayères, BP Reims Cedex 2
2
Introduction Objectif : Déterminer, pour un agent* donné, un chemin de coût minimum depuis un sommet source vers un sommet destination au sein d’un graphe orienté. Un agent est un objet informatique autonome utilisé pour représenter une entité mobile dotée d’un comportement (humain, animal, véhicule, …)
3
Applications Jeux vidéo Simulation – vie artificielle
Animation des personnages non joueurs (RPG, FPS) Déplacement réaliste d’un personnage contrôlé par le joueur vers un objectif désigné par le joueur (RTS) Simulation – vie artificielle Etude du comportement d’une foule, du traffic automobile, … Effets spéciaux (scènes de bataille, …)
4
Représentation du graphe à partir d’informations topographiques
5
Relations d’adjacence : grille carrée
Prairie Pont Rivière
6
Relations d’adjacence : grille hexagonale
Prairie Pont Rivière
7
Relations d’adjacence : points visibles
Obstacles Couloirs
8
Coût des arcs Signification du coût d’un arc : Distance kilométrique
Recherche de chemins de longueur minimale Temps (nécessaire au franchissement de l’arc) Recherche de chemins en temps minimum Consommation de carburant Rechercher de chemins « économes »
9
Coût des arcs : grille carrée
10 10 10 10
10
Coût des arcs : grille hexagonale
10 Triangle équilatéral
11
Coût des arcs : pondération en fonction de la nature de l’environnement
10 40 80 Prairie Montagne
12
Coût des arcs : pondération en fonction de la nature de l’agent
Coût du franchissement d’un pont C = pour un humain. C = pour une voiture. C = pour un semi-remorque. C C
13
Algorithme A*
14
Principe général : évaluation du coût total d’un 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 l’arc (i,j) H : Coût vers la destination Difficile puisque le reste du chemin (vers la destination) est encore inconnu.
15
Coût vers la destination
Pourquoi évaluer un coût vers la destination ? Afin de resserrer l’ensemble des sommets à explorer en privilégiant les sommets « qui semblent » nous rapprocher de la destination. Remarque Dans le cas d’un algorithme de recherche plus classique (Dijsktra), on effectue une recherche exhaustive parmi TOUS les sommets. Conséquence l’algorithme A* est plus performant que n’importe quel autre algorithme puisqu’il diminue l’ensemble des sommets à explorer.
16
Coû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. Remarque Si l’heuristique était supérieur au coût réel, on risquerait de générer un chemin qui ne soit pas minimal.
17
Distance euclidienne Théorème de Pythagore H 2 = (Coté oppose) 2 +
(Coté adjacent) 2 H 2 = = 2000 H = 20 x (5) 1/2 S 40 H 20 D
18
Distance 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
19
Algorithme 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 n’est 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 à l’ancien) Alors Changer son coût total Changer son prédécesseur FinSi FinFaire
20
Exemple 1 S Sommet source D Sommet destination D Obstacle S
21
Exemple 1 D S G + H Sommet déjà visité Sommet à explorer 10 + 30
Coût depuis la source Coût vers la destination S G + H Référence au prédécesseur
22
Exemple 1 D S G + H Sommet déjà visité Sommet à explorer 20 + 40
D Coût depuis la source Coût vers la destination S G + H Référence au prédécesseur
23
Exemple 1 D S G + H Sommet déjà visité Sommet à explorer 20 + 40
D Coût depuis la source Coût vers la destination S G + H Référence au prédécesseur
24
Exemple 1 D S G + H Sommet déjà visité Sommet à explorer 20 + 40
D Coût depuis la source Coût vers la destination S G + H Référence au prédécesseur
25
Exemple 1 D S G + H Sommet déjà visité Sommet à explorer 30 + 50
Sommet déjà visité Sommet à explorer D Coût depuis la source Coût vers la destination S G + H Référence au prédécesseur
26
Exemple 1 D S G + H Sommet déjà visité Sommet à explorer 30 + 50
Sommet déjà visité Sommet à explorer D Coût depuis la source Coût vers la destination S G + H Référence au prédécesseur
27
Exemple 1 D S G + H Sommet déjà visité Sommet à explorer 30 + 50
Sommet déjà visité Sommet à explorer D Coût depuis la source Coût vers la destination S G + H Référence au prédécesseur
28
Exemple 1 D S G + H Sommet déjà visité Sommet à explorer 30 + 50
Sommet déjà visité Sommet à explorer D Coût depuis la source Coût vers la destination S G + H Référence au prédécesseur
29
Exemple 1 S G + H Sommet déjà visité Sommet à explorer 30 + 50 20 + 40
Sommet déjà visité Sommet à explorer 60 + 0 Coût depuis la source Coût vers la destination S G + H Référence au prédécesseur
30
Exemple 1 D S
31
Exemple 2 S Sommet source D Sommet destination D Obstacle S
32
Exemple 2 D S G + H Sommet déjà visité Sommet à explorer
Coût depuis la source Coût vers la destination S G + H Référence au prédécesseur
33
Exemple 2 D S G + H Sommet déjà visité Sommet à explorer
Coût depuis la source Coût vers la destination S G + H Référence au prédécesseur
34
Exemple 2 D S G + H Sommet déjà visité Sommet à explorer 20 + 40
Coût depuis la source Coût vers la destination S G + H Référence au prédécesseur
35
Exemple 2 D S G + H Sommet déjà visité Sommet à explorer 30 + 50
D Coût depuis la source Coût vers la destination S G + H Référence au prédécesseur
36
Exemple 2 D S G + H Sommet déjà visité Sommet à explorer 30 + 50
D Coût depuis la source Coût vers la destination S G + H Référence au prédécesseur
37
Exemple 2 D S G + H Sommet déjà visité Sommet à explorer 30 + 50
D Coût depuis la source Coût vers la destination S G + H Référence au prédécesseur
38
Exemple 2 D S G + H Sommet déjà visité Sommet à explorer 30 + 50
D Coût depuis la source Coût vers la destination S G + H Référence au prédécesseur
39
Exemple 2 D S G + H Sommet déjà visité Sommet à explorer 30 + 50
D Coût depuis la source Coût vers la destination S G + H Référence au prédécesseur
40
Exemple 2 D S G + H Sommet déjà visité Sommet à explorer 30 + 50
D Coût depuis la source Coût vers la destination S G + H Référence au prédécesseur
41
Exemple 2 D S G + H Sommet déjà visité Sommet à explorer 30 + 50
D Coût depuis la source Coût vers la destination S G + H Référence au prédécesseur
42
Exemple 2 D S G + H Sommet déjà visité Sommet à explorer 30 + 50
D Coût depuis la source Coût vers la destination S G + H Référence au prédécesseur
43
Exemple 2 D S G + H Sommet déjà visité Sommet à explorer 30 + 50
D Coût depuis la source Coût vers la destination S G + H Référence au prédécesseur
44
Exemple 2 S G + H Sommet déjà visité Sommet à explorer 30 + 50 20 + 40
Coût depuis la source Coût vers la destination S G + H Référence au prédécesseur
45
Exemple 2 D S
46
Structure des données : détail d’implé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 n’est 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 à l’ancien) Alors Changer son coût total Changer son prédécesseur FinSi FinFaire
47
Structure des données : détail d’implé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 d’un élément déjà présent dans le conteneur. Déterminer si le conteneur est vide.
48
Solution « élégante » : files
Template <class T> class std::queue { public: … bool empty(); T pop() {return pop_front();} void push(T t) { push_back(t);} }; t push(t) pop()
49
Solution « élégante » : files à priorité
Le type T doit surcharger l’opérateur de comparaison < Template <class T> class std::priority_queue { public: … bool empty(); T pop() {return pop_front();} void push(T t) { /*insertion triée*/ } }; t push(t) pop()
50
Insertion triée « efficace »
Utilisation d’un 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 1 4 7 20 15 25
51
Structure des données : std::priority_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 d’un élément déjà présent dans le conteneur : NON Déterminer si le conteneur est vide : OUI
52
Structure de données personnalisée : MyPriorityQueue
template<class T> class MyPriorityQueue { public : T pop(); void push(); private: std::vector<T> heap; };
53
Structure de données personnalisée : MyPriorityQueue
template<class T> T MyPriorityQueue::pop() { // 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 std::pop_heap(heap.begin(), heap.end(), Inf()); // Supprime l’élément en position N-1 // c’est à dire, l’ancien premier. heap.pop_back(); return value; }
54
Structure de données personnalisée : MyPriorityQueue
template<class T> T MyPriorityQueue::push(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. std::push_heap(heap.begin(), heap.end(), Inf()); return value; }
55
Un peu de lecture Game Programming Gems 1 by Mark de DeLoura
(Charles River Media ) August, 2000
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.