Recherche de chemins de coût minimal avec l’algorithme A

Slides:



Advertisements
Présentations similaires
La recherche de chemin optimal
Advertisements

Théorie des graphes.
Cours n° 7 Standard Template Library II.
Cours n° 6 Standard Template Library I.
Algorithmes et structures de données avancés

Cours n° 9 Conception et Programmation à Objets
Cours n° 8 Conception et Programmation à Objets
La programmation générique avec la STL EIUMLV - Informatique et Réseaux 99 Benoît ROMAND.
Mise à Niveau en Recherche Opérationnelle
Introduction à la Théorie des Graphes
Plus rapide chemin bicritère : un problème d’aménagement du territoire
R.K.Ahuja & James B.Orlin (1988)
Cours 8 Arbres équilibrés
Structures collectives en Java
Structures de données linéaires
Plus courts chemins On présente dans ce chapitre un problème typique de cheminement dans les graphes : la recherche d'un plus court chemin entre deux sommets.
Prise de décision dans les shooters TER 08/09 Sandrine Buendia
Structures de données et algorithmes – C5 Maria-Iuliana Dascalu, PhD
Heuristiques A. Introduction B. Recherche d ’une branche
Leçon 6 : Structures de données dynamiques IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier.
Bibliothèque standard du C++
Les systèmes de jeux deviennent de plus en plus complexes, nécessitant que lIntelligence Artificielle progresse elle aussi en parallèle. Dans ce contexte,
Standard Template Library (STL)
Structures de données IFT-2000
Traiter des Données avec la STL
LES ARBRES IUP 2 Génie Informatique
Algorithme de Bellman-Ford
Structures de données IFT-2000
Structures de données IFT-2000
Arbres Rouge noir Démo : INF3105 Structures de données et algorithmes
Structures de données IFT-2000
Structures de données IFT-2000
Structures de données IFT-2000
Structures de données IFT-2000 Abder Alikacem Standard Template library Édition Septembre 2009 Département dinformatique et de génie logiciel.
Structures de données IFT-2000
Structures de données IFT-2000
IFT Complexité et NP-complétude
CSI 4506: Introduction à l’intelligence artificielle

Algorithmes d ’approximation
Optimisation dans les réseaux
Recherche Opérationnelle
Standard Template Library
21 février 2006Cours de graphes 2 - Intranet1 Cours de graphes Les plus courts chemins, les chemins les plus légers : à laide de la vague, à laide de la.
Les Algorithmes de Tri Introduction Tri par Sélection
IFT-2000: Structures de données Piles et files Dominic Genest, 2009.
Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009.
Structures de données IFT-2000
Pour le chemin le plus court pour tous les couples
Heuristiques C. Recherche de la meilleure branche . Branch And Bound
Graphes 1. Introduction 2. Définition 3. Représentation mémoire
Dév. d’application interactive III Recherche de chemin.
Templates, Containers et STL Structures de données de base tableau, liste chaînée file, pile, arbres, hashtable collection, ensemble 2 caractéristiques.
Méthodes de tri.
Licence Informatique Algorithmique des graphes
LE FLOT MAXIMAL et LA COUPE MINIMALE
Powerpoint Templates Page 1 Powerpoint Templates BE Graphe : Algorithme de Dijsktra Distribution d’un algorithme Jeudi 7 mai 2012 RULLIER Anthony.
Ceci est un graphe valué Des arcs : 1-2, 1-4, 7-10,…..
ETNA – 1ème année Guillaume Belmas –
CSI 4506: Introduction à l’Intelligence Artificielle
Les tris Tri Action de mettre une structure de données en ordre (croissant ou décroissant). Le plus simple est d’insérer en ordre. Les algorithmes de tri.
Structures de données IFT-2000
Sixième étape : pondérer les graphes. Longueur d’une chaîne d’un graphe quelconque = nombre des arêtes qui la constituent. Distance entre deux sommets.
Structures de données IFT-2000
1 Listes des méthodes de la classe string, et exemples.
31/05/2007Projet Master 11 Présentation ludique de la recherche opérationnelle à la fête de la science Année universitaire 2006/2007 Sylvain FIX Julien.
CSI2510 Structures de données et algorithmes Plus court chemin
Traversées (Parcours ) de graphes
Projet Théorie des graphes
Transcription de la présentation:

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 1035 51687 Reims Cedex 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, …)

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, …)

Représentation du graphe à partir d’informations topographiques

Relations d’adjacence : grille carrée Prairie Pont Rivière

Relations d’adjacence : grille hexagonale Prairie Pont Rivière

Relations d’adjacence : points visibles Obstacles Couloirs

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 »

Coût des arcs : grille carrée 10 10 10 10

Coût des arcs : grille hexagonale 10 Triangle équilatéral

Coût des arcs : pondération en fonction de la nature de l’environnement 10 40 80 Prairie Montagne

Coût des arcs : pondération en fonction de la nature de l’agent Coût du franchissement d’un pont C = 10 pour un humain. C = 50 pour une voiture. C = 500 pour un semi-remorque. C C

Algorithme A*

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.

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.

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.

Distance 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

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

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

Exemple 1 S Sommet source D Sommet destination D Obstacle S

Exemple 1 D S G + H Sommet déjà visité Sommet à explorer 10 + 30 Coût depuis la source Coût vers la destination 10 + 50 S G + H 10 + 50 Référence au prédécesseur

Exemple 1 D S G + H Sommet déjà visité Sommet à explorer 20 + 40 10 + 30 D Coût depuis la source Coût vers la destination 10 + 50 S G + H 10 + 50 Référence au prédécesseur

Exemple 1 D S G + H Sommet déjà visité Sommet à explorer 20 + 40 10 + 30 D Coût depuis la source Coût vers la destination 10 + 50 S G + H 20 + 60 10 + 50 Référence au prédécesseur

Exemple 1 D S G + H Sommet déjà visité Sommet à explorer 20 + 40 10 + 30 D Coût depuis la source Coût vers la destination 10 + 50 S G + H 20 + 60 10 + 50 20 + 60 Référence au prédécesseur

Exemple 1 D S G + H Sommet déjà visité Sommet à explorer 30 + 50 20 + 40 Sommet déjà visité Sommet à explorer 20 + 40 10 + 30 D Coût depuis la source Coût vers la destination 10 + 50 S G + H 20 + 60 10 + 50 20 + 60 Référence au prédécesseur

Exemple 1 D S G + H Sommet déjà visité Sommet à explorer 30 + 50 20 + 40 30 + 30 Sommet déjà visité Sommet à explorer 20 + 40 10 + 30 D Coût depuis la source Coût vers la destination 10 + 50 S G + H 20 + 60 10 + 50 20 + 60 Référence au prédécesseur

Exemple 1 D S G + H Sommet déjà visité Sommet à explorer 30 + 50 20 + 40 30 + 30 40 + 20 Sommet déjà visité Sommet à explorer 20 + 40 10 + 30 D Coût depuis la source Coût vers la destination 10 + 50 S G + H 20 + 60 10 + 50 20 + 60 Référence au prédécesseur

Exemple 1 D S G + H Sommet déjà visité Sommet à explorer 30 + 50 20 + 40 30 + 30 40 + 20 50 + 10 Sommet déjà visité Sommet à explorer 20 + 40 10 + 30 D 50 + 10 Coût depuis la source Coût vers la destination 10 + 50 S G + H 20 + 60 10 + 50 20 + 60 Référence au prédécesseur

Exemple 1 S G + H Sommet déjà visité Sommet à explorer 30 + 50 20 + 40 30 + 30 40 + 20 50 + 10 Sommet déjà visité Sommet à explorer 20 + 40 10 + 30 60 + 0 50 + 10 Coût depuis la source Coût vers la destination 10 + 50 S 60 + 20 G + H 20 + 60 10 + 50 20 + 60 Référence au prédécesseur

Exemple 1 D S

Exemple 2 S Sommet source D Sommet destination D Obstacle S

Exemple 2 D S G + H Sommet déjà visité Sommet à explorer Coût depuis la source Coût vers la destination 10 + 50 S 10 + 30 G + H Référence au prédécesseur

Exemple 2 D S G + H Sommet déjà visité Sommet à explorer Coût depuis la source Coût vers la destination 10 + 50 S 10 + 30 G + H Référence au prédécesseur

Exemple 2 D S G + H Sommet déjà visité Sommet à explorer 20 + 40 Coût depuis la source Coût vers la destination 10 + 50 S 10 + 30 G + H 20 + 60 Référence au prédécesseur

Exemple 2 D S G + H Sommet déjà visité Sommet à explorer 30 + 50 20 + 40 D Coût depuis la source Coût vers la destination 10 + 50 S 10 + 30 G + H 20 + 60 Référence au prédécesseur

Exemple 2 D S G + H Sommet déjà visité Sommet à explorer 30 + 50 20 + 40 D Coût depuis la source Coût vers la destination 10 + 50 S 10 + 30 G + H 20 + 60 Référence au prédécesseur

Exemple 2 D S G + H Sommet déjà visité Sommet à explorer 30 + 50 20 + 40 D Coût depuis la source Coût vers la destination 10 + 50 S 10 + 30 G + H 20 + 60 30 + 70 Référence au prédécesseur

Exemple 2 D S G + H Sommet déjà visité Sommet à explorer 30 + 50 20 + 40 D Coût depuis la source Coût vers la destination 10 + 50 S 10 + 30 G + H 20 + 60 40 + 60 30 + 70 Référence au prédécesseur 40 + 80

Exemple 2 D S G + H Sommet déjà visité Sommet à explorer 30 + 50 20 + 40 D Coût depuis la source Coût vers la destination 10 + 50 S 10 + 30 G + H 20 + 60 40 + 60 50 + 50 30 + 70 Référence au prédécesseur 40 + 80 50 + 70

Exemple 2 D S G + H Sommet déjà visité Sommet à explorer 30 + 50 20 + 40 D Coût depuis la source Coût vers la destination 10 + 50 S 10 + 30 G + H 20 + 60 40 + 60 50 + 50 60 + 40 30 + 70 Référence au prédécesseur 40 + 80 50 + 70 60 + 60

Exemple 2 D S G + H Sommet déjà visité Sommet à explorer 30 + 50 20 + 40 D Coût depuis la source Coût vers la destination 10 + 50 S 10 + 30 G + H 20 + 60 40 + 60 50 + 50 60 + 40 70 + 30 30 + 70 Référence au prédécesseur 40 + 80 50 + 70 60 + 60 70 + 50

Exemple 2 D S G + H Sommet déjà visité Sommet à explorer 30 + 50 20 + 40 D Coût depuis la source Coût vers la destination 10 + 50 S 10 + 30 G + H 80 + 20 20 + 60 40 + 60 50 + 50 60 + 40 70 + 30 30 + 70 Référence au prédécesseur 40 + 80 50 + 70 60 + 60 70 + 50 80 + 40

Exemple 2 D S G + H Sommet déjà visité Sommet à explorer 30 + 50 20 + 40 D Coût depuis la source Coût vers la destination 10 + 50 S 10 + 30 90 + 10 G + H 80 + 20 20 + 60 40 + 60 50 + 50 60 + 40 70 + 30 30 + 70 Référence au prédécesseur 40 + 80 50 + 70 60 + 60 70 + 50 80 + 40

Exemple 2 S G + H Sommet déjà visité Sommet à explorer 30 + 50 20 + 40 100 + 0 Coût depuis la source Coût vers la destination 10 + 50 S 10 + 30 90 + 10 G + H 80 + 20 20 + 60 40 + 60 50 + 50 60 + 40 70 + 30 30 + 70 Référence au prédécesseur 40 + 80 50 + 70 60 + 60 70 + 50 80 + 40

Exemple 2 D S

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

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.

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()

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()

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

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

Structure de données personnalisée : MyPriorityQueue template<class T> class MyPriorityQueue { public : T pop(); void push(); private: std::vector<T> heap; };

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; }

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; }

Un peu de lecture Game Programming Gems 1 by Mark de DeLoura (Charles River Media ) August, 2000 http://www.gamedev.net http://www.gamasutra.com