• Aucun résultat trouvé

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

N/A
N/A
Protected

Academic year: 2022

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

Copied!
55
0
0

Texte intégral

(1)

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

(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

 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

(6)

Relations d’adjacence : grille hexagonale

Prairie Pont

(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

10 10 10

10

10 10

10

10

10 10

10

Triangle équilatéral

(11)

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

10 10 10

10 40

40 10

10

40 10

10 10

10 80

10

40

10

40 80

40 40

80

40 80

Prairie Montagne

(12)

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.

(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

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

(18)

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)

(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

(20)

Exemple 1

S

D

S

D

Sommet source

Sommet destination Obstacle

(21)

Exemple 1

S

10 + 30

D

10 + 50 10 + 50

Sommet déjà visité Sommet à explorer

G + H

Coût depuis la source

Coût vers la destination

Référence au

(22)

Exemple 1

S

10 + 30

D

10 + 50 10 + 50

20 + 40

20 + 40 Sommet déjà visité

Sommet à explorer

G + H

Coût depuis la source

Coût vers la destination

(23)

Exemple 1

S

10 + 30

D

10 + 50 10 + 50

20 + 40

20 + 40

20 + 60

Sommet déjà visité Sommet à explorer

G + H

Coût depuis la source

Coût vers la destination

Référence au

(24)

Exemple 1

S

10 + 30

D

10 + 50 10 + 50

20 + 40

20 + 40

20 + 60

20 + 60

Sommet déjà visité Sommet à explorer

G + H

Coût depuis la source

Coût vers la destination

(25)

Exemple 1

S

10 + 30

D

10 + 50 10 + 50

20 + 40

20 + 40

20 + 60

20 + 60

30 + 50 Sommet déjà visité

Sommet à explorer

G + H

Coût depuis la source

Coût vers la destination

Référence au

(26)

Exemple 1

S

10 + 30

D

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 depuis la source

Coût vers la destination

(27)

Exemple 1

S

10 + 30

D

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 depuis la source

Coût vers la destination

Référence au

(28)

Exemple 1

S

10 + 30

D

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 depuis la source

Coût vers la destination

(29)

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 depuis la source

Coût vers la destination

Référence au

(30)

Exemple 1

S

D

(31)

Exemple 2

S

D

S

D

Sommet source

Sommet destination Obstacle

(32)

Exemple 2

S

D

Sommet déjà visité Sommet à explorer

G + H

Coût depuis la source

Coût vers la destination 10 + 50 10 + 30

(33)

Exemple 2

S

D

Sommet déjà visité Sommet à explorer

G + H

Coût depuis la source

Coût vers la destination

Référence au 10 + 50 10 + 30

(34)

Exemple 2

S

D

Sommet déjà visité Sommet à explorer

G + H

Coût depuis la source

Coût vers la destination 10 + 50 10 + 30

20 + 60 20 + 40

(35)

Exemple 2

S

D

Sommet déjà visité Sommet à explorer

G + H

Coût depuis la source

Coût vers la destination

Référence au 10 + 50 10 + 30

20 + 60 20 + 40 30 + 50

(36)

Exemple 2

S

D

Sommet déjà visité Sommet à explorer

G + H

Coût depuis la source

Coût vers la destination 10 + 50 10 + 30

20 + 60 20 + 40 30 + 50

(37)

Exemple 2

S

D

Sommet déjà visité Sommet à explorer

G + H

Coût depuis la source

Coût vers la destination

Référence au 10 + 50 10 + 30

20 + 60 20 + 40 30 + 50

30 + 70

(38)

Exemple 2

S

D

Sommet déjà visité Sommet à explorer

G + H

Coût depuis la source

Coût vers la destination

Référence au 10 + 50 10 + 30

20 + 60 20 + 40 30 + 50

30 + 70

40 + 60

(39)

Exemple 2

S

D

Sommet déjà visité Sommet à explorer

G + H

Coût depuis la source

Coût vers la destination

Référence au prédécesseur 10 + 50 10 + 30

20 + 60 20 + 40 30 + 50

30 + 70

40 + 60 50 + 50

(40)

Exemple 2

S

D

Sommet déjà visité Sommet à explorer

G + H

Coût depuis la source

Coût vers la destination

Référence au 10 + 50 10 + 30

20 + 60 20 + 40 30 + 50

30 + 70

40 + 60 50 + 50 60 + 40

(41)

Exemple 2

S

D

Sommet déjà visité Sommet à explorer

G + H

Coût depuis la source

Coût vers la destination

Référence au prédécesseur 10 + 50 10 + 30

20 + 60 20 + 40 30 + 50

30 + 70

40 + 60 50 + 50 60 + 40 70 + 30

(42)

Exemple 2

S

D

Sommet déjà visité Sommet à explorer

G + H

Coût depuis la source

Coût vers la destination

Référence au 10 + 50 10 + 30

20 + 60 20 + 40 30 + 50

30 + 70

40 + 60 50 + 50 60 + 40 70 + 30 80 + 20

(43)

Exemple 2

S

D

Sommet déjà visité Sommet à explorer

G + H

Coût depuis la source

Coût vers la destination

Référence au prédécesseur 10 + 50 10 + 30

20 + 60 20 + 40 30 + 50

30 + 70

40 + 60 50 + 50 60 + 40 70 + 30 80 + 20 90 + 10

(44)

Exemple 2

S

Sommet déjà visité Sommet à explorer

G + H

Coût depuis la source

Coût vers la destination

Référence au 10 + 50 10 + 30

20 + 60 20 + 40 30 + 50

30 + 70

40 + 60 50 + 50 60 + 40 70 + 30 80 + 20 90 + 10 100 + 0

(45)

Exemple 2

S

D

(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

(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

(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

(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

4

1 7 20

(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

http://www.gamedev.net

Références

Documents relatifs

Si l'on en croit Jesse Fox, auteur principal d'une étude et professeur assistante en communication à l'Université de l'Ohio, les hommes qui publient beaucoup de selfies sur

Pour un objet en rotation, la vitesse moyenne se calcule avec la formule v = π×D×n , ou π×D représente la distance parcourue en 1 tour et n la fréquence de rotation..

Les élèves ne disposant pour l’instant que d’informations qualitatives sur l’énergie potentielle et l’énergie cinétique d’un système, le but de

marge brute – remise – prix d’achat net – prix de vente hors taxe – coût d’achat prix de vente toute taxe comprise – prix d’achat net – frais d’achat – prix

En traction, torsion ou flexion il est possible de résoudre un système qui est hyperstatique et d’en déterminer sa déformation, ou la contrainte. Pour cela la même méthode pour

Sony a également annoncé qu'il se lancerait directement sur le marché du jeu sur portable. Sa PlayStation Suite 20 distribuera d'anciens jeux pour.. PlayStation 21 One 22 pour

On décompose le volume du liquide en rotation en couronnes cylindriques de rayon r, d’épaisseur dr et de hauteur z(r). Exprimer le volume dV d’une telle couronne. En supposant que

Elle est d’autant plus importante que la masse de la charge est grande et s’oppose à la mise en mouvement. Elle est caractérisée par le moment d’inertie J, qui s’exprime en