IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

58
IFT-2000: Structures de données Les graphes Dominic Genest, 2009

Transcript of IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Page 1: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

IFT-2000: Structures de données

Les graphes

Page 2: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Les graphes• Un graphe est un ensemble de nœuds connectés ou non par des arêtes.• Les nœuds ont souvent de l’information qui leur est associée, dont une partie sert à les identifier.

L’information propre à un nœud et qui sert à l’identifier s’appelle son étiquette.• Ces arêtes ont souvent des poids numériques, qui représente la plupart du temps une forme de coût

attribué au passage d’un nœud à un autre par cette arête. Par exemple, dans le cas où les nœuds d’un graphe représenteraient des villes, le poids pourrait représenter la distance entre deux villes.

• Il est à noter qu’un nœud peut ne pas être connecté à aucun autre, mais quand même faire partie du graphe. Par exemple, dans le schéma ci-bas, il s’agit bel et bien d’un seul graphe, mais avec deux composantes connexes.

A

F

G

DB

C

E2

3

8

3

9

82

Page 3: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Les graphes• Un nœud isolé est un nœud qui n’est connecté à aucun autre.• Un puits est un nœud qui n’est pas isolé mais duquel ne démarre

aucune arête. Dans le graphe ci-bas, les nœuds D et G sont des puits.

• Une source est un nœud qui n’est pas isolé mais auquel n’arrivent aucune arête. Dans le graphe ci-bas, seul le nœud A est une source.

A

F

G

DB

C

E2

3

8

3

9

82

Page 4: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Options d’un graphe• Un graphe peut être orienté ou non.

– Dans un graphe orienté, les arêtes ont des pointes de flèches et représentent la possibilité de passer d’un nœud à un autre, dans une seule direction. Dans un graphe orienté, si on veut permettre le passage dans les deux sens, il faut avoir deux arêtes.

– Dans un graphe non orienté, une arête n’a pas de pointe de flèche et sert donc toujours à représenter la permission de passer d’un nœud à un autre, dans les deux sens.

– Le choix d’utiliser un graphe orienté ou non dépend du contexte.• Un graphe peut être pondéré ou non.

– Un graphe pondéré est un graphe dans lequel chaque arête a une information numérique qui lui est associée, et qui doit être considérée dans certains algorithmes comme par exemple ceux qui tentent de trouver le chemin le plus court entre deux nœuds donnés.

– Dans certains contextes, les arêtes peuvent être considérées comme ayant toutes un poids égal, et donc il est inutile d’attribuer une valeur numérique à chaque arête. Il s’agira alors d’un graphe non pondéré.

• Un graphe peut être étiqueté ou non.– Dans certains contextes, on peut ne vouloir aucune étiquette attribuée aux nœuds. La

façon d’identifier un nœud en particulier sera, dans ces cas, peut-être l’indice d’un tableau du programme ou bien une adresse-mémoire. On peut en fait considérer que tout graphe est finalement étiqueté, mais que ce sont dans ces cas des éléments de l’implémentation qui feront office d’étiquette.

Page 5: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Un graphe étiqueté, orienté et pondéré

A

F

G

DB

C

E2

3

8

3

9

82

Page 6: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Un graphe étiqueté, orienté et non pondéré

A

F

G

DB

C

E

Page 7: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Un graphe étiqueté, non orienté et pondéré

A

F

G

DB

C

E2

3

8

3

9

82

Page 8: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Un graphe non étiqueté, non orienté et non pondéré

Page 9: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Les arêtes d’un nœud vers lui-même• Dans la plupart des cas, surtout pour les

graphes pondérés, une arête d’un nœud vers lui-même, de coût zéro, est sous-entendue pour chacun des nœuds du graphe.

A

F

G

DB

C

E2

3

8

3

9

82

0

0 0

0

0

0

0

Page 10: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Implantation d’un graphestruct route;typedef struct // Un noeud{

char nom[100]; // L’étiquette du noeudstruct route routes[1000];int nb_routes;

} Ville;typedef struct route // Une arête{

Ville *destination;float longueur; // Le poids de l’arête

} Route;typedef struct // Un graphe{

Ville *villes;int nb_villes;

} Pays;

Exemple #1:• Le graphe contient un tableau

dynamique de nœuds• Chaque nœud contient un

tableau statique d’arêtes• Chaque arête contient un

pointeur vers un nœud et un poids.

• Chaque route est représentée par DEUX objets « route », l’un dans chacune des deux villes qu’elle connecte.

Page 11: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Implémentation de quelques fonctionstypedef enum { OK, Erreur, VilleIntrouvable, VillePleine }

CodeErreur;CodeErreur initPays(Pays *pays){

pays->nb_villes=0;pays->villes=0;return OK;

}CodeErreur ajoute_ville(Pays *pays, const char *nom){

Ville *v = realloc(pays->villes,sizeof(Ville)*(pays->nb_villes+1));Ville *nouvelle_ville;if(!v) return Erreur;pays->villes = v;nouvelle_ville = &v[pays->nb_villes++];strcpy(nouvelle_ville ->nom,nom);nouvelle_ville->nb_routes=0;return OK;

}static Ville *trouve_ville(Pays *pays, const char *nom){

Ville *v;for(v=pays->villes;v!=&pays->villes[pays->nb_villes] && strcmp(v->nom,nom);v++);return v!=&pays->villes[pays->nb_villes] ? v : 0;

}CodeErreur ajoute_route(Pays *pays, const char

*nom_ville_1, const char *nom_ville_2, float distance)

{Ville *v1 = trouve_ville(pays,nom_ville_1) , *v2 = trouve_ville(pays,nom_ville_2);Route *r1, *r2;if(!v1 || !v2) return VilleIntrouvable;if(v1->nb_routes==100 || v2->nb_routes==100) return VillePleine;r1 = &v1->routes[v1->nb_routes++];r2 = &v2->routes[v2->nb_routes++];r1->longueur = distance;r2->longueur = distance;r1->destination = v2;r2->destination = v1;return OK;

}

Page 12: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Implantation d’un graphestruct route;typedef struct ville // Un noeud{

char nom[100]; // L’étiquette du noeudstruct route *premiere_route;ville *ville_suivante;

} Ville;typedef struct route // Une arête{

char nom_ville_destination[100];float longueur; // Le poids de l’arêtestruct route *route_suivante;

} Route;typedef struct // Un graphe{

Ville *premiere_ville;} Pays;

Exemple #2:• Le graphe contient le

point de départ d’une liste chaînée de nœuds

• Chaque nœud contient un point de départ d’une liste chaînée d’arêtes

• Chaque arête contient un identifiant de nœud et un poids.

Page 13: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Matrice d’adjacence d’un graphe pondéré

• Pour un graphe, une fois les nœuds déterminés, la présence d’arêtes et leurs poids peuvent être entièrement spécifiés par une matrice.

• Cette matrice doit avoir autant de rangées et de colonnes que de nœuds (donc autant de cases que le nombre de nœuds au carré).

• Dans le cas d’un graphe pondéré, chaque case de cette matrice contient le poids de l’arête qui permet de passer du nœud de la rangée en question au nœud de la colonne en question.

• L’inexistence d’arête est représentée par la valeur infini (∞).

Page 14: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Matrice d’adjacence d’un graphe pondéré

A

F

G

DB

C

E2

3

8

3

9

82

A B C D E F G

A 0 8 ∞ ∞ ∞ 2 3

B ∞ 0 2 9 ∞ ∞ ∞

C ∞ ∞ 0 8 ∞ ∞ ∞

D ∞ ∞ ∞ 0 ∞ ∞ ∞

E ∞ ∞ ∞ ∞ 0 ∞ ∞

F ∞ 3 ∞ ∞ ∞ 0 ∞

G ∞ ∞ ∞ ∞ ∞ ∞ 0

Page 15: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Matrice d’adjacence d’un graphe non pondéré

• Pour un graphe non pondéré, chaque case de la matrice d’adjacence contient un 1 s’il y a une arête qui permet de passer du nœud de la rangée en question au nœud de la colonne en question, ou un 0 sinon.

Page 16: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Matrice d’adjacence d’un graphe non pondéré

A

F

G

DB

C

E

A B C D E F GA 1 1 0 0 0 1 1B 0 1 1 1 0 0 0C 0 0 1 1 0 0 0D 0 0 0 1 0 0 0E 0 0 0 0 1 0 0F 0 1 0 0 0 1 0G 0 0 0 0 0 0 1

Page 17: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Implémentation par matrice d’adjacence• Si peu de nœuds sont nécessaires, il peut

s’avérer intéressant d’implémenter un graphe par sa matrice d’adjacence:

#define INFINI 9999999.0ftypedef float Graphe[20][20];void initGraphe(Graphe g){

int i,j;for(i=0;i<20;i++) for(j=0;j<20;j++) g[i][j]=0;

}void ajoutArete(Graphe g, int source, int

destination, float poids){

g[source][destination]=poids;}• On peut quand même associer de

l’information complémentaire aux nœuds et aux arêtes avec des structures auxiliaires, parallèlement à la matrice

d’adjacence.typedef struct{

char nom[100];float longueur;

} Route;typedef Arete Graphe[20][20];typedef struct{

char nom_ville[100];int nb_habitants;int annee_fondation;

} Ville;Typedef struct{

Route routes[20][20]; // Ceci est une matrice d’adjacenceVille villes[20];

} Pays;

Page 18: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Matrices d’adjacences

A

F

G

DB

C

EA B C D E F G

A 1 1 0 0 0 1 1B 0 1 1 1 0 0 0C 0 0 1 1 0 0 0D 0 0 0 1 0 0 0E 0 0 0 0 1 0 0F 0 1 0 0 0 1 0G 0 0 0 0 0 0 1

• Les puits, les sources et les nœuds isolés sont facilement identifiables dans une matrice d’adjacence.

Page 19: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Fermeture transitive d’un graphe

• La fermeture transitive d’un graphe est un autre graphe, construit à partir du premier.

• Il s’agit d’une copie du graphe, à laquelle on ajoute des arêtes.• Une arête est ajoutée pour chaque chemin indirect qui existe

dans le graphe initial.• Ainsi, soit un graphe donné, sa fermeture transitive est un

graphe qui contient, en plus de toutes les arêtes, d’autres arêtes indiquant toutes les connexions indirectes du graphe.

• De plus, pour les graphes pondérés, le poids de chaque arête du nouveau graphe donne le coût du chemin le plus court entre les deux nœuds de l’arête en question. Et ces coûts remplacent même, s’il y a lieu, les coûts des arêtes existantes dans le graphe initial.

Page 20: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Fermeture transitive d’un graphe pondéré

AF

G

DB

C

E2

38

3

9

82

AF

G

DB

C

E2

35

3

9

827 5

1214

Sa fermeture transitiveUn graphe pondéré

Page 21: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Fermeture transitive d’un graphe non pondéré

AF

G

DB

C

EA

F

G

DB

C

E

Sa fermeture transitiveUn graphe non pondéré

Page 22: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Matrice d’adjacence d’une fermeture transitive d’un graphe pondéré

A B C D E F GA 0 8 ∞ ∞ ∞ 2 3B ∞ 0 2 9 ∞ ∞ ∞C ∞ ∞ 0 8 ∞ ∞ ∞D ∞ ∞ ∞ 0 ∞ ∞ ∞E ∞ ∞ ∞ ∞ 0 ∞ ∞F ∞ 3 ∞ ∞ ∞ 0 ∞G ∞ ∞ ∞ ∞ ∞ ∞ 0

A B C D E F GA 0 5 7 14 ∞ 2 3B ∞ 0 2 9 ∞ ∞ ∞C ∞ ∞ 0 8 ∞ ∞ ∞D ∞ ∞ ∞ 0 ∞ ∞ ∞E ∞ ∞ ∞ ∞ 0 ∞ ∞F ∞ 3 5 12 ∞ 0 ∞G ∞ ∞ ∞ ∞ ∞ ∞ 0

La matrice d’adjacence d’un graphe pondéré

La matrice d’adjacence de sa fermeture transitive

Page 23: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Matrice d’adjacence d’une fermeture transitive d’un graphe non pondéré

A B C D E F GA 1 1 0 0 0 1 1B 0 1 1 1 0 0 0C 0 0 1 1 0 0 0D 0 0 0 1 0 0 0E 0 0 0 0 1 0 0F 0 1 0 0 0 1 0G 0 0 0 0 0 0 1

A B C D E F GA 1 1 1 1 0 1 1B 0 1 1 1 0 0 0C 0 0 1 1 0 0 0D 0 0 0 1 0 0 0E 0 0 0 0 1 0 0F 0 1 1 1 0 1 0G 0 0 0 0 0 0 1

La matrice d’adjacence d’un graphe non pondéré

La matrice d’adjacence de sa fermeture transitive

Page 24: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Algorithme de Warshall

• Pour construire la matrice d’adjacence de la fermeture transitive d’un graphe non pondéré à partir de sa matrice d’adjacence, il faut employer l’algorithme de Warshall:– Faire une copie du graphe.– Dans la copie, pour chaque nœud k:

• Pour chaque paire de nœuds {i,j}:– S’il n’existe pas déjà une arête entre i et j, vérifier s’il existe un chemin qui va de

i à k, puis un qui va de k à j. Si c’est le cas, ajouter une arête de i à j.

• Remarque: la vérification d’existence d’une arête se fait à même la copie, et non pas dans le graphe initial. Ainsi, le résultat progresse en accumulant de nouveaux chemins indirects.

Page 25: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Algorithme de Floyd-Warshall

• Pour construire la matrice d’adjacence de la fermeture transitive d’un graphe pondéré à partir de sa matrice d’adjacence, il faut employer l’algorithme de Floyd-Warshall:– Faire une copie du graphe.– Dans la copie, pour chaque nœud k:

• Pour chaque paire de nœuds {i,j}:– Vérifier si le coût du chemin va de i à k, additionné à celui qui va de k à j, ne serait pas

inférieur à celui précédemment trouvé pour aller de i à j. Si c’est le cas, remplacer le coût de l’arête de i à j par cette somme.

• Remarque: dans le cas d’un graphe pondéré, on peut considérer qu’il existe des arêtes en toute paire de nœuds, mais certaines avec un coût infini. Cela simplifie l’énoncé de l’algorithme.

Page 26: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Temps d’exécution des algorithmes de Warshall et de Floyd-Warshall

• Ces deux algorithmes exécutent autant de comparaisons que le cube du nombre de nœuds du graphe en question.

• Le résultat de cet algorithme, c’est-à-dire la fermeture transitive du graphe qu’on lui a donné en entrée, permet d’obtenir instantanément le coût du meilleur chemin entre toutes les paires de nœuds possibles d’un graphe.

• Un léger ajout à ces deux algorithmes permet de faire en sorte qu’ils fournissent non seulement le coût du meilleur chemin entre chaque paire de nœuds, mais aussi la description de ces chemins.

Page 27: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Algorithme de Floyd-Warshall modifié pour fournir la description des meilleurs chemins• Faire une copie du graphe.• Dans la copie, pour chaque nœud k:

– Pour chaque paire de nœuds {i,j}:• Vérifier si le coût du chemin va de i à k, additionné à celui qui va de k à j,

ne serait pas inférieur à celui précédemment trouvé pour aller de i à j. Si c’est le cas, remplacer le coût de l’arête de i à j par cette somme et prendre en note l’étiquette de k à côté de la case « i,j ».

• Les étiquettes k notées dans chaque case correspondent alors au « meilleur précédent » pour chaque paire de noeud.

• Pour obtenir le plus court chemin d’un nœud à un autre, il suffit alors de partir du dernier nœud, et de remonter jusqu’au début, de case en case, via ces étiquettes « k » notées à côté de chaque case, puis d’inverser la liste de nœuds parcourus par ce processus.

Page 28: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Matrice d’adjacence d’une fermeture transitive d’un graphe pondéré

A B C D E F GA 0 5 (F) 7 (B) 14 (B) ∞ 2 (A) 3 (A)B ∞ 0 2 (B) 9 (B) ∞ ∞ ∞C ∞ ∞ 0 8 (C) ∞ ∞ ∞D ∞ ∞ ∞ 0 ∞ ∞ ∞E ∞ ∞ ∞ ∞ 0 ∞ ∞F ∞ 3 (F) 5 (B) 12 (B) ∞ 0 ∞G ∞ ∞ ∞ ∞ ∞ ∞ 0

Résultat de Floyd-Warshall modifié pour

fournir la description des meilleurs chemins:

AF

G

DB

C

E2

38

3

9

82

Page 29: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Plus court chemin entre deux noeuds• S’il s’agit d’un graphe non pondéré, on peut aussi obtenir la description des chemins les

plus courts en modifiant l’algorithme de Warshall de la même façon.• S’il s’agit d’un graphe pondéré mais qu’on ce qu’on veut, c’est le chemin le plus court en

terme de nombre d’étapes plutôt que de coût total, alors il suffit d’utiliser l’algorithme de Warshall plutôt que Floyd-Warshall même si c’est un graphe pondéré.– Par exemple, on pourrait vouloir découvrir le trajet en avion impliquant le moins d’escales

possibles, quitte à ce qu’il dure plus longtemps.• Toutefois, ces algorithmes sont souvent inappropriés pour la situation la plus courante,

c’est-à-dire celle où on veut le plus court chemin entre deux nœuds bien particuliers, plutôt que d’avoir tous les plus courts chemins entre toutes les paires de nœuds possibles.

• Si on détermine deux nœuds et qu’on ne s’intéresse qu’au plus court chemin dans un graphe entre ces deux nœuds-là, il faut utiliser l’un ou l’autre des algorithmes suivants:– S’il s’agit d’un graphe non pondéré ou si c’est le nombre d’arêtes qu’on veut minimiser: parcours

en largeur.– S’il s’agit d’un graphe pondéré dont tous les poids sont positifs: l’algorithme de Dijkstra.– S’il s’agit d’un graphe pondéré mais qui possède des arêtes avec des poids négatifs: l’algorithme

de Bellman-Ford.– S’il s’agit d’un graphe avec beaucoup de nœuds, mais dont la résolution peut être simplifiée par

une heuristique (par exemple, un graphe euclidien représentant un labyrinthe avec de grandes salles qui sont une grille de noeuds): l’algorithme A*.

Page 30: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Le parcours en profondeur1. Initialiser (mettre à « faux ») une marque (une valeur

booléenne) associée à chaque nœud.2. Empiler et marquer le nœud de départ.3. Tant et aussi longtemps que la pile n’est pas vide:

a) Dépiler un nœud, et lui faire le traitement voulu pour le parcours (par exemple, afficher sa valeur à l’écran).

b) Pour chacun de ses voisins qui n’est pas marqué:i. Le marquer.ii. L’empiler.

Remarque: Ce parcours n’est pas approprié pour retrouver le chemin le plus court entre deux nœuds donnés. Il est cependant très facile à implanter par une fonction récursive.

Dominic Genest, 2009

Page 31: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Parcours en profondeur

AF

G

DB

C

E

A

Nœud de départ

Pile

Page 32: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Parcours en profondeur

AF

G

DB

C

ENœud de départ

Pile

Dépilé: A

Page 33: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Parcours en profondeur

AF

G

DB

C

E

G ; B ; F

Nœud de départ

Pile

Dépilé: A

Page 34: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Parcours en profondeur

AF

G

DB

C

E

G ; B

Nœud de départ

Pile

Dépilé: F

Page 35: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Parcours en profondeur

AF

G

DB

C

E

G

Nœud de départ

Pile

Dépilé: B

Page 36: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Parcours en profondeur

AF

G

DB

C

E

G ; C ; D

Nœud de départ

Pile

Dépilé: B

Page 37: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Parcours en profondeur

AF

G

DB

C

E

G ; C

Nœud de départ

Pile

Dépilé: D

Page 38: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Parcours en profondeur

AF

G

DB

C

E

G

Nœud de départ

Pile

Dépilé: C

Page 39: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Parcours en profondeur

AF

G

DB

C

ENœud de départ

Pile

Dépilé: G

Page 40: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Parcours en profondeur

AF

G

DB

C

ENœud de départ

Pile

FIN

Page 41: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Le parcours en largeur1. Initialiser (mettre à « faux ») une marque (une valeur

booléenne) associée à chaque nœud.2. Enfiler et marquer (mettre sa marque à « vrai ») le nœud de

départ.3. Tant et aussi longtemps que la file n’est pas vide:

a) Défiler le prochain nœud.b) Pour chaque voisin qui n’est pas marqué:

i. Le marquerii. L’enfiler.

Remarque: S’il s’agit d’un parcours fait pour retrouver un chemin comportant le plus petit nombre d’étapes entre deux nœuds donnés, alors on peut s’arrêter dès qu’on atteint le nœud d’arrivée. Aussi, si on veut la description de ce chemin, il faut mémoriser le meilleur précédent pour chaque nœud, un peu de la même façon que la modification qui a été faite à l’algorithme de Warshall.

Page 42: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Parcours en largeur

AF

G

DB

C

E

A

Nœud de départ

File

✓ ()

()

()()

()

()

()

Page 43: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Parcours en largeur

AF

G

DB

C

ENœud de départ

File

✓ ()

()

()()

()

()

()

Défilé: A

Page 44: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Parcours en largeur

AF

G

DB

C

E

G ; B ; F

Nœud de départ

File

()

(A)

(A)()

()

()

(A)

Défilé: A

Page 45: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Parcours en largeur

AF

G

DB

C

E

B ; F

Nœud de départ

File

()

(A)

(A)()

()

()

(A)

Défilé: G

Page 46: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Parcours en largeur

AF

G

DB

C

E

F

Nœud de départ

File

()

(A)

(A)()

()

()

(A)

Défilé: B

Page 47: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Parcours en largeur

AF

G

DB

C

E

F ; C ; D

Nœud de départ

File

()

(A)

(A)()

(B)

(B)

(A)

Défilé: B

Page 48: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Parcours en largeur

AF

G

DB

C

E

C ; D

Nœud de départ

File

()

(A)

(A)()

(B)

(B)

(A)

Défilé: F

Page 49: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Parcours en largeur

AF

G

DB

C

E

D

Nœud de départ

File

()

(A)

(A)()

(B)

(B)

(A)

Défilé: C

Page 50: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Parcours en largeur

AF

G

DB

C

ENœud de départ

File

()

(A)

(A)()

(B)

(B)

(A)

Défilé: D

Page 51: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Parcours en largeur

AF

G

DB

C

ENœud de départ

File

()

(A)

(A)()

(B)

(B)

(A)

Meilleur chemin entre A et D:

D

Page 52: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Parcours en largeur

AF

G

DB

C

ENœud de départ

File

()

(A)

(A)()

(B)

(B)

(A)

Meilleur chemin entre A et D:

D

Page 53: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Parcours en largeur

AF

G

DB

C

ENœud de départ

File

()

(A)

(A)()

(B)

(B)

(A)

Meilleur chemin entre A et D:

B D

Page 54: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Parcours en largeur

AF

G

DB

C

ENœud de départ

File

()

(A)

(A)()

(B)

(B)

(A)

Meilleur chemin entre A et D:

B D

Page 55: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

Parcours en largeur

AF

G

DB

C

ENœud de départ

File

()

(A)

(A)()

(B)

(B)

(A)

Meilleur chemin entre A et D:

A B D

Page 56: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

L’algorithme de Dijkstra1. Initialiser toutes les marques à « faux », puis tous les meilleurs coûts à

« infini ».2. Mettre le meilleur coût du nœud de départ à zéro.3. Tant et aussi longtemps qu’il reste des nœuds qui ne sont pas

marqués:a) Choisir le nœud x, parmi ceux qui ne sont pas marqués, qui a le plus petit

« meilleur coût ».b) Marquer ce nœud x.c) Mettre à jour les meilleurs coûts et meilleurs précédents de chacun de ses

voisins, en considérant le chemin que procure x en tant qu’intermédiaire.

4. Procéder comme d’habitude pour retrouver le meilleur chemin, c’est-à-dire à l’aide des valeurs « meilleurs précédent », à partir du nœud d’arrivée.

Remarque: il ne s’agit pas d’un parcours.

Page 57: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

L’algorithme de Bellman-Ford1. Initialiser tous les meilleurs coûts à « infini » (il n’y a pas de marque

pour cet algorithme-ci).2. Mettre le meilleur coût du nœud de départ à zéro.3. Répéter autant de fois qu’il y a de nœuds, moins 1:

a) Pour chaque arête:i. Mettre à jour le meilleur coût et le meilleur précédent du nœud au bout de l’arête,

en considérant le chemin que procure le nœud au départ de l’arête en tant qu’intermédiaire.

4. Répéter encore ça une autre fois, et si jamais ça change quelque chose aux meilleurs coûts, c’est signe qu’il y a un cycle négatif et donc qu’il n’existe pas de solution. Si cette nième répétition ne change rien aux meilleurs coûts, alors la solution est celle retrouvée par la méthode habituelle utilisant les meilleurs précédents à partir de la fin.

Remarque: il ne s’agit pas d’un parcours.

Page 58: IFT-2000: Structures de données Les graphes Dominic Genest, 2009.

Dominic Genest, 2009

L’algorithme A*

• Il s’agit exactement de la même chose que Dijkstra, sauf que lorsqu’on élit le nœud aillant le plus petit « meilleur coût », on additionne chaque « meilleur coût » à une estimation du coût de ce nœud vers le nœud d’arrivée (exemple, distance à vol d’oiseau).

• Cet algorithme est la base de bien des algorithmes en intelligence artificielle.