5. Problème de parcours des graphes 1 Algorithmes de parcours d’un graphe Définition Définition On appelle exploration ou parcours d’un graphe, tout procédé déterministe qui permet de choisir, à partir des sommets visités d’un graphe ou d’un arbre, le sommet suivant à visiter. Le problème consiste à déterminer un ordre sur les visites des sommets. ➔ Le problème consiste à déterminer un ordre sur les visites des sommets. N.B La notion d’exploration / parcours peut être utilisée dans les graphes orientés comme non-orientés. 2 2 Algorithmes de parcours d’un graphe ○ ○ Permet ainsi de calculer les distances de tous les noeuds depuis un nœud source dans un graphe non valué (orienté ou non orienté). Il permet aussi de déterminer si un graphe est connexe ou non en basant le calcule sur les composantes connexes du graphe Pour vérifier la connexité d’un graphe non orienté, il suffit pour cela d’appliquer un des algorithmes suivants: ○ ➢ Parcours en Largeur (Breadth-First Search) ➢ Parcours en Profondeur (Depth-First Search) 3 3 Algorithmes de parcours d’un graphe ○ ○ Ces parcours sont des algorithmes de marquage qui permettent d’explorer complètement un graphe à partir d’un sommet quelconque Avant de présenter les algorithmes de parcours des graphes, il faut tout d’abord définir deux concepts de base: Racine: Le sommet de départ, fixé à l’avance, dont on souhaite visiter tous les descendants est appelé racine de l’exploration Parcours: Un parcours de racine r est une suite L de sommets telle que: 1. r est le premier sommet de L, 2. chaque sommet apparaît une fois et une seule dans L, 3. tout sommet sauf la racine est adjacent à un sommet 4 placé avant lui dans la liste. 4 Algorithmes de parcours d’un graphe Parcours en largeur ○ ○ ○ Un parcours en largeur explore le graphe à partir d’un sommet donné (sommet de départ ou sommet source). L’algorithme simule la transmission d’un message à partir d’un sommet source, en utilisant l’idée suivante : tout sommet qui reçoit le message, le transférera à tous ses voisins qui ne l’auront pas encore reçu On continue avec le même principe jusqu’à visiter tous les sommets du graphe, auquel cas le parcours est terminé ou bien reprend en un sommet non encore visité 5 5 Algorithmes de parcours d’un graphe Parcours en largeur • Un parcours en largeur (BFS) permet le parcours d'un graphe en commençant par explorer un noeud source, puis ses successeurs, puis les successeurs non explorés des successeurs. Propriétés de l’algorithme BFS ✓ BFS est un algorithme de parcours de graphe par recherche en largeur d'abord (Breadth First Search). ✓ Fonctionne avec les graphes orientés et non-orientés. ✓ Permet la détection de cycle si on considère le graphe non-orienté. ✓ Permet la détection de Composantes Simplement Connexes si il reste des sommets non traités après un premier passage (rapide en pratique) 6 6 Algorithmes de parcours d’un graphe Parcours en largeur Deux contraintes sont à respecter pour ce type de parcours sont : ✓ Un sommet déjà visité ne doit pas être revisité. ✓ On explore les sommets successeurs directs. • L'algorithme de base repose sur l'utilisation d'une pile qui va maintenir à jour la liste des sommets à visiter. 7 7 Parcours en largeur: Exemple illustratif Exemple: Prenons le graphe G ci-dessous . Imaginons que nous voulions parcourir le graphe en largeur en partant du sommet 1. Résultat: Le parcours en largeur de ce graphe donnerait la liste suivante : 1 2 3 4 6 5 7 8. Une autre solution serait la suivante : 1 3 2 6 4 5 8 7. ➔ Elles sont toutes les deux valables. 8 8 Parcours en largeur: Exemple illustratif 1. On part du sommet 1, on liste tous les sommets successeurs, il s'agit donc des sommets 2 et 3. Marquons-les d’une couleur différente pour ne pas les passer deux fois. 2. Il n'y a plus de sommets directement accessibles à partir du sommet 1. Il faut donc maintenant chercher ceux qui sont accessibles en passant par un sommet. Ceci revient en fait à chercher les successeurs des sommets précédemment parcourus. On doit donc parcourir à nouveau en largeur mais en partant des sommets précédemment explorés. On commence par le sommet 2, le seul successeur est le sommet 4, on l'affiche et on le marque comme étant parcouru. On passe au sommet 3, tout comme le sommet 2, il n'a qu'un seul successeur. On le marque comme déjà parcouru. 3. Il faut donc parcourir en partant des sommets 4 et 6. Le sommet 4 a deux successeurs, le sommet 5 et le sommet 6. Or le sommet 6 a déjà été visité, on ne doit donc pas le mettre dans la file des sommets à parcourir. On ajoutera seulement le sommet 5 à la file des sommets à parcourir. 4. Concernant le parcours à partir du sommet 6, il n'y a rien à faire, en effet, celuici n'a pas de successeurs. On réitère le processus jusqu'à avoir parcouru tous nos sommets. 9 9 Parcours en largeur: Exemple illustratif • Les nœuds sont marqués en fonction de leur ordre de visite par le BFS : le nœud n°1 correspond donc à l'origine. Les nœuds en cours de visite (c'est à dire présents dans la file) sont coloriés en bleu. Les nœuds déjà visités et extraits de la file sont coloriés en vert 10 10 Parcours en largeur: Pseudocode 11 11 Algorithmes de parcours d’un graphe Parcours en profondeur ○ ○ ○ Principe: explore un sommet et essaie d'aller le plus loin possible. Quand ce n'est pas possible, on revient en arrière et on essaie de parcourir en profondeur en prenant un sommet qui n'a pas encore été visité. La recherche reprend en un sommet non encore visité ou bien se termine. 12 12 Algorithmes de parcours d’un graphe Parcours en profondeur Principe de DFS: ✓ Si un sommet n'a pas été visité alors il faut le parcourir en profondeur. S'il a déjà été visité, alors il ne faut rien faire. ✓ L'exploration récursive s'arrête tout simplement lorsque on a parcouru tous les sommets. • Il est très simple de montrer que l'algorithme se termine puisque le graphe a un nombre fini de sommets et qu'à chaque exploration dans le graphe, on diminue le nombre de sommets qui n'ont pas encore été visités. • Le parcours consiste donc à marquer le sommet courant puis pour tous les sommets si successeurs, faire un parcours en profondeur si13le sommet n'a pas été marqué. 13 Algorithmes de parcours d’un graphe Parcours en profondeur 14 14 Comparaison entre BFS et DFS • Dans le cas de DFS, les sommets sont explorés dans l'arbre "de haut en bas", alors que pour BFS ils sont explorés "par niveaux" 15 15