441 likes | 881 Views
Les Graphes. I.A. Session 2009/2010. E.P.S.I. Bordeaux – C.S.I.I – 2 ème Année – Cours n°1. 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
E N D
Les Graphes I.A. Session 2009/2010 E.P.S.I. Bordeaux – C.S.I.I – 2ème Année – Cours n°1
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 !
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 :
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.
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. Connexe Pas connexe
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
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.
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 ?
Algorithmes de parcours • Parcours en largeur • In English : BFS for Breadth First Search • Parcours en profondeur • In English : DFS for Depth First Search
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.
Le parcours en profondeur 2 / 3 Algorithmdfs(x) { visit(x) foreach y such that (x,y) is an edge do { if y was not visited yet then { dfs(y) } } }
Le parcours en profondeur 3 / 3 • Exemple : Quel est le parcours en profondeur du graphe ci-contre ? Source : wikipédia
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
Le parcours en largeur 1 / 3 • Se fonde sur l’utilisation d’une file FIFO (First In / First Out) • Principe : 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).
Le parcours en largeur 2 / 3 Algorithmbfs() { 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 } } }
Le parcours en largeur 3 / 3 • Exemple : Quel est le parcours en largeur du graphe ci-contre ? Source : wikipédia
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
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…
Dijkstra - Principe • Assigner une distance de 0 au sommet initial et de ∞ à tous les autres sommets. • Marquer tous les sommets comme non visité. Marquer le sommet de départ comme sommet courant. • 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. • Une fois que tous les voisins ont été visités, marquer le sommet courant comme visité. • Le sommet non visité avec la plus petite distance devient sommet courant, et on reprend depuis l’étape 3.
Dijkstra - Algorithme AlgorithmDjikstra(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[] }
Dijkstra– Exemple 1 / 4 • Quel est le plus court chemin de A à J ?
Dijkstra– Exemple 2 / 4 • Quel est le plus court chemin de A à J ?
Dijkstra– Exemple 3/ 4 • Quel est le plus court chemin de A à J ? itérations
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
Authors: Ophir Paz (ophir.paz@nova-box.com ) GeoffroyVincens (geoffroy.vincens@nova-box.com) Merci. “We are continually faced with a series of great opportunities brilliantly disguised as insoluble problems.” John W. Gardner