55
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

Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

  • Upload
    lakia

  • View
    28

  • Download
    0

Embed Size (px)

DESCRIPTION

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. - PowerPoint PPT Presentation

Citation preview

Page 1: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Recherche de cheminsde coût minimal

avec l’algorithme A*Mise en œuvre pratique

Olivier NOCENTIUT de Reims-Châlons-Charlevillerue des crayères, BP 103551687 Reims Cedex 2

Page 2: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

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

Page 3: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Applications

Jeux vidéo 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, …)

Page 4: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Représentation du graphe à partir d’informations topographiques

Page 5: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Relations d’adjacence : grille carrée

Prairie

Rivière

Pont

Page 6: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Relations d’adjacence : grille hexagonale

Prairie

Rivière

Pont

Page 7: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Relations d’adjacence : points visibles

Obstacles

Couloirs

Page 8: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

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 »

Page 9: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Coût des arcs : grille carrée

1010

10

10

Page 10: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Coût des arcs : grille hexagonale

10

10

1010

10

10

10

10

10

10

10

10

Triangle équilatéral

Page 11: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Coût des arcs : pondération en fonction de la nature de l’environnement

10 1010

4010

4010

10

1040

10

10

10

80

10

40

10

40 80

40 40

80

40

80

Prairie

Montagne

Page 12: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Coût des arcs : pondération en fonction de la nature de l’agent

C C

Coût du franchissement d’un pont

C = 10 pour un humain.

C = 50 pour une voiture.

C = 500 pour un semi-remorque.

Page 13: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Algorithme A*

Page 14: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

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.

Page 15: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

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.

RemarqueDans le cas d’un algorithme de recherche plus classique (Dijsktra), on effectue une recherche exhaustive parmi TOUS les sommets.

Conséquencel’algorithme A* est plus performant que n’importe quel autre algorithme puisqu’il diminue l’ensemble des sommets à explorer.

Page 16: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

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.

RemarqueSi l’heuristique était supérieur au coût réel, on risquerait de générer un chemin qui ne soit pas minimal.

Page 17: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Distance euclidienne

S

D

40

H 20

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

Page 18: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Distance de Manhattan

S

D

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)

Page 19: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Algorithme A*InitialisationSommet source (S)Sommet destination (D)Liste des sommets à explorer (E) : sommet source SListe 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 totalChanger son prédécesseur

FinSiFinFaire

Page 20: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Exemple 1

S

D

S

D

Sommet source

Sommet destination

Obstacle

Page 21: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Exemple 1

S

D10 + 30

10 + 50

10 + 50

Sommet déjà visité

Sommet à explorer

G + H

Coût depuisla source

Coût versla destination

Référence auprédécesseur

Page 22: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Exemple 1

S

D10 + 30

10 + 50

10 + 50

20 + 40

20 + 40 Sommet déjà visité

Sommet à explorer

G + H

Coût depuisla source

Coût versla destination

Référence auprédécesseur

Page 23: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Exemple 1

S

D10 + 30

10 + 50

10 + 50

20 + 40

20 + 40

20 + 60

Sommet déjà visité

Sommet à explorer

G + H

Coût depuisla source

Coût versla destination

Référence auprédécesseur

Page 24: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Exemple 1

S

D10 + 30

10 + 50

10 + 50

20 + 40

20 + 40

20 + 60

20 + 60

Sommet déjà visité

Sommet à explorer

G + H

Coût depuisla source

Coût versla destination

Référence auprédécesseur

Page 25: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Exemple 1

S

D10 + 30

10 + 50

10 + 50

20 + 40

20 + 40

20 + 60

20 + 60

30 + 50 Sommet déjà visité

Sommet à explorer

G + H

Coût depuisla source

Coût versla destination

Référence auprédécesseur

Page 26: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Exemple 1

S

D10 + 30

10 + 50

10 + 50

20 + 40

20 + 40

20 + 60

20 + 60

30 + 50 30 + 30 Sommet déjà visité

Sommet à explorer

G + H

Coût depuisla source

Coût versla destination

Référence auprédécesseur

Page 27: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Exemple 1

S

D10 + 30

10 + 50

10 + 50

20 + 40

20 + 40

20 + 60

20 + 60

30 + 50 30 + 30 40 + 20 Sommet déjà visité

Sommet à explorer

G + H

Coût depuisla source

Coût versla destination

Référence auprédécesseur

Page 28: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Exemple 1

S

D10 + 30

10 + 50

10 + 50

20 + 40

20 + 40

20 + 60

20 + 60

30 + 50 30 + 30 40 + 20 50 + 10

50 + 10

Sommet déjà visité

Sommet à explorer

G + H

Coût depuisla source

Coût versla destination

Référence auprédécesseur

Page 29: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Exemple 1

S

10 + 30

10 + 50

10 + 50

20 + 40

20 + 40

20 + 60

20 + 60

30 + 50 30 + 30 40 + 20 50 + 10

50 + 10

60 + 20

60 + 0

Sommet déjà visité

Sommet à explorer

G + H

Coût depuisla source

Coût versla destination

Référence auprédécesseur

Page 30: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Exemple 1

S

D

Page 31: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Exemple 2

S

D

S

D

Sommet source

Sommet destination

Obstacle

Page 32: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Exemple 2

S

D

Sommet déjà visité

Sommet à explorer

G + H

Coût depuisla source

Coût versla destination

Référence auprédécesseur

10 + 50 10 + 30

Page 33: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Exemple 2

S

D

Sommet déjà visité

Sommet à explorer

G + H

Coût depuisla source

Coût versla destination

Référence auprédécesseur

10 + 50 10 + 30

Page 34: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Exemple 2

S

D

Sommet déjà visité

Sommet à explorer

G + H

Coût depuisla source

Coût versla destination

Référence auprédécesseur

10 + 50 10 + 30

20 + 60

20 + 40

Page 35: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Exemple 2

S

D

Sommet déjà visité

Sommet à explorer

G + H

Coût depuisla source

Coût versla destination

Référence auprédécesseur

10 + 50 10 + 30

20 + 60

20 + 40

30 + 50

Page 36: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Exemple 2

S

D

Sommet déjà visité

Sommet à explorer

G + H

Coût depuisla source

Coût versla destination

Référence auprédécesseur

10 + 50 10 + 30

20 + 60

20 + 40

30 + 50

Page 37: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Exemple 2

S

D

Sommet déjà visité

Sommet à explorer

G + H

Coût depuisla source

Coût versla destination

Référence auprédécesseur

10 + 50 10 + 30

20 + 60

20 + 40

30 + 50

30 + 70

Page 38: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Exemple 2

S

D

Sommet déjà visité

Sommet à explorer

G + H

Coût depuisla source

Coût versla destination

Référence auprédécesseur

10 + 50 10 + 30

20 + 60

20 + 40

30 + 50

30 + 70

40 + 60

40 + 80

Page 39: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Exemple 2

S

D

Sommet déjà visité

Sommet à explorer

G + H

Coût depuisla source

Coût versla destination

Référence auprédécesseur

10 + 50 10 + 30

20 + 60

20 + 40

30 + 50

30 + 70

40 + 60

40 + 80 50 + 70

50 + 50

Page 40: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Exemple 2

S

D

Sommet déjà visité

Sommet à explorer

G + H

Coût depuisla source

Coût versla destination

Référence auprédécesseur

10 + 50 10 + 30

20 + 60

20 + 40

30 + 50

30 + 70

40 + 60

40 + 80 50 + 70

50 + 50

60 + 60

60 + 40

Page 41: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Exemple 2

S

D

Sommet déjà visité

Sommet à explorer

G + H

Coût depuisla source

Coût versla destination

Référence auprédécesseur

10 + 50 10 + 30

20 + 60

20 + 40

30 + 50

30 + 70

40 + 60

40 + 80 50 + 70

50 + 50

60 + 60

60 + 40

70 + 50

70 + 30

Page 42: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Exemple 2

S

D

Sommet déjà visité

Sommet à explorer

G + H

Coût depuisla source

Coût versla destination

Référence auprédécesseur

10 + 50 10 + 30

20 + 60

20 + 40

30 + 50

30 + 70

40 + 60

40 + 80 50 + 70

50 + 50

60 + 60

60 + 40

70 + 50

70 + 30

80 + 40

80 + 20

Page 43: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Exemple 2

S

D

Sommet déjà visité

Sommet à explorer

G + H

Coût depuisla source

Coût versla destination

Référence auprédécesseur

10 + 50 10 + 30

20 + 60

20 + 40

30 + 50

30 + 70

40 + 60

40 + 80 50 + 70

50 + 50

60 + 60

60 + 40

70 + 50

70 + 30

80 + 40

80 + 20

90 + 10

Page 44: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Exemple 2

S

Sommet déjà visité

Sommet à explorer

G + H

Coût depuisla source

Coût versla destination

Référence auprédécesseur

10 + 50 10 + 30

20 + 60

20 + 40

30 + 50

30 + 70

40 + 60

40 + 80 50 + 70

50 + 50

60 + 60

60 + 40

70 + 50

70 + 30

80 + 40

80 + 20

90 + 10

100 + 0

Page 45: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Exemple 2

S

D

Page 46: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Structure des données : détail d’implémentation

InitialisationSommet source (S)Sommet destination (D)Liste des sommets à explorer (E) : sommet source SListe 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 totalChanger son prédécesseur

FinSiFinFaire

Page 47: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

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.

Page 48: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

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

};

tpush(t) pop()

Page 49: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

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*/ }

};

tpush(t) pop()

Page 50: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

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

41 7 20

15 25

Page 51: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

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

Page 52: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

Structure de données personnalisée : MyPriorityQueue

template<class T>class MyPriorityQueue{public :

T pop();void push();

private: std::vector<T> heap;

};

Page 53: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

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-2std::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;}

Page 54: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

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

Page 55: Recherche de chemins de coût minimal avec l’algorithme A* Mise en œuvre pratique

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