Les Graphes Les Graphes I.A. Session 2009/2010 E.P.S.I. Bordeaux – C.S.I.I – 2ème Année – Cours n°1 Les Graphes Définition • Un graphe est un ensemble de points (les sommets), reliés par des liens (les arêtes). • Exemples : – – – – Le plan des bus et des trams de Bordeaux Votre réseau d’amis sur Facebook Un site internet (pages = sommets, liens = arêtes) Une arborescence de fichiers • Note : un arbre est un type de graphe particulier ! Les Graphes Représentation d’un graphe Les Graphes Graphes orientés / non orientés Graphe non orienté 1→2=2→1 Graphe orienté 1→2≠2→1 On peut aller dans les deux sens, mais il faut le spécifier : Les Graphes Autres spécificités • Une arête est appelée « arc » dans le cas d’un graphe orienté. • Les arêtes peuvent être dotés d’un poids. – Poids = « péage » pour passer d’un sommet à un autre. – On dit alors que le graphe est valué. • Réflexivité. – Un sommet peut tout à fait être relié à lui-même. Les Graphes Connexité • La connexité d’un graphe signifie que tous les sommets du graphe sont accessibles entre eux. • Autrement dit, je peux me rendre de n’importe quel sommet à n’importe quel autre. Pas connexe Connexe Les Graphes Fermeture transitive • L’algorithme de fermeture transitive permet de vérifier la connexité d’un graphe. • Le principe est d’ajouter des arêtes au graphe de façon à ce que chaque sommet soit à une arête des autres sommets atteignables. Avant la fermeture transitive Après la fermeture transitive Les Graphes Représentation informatique • Sous forme de liste chainée. • Sous forme de matrice d’adjacence. – Exemple : Graphe Matrice d’adjacence • Note : un graphe non orienté est représenté par une matrice symétrique. Les Graphes Algorithmes courants • Algorithmes de parcours de graphes – Problème : visiter (une seule fois) tous les sommets • Algorithmes de recherche du plus court chemin – Problème : quel est le chemin le plus rapide pour aller du sommet A au sommet B ? Les Graphes Algorithmes de parcours • Parcours en largeur – In English : BFS for Breadth First Search • Parcours en profondeur – In English : DFS for Depth First Search Les Graphes Le parcours en profondeur 1 / 3 • Comment parcourir un labyrinthe sans tourner en rond ? – Toujours tourner à droite (ou à gauche, ce qui revient au même) à chaque intersection. • Le parcours en profondeur se base sur cette méthode. • Achtung ! L’algorithme du parcours en profondeur est récursif. Les Graphes Le parcours en profondeur 2 / 3 Algorithm dfs(x) { visit(x) for each y such that (x,y) is an edge do { if y was not visited yet then { dfs(y) } } } Les Graphes Le parcours en profondeur 3 / 3 • Exemple : Quel est le parcours en profondeur du graphe ci-contre ? Source : wikipédia Les Graphes Le parcours en profondeur 3 / 3 • Exemple : Quel est le parcours en profondeur du graphe ci-contre ? – Réponse : A, B, D, F, C, G, E. Source : wikipédia Les Graphes Le parcours en largeur 1 / 3 • Se fonde sur l’utilisation d’une file FIFO • Principe : (First In / First Out) 1. Enfiler le nœud de départ 2. Examiner le nœud du début de la file 3. Mettre tous ses voisins non examinés à la fin 4. Si la file n’est pas vide, reprendre à l’étape 2. • Cet algorithme est itératif. (il n’est pas récursif). Les Graphes Le parcours en largeur 2 / 3 Algorithm bfs() { visit(start node) queue ← start node while queue is not empty do { x ← queue for each y such that (x,y) is an edge and y has not been visited yet do { visit(y) queue ← y } } } Les Graphes Le parcours en largeur 3 / 3 • Exemple : Quel est le parcours en largeur du graphe ci-contre ? Source : wikipédia Les Graphes Le parcours en largeur 3 / 3 • Exemple : Quel est le parcours en largeur du graphe ci-contre ? – Réponse : A, B, C, E, D, F, G. Source : wikipédia Les Graphes Plus court chemin • Algorithme de Floyd-Warshall – Fonctionne pour les graphes orientés et valués. • Algorithme de Dijkstra – Fonctionne pour les graphes dont le poids des arêtes est positif ou nul. – Pas de boucle dans le graphe • Algorithme A* (prononcer : A étoile / A star) – Algorithme rapide. – Le chemin calculé n’est pas forcément le plus court ! – Souvent utilisé pour le pathfinding dans le jeu vidéo (car il privilégie la vitesse de calcul à l’exactitude des résultats) • Plusieurs autres algorithmes existent… Les Graphes Dijkstra - Principe 1. Assigner une distance de 0 au sommet initial et de ∞ à tous les autres sommets. 2. Marquer tous les sommets comme non visité. Marquer le sommet de départ comme sommet courant. 3. Calculer la distance depuis le sommet initial de tous les voisins non visités du sommet courant. Si la distance est inférieure à la distance précédente, remplacer la valeur sauvegardée. 4. Une fois que tous les voisins ont été visités, marquer le sommet courant comme visité. 5. Le sommet non visité avec la plus petite distance devient sommet courant, et on reprend depuis l’étape 3. Les Graphes Dijkstra - Algorithme Algorithm Djikstra(Graph, source) { for each vertex v in Graph { dist[v] ← infinity previous[v] ← undefined } dist[source] ← 0 // Previous node in optimal path from source Q ← the set of all nodes in Graph while Q is not empty { u ← vertex in Q with smallest dist[] if dist[u] = infinity { break // All remaining vertices are inaccessible from source } remove u from Q for each neighbor v of u { alt ← dist[u] + dist_between(u, v) if alt < dist[v] { dist[v] ← alt previous[v] ← u } } return dist[] } Les Graphes Dijkstra– Exemple 1 / 4 • Quel est le plus court chemin de A à J ? Les Graphes Dijkstra– Exemple 2 / 4 • Quel est le plus court chemin de A à J ? Les Graphes Dijkstra– Exemple 3/ 4 • Quel est le plus court chemin de A à J ? itérations Les Graphes Dijkstra– Exemple 4 / 4 • Quel est le plus court chemin de A à J ? Réponse : 487 Km, en suivant le trajet A–C–H–J Les Graphes Authors: Ophir Paz ([email protected] ) Geoffroy Vincens ([email protected]) Merci. “We are continually faced with a series of great opportunities brilliantly disguised as insoluble problems.” John W. Gardner