Traversées (Parcours ) de graphes

Slides:



Advertisements
Présentations similaires
Introduction à la Théorie des graphes
Advertisements

Explorer un espace d’états
Algorithmes et structures de données avancées Cours 7
Algorithmes et structures de données avancées Cours 4
Algorithmes et structures de données avancées Cours 6 Patrick Reuter
Structures de données et complexité
Introduction à l’Algorithmique
Introduction à la Théorie des graphes
Cours d’Algorithmique
Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.
Modélisation par le concept de graphe
Bloc1 : Théorie des graphes et problèmes d’ordonnancement
A.Faÿ 1 Recherche opérationnelle Résumé de cours.
Chapitre VI. Arbres (définition, parcours, représentation)
Chapitre VIII. Introduction aux graphes
Classification multiclasses
Structures de données linéaires
Cours d’Algorithmique
Structures de données et algorithmes – C5 Maria-Iuliana Dascalu, PhD
Les structures de données arborescentes
II. Chaînage, SDD séquentielles
Heuristiques A. Introduction B. Recherche d ’une branche
Leçon 6 : Structures de données dynamiques IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier.
IFT313 Introduction aux langages formels
Détection de co-évolution de gènes Master 2 : Informatique à Finalité Professionnelle et Recherche Unifiée (IFPRU) Parcours Ingénierie de lIntelligence.
Module 4 : Parcours dans un graphe
Pr ZEGOUR Djamel Eddine
LES ARBRES IUP 2 Génie Informatique
Examen intra #1 Types abstraits, liste, pile, file et file prioritaire. Les graphes Récursivité.
Structures de données IFT-2000
Structures de données IFT-2000
Structures de données IFT-2000
Structures de données IFT-2000
Structures de données IFT-2000
Coloration gap sommet identifiante de graphes
Présentation Structures de Données et TDA

Algorithmes d ’approximation
Programmation linéaire et Recherche opérationnelle
Les arbres binaires.
21 février 2006Cours de graphes 2 - Intranet1 Cours de graphes Les plus courts chemins, les chemins les plus légers : à laide de la vague, à laide de la.
Gestion de Fichiers GF-10: Traitement Co-Sequentiel: Appariment et Fusion de Plusieures Listes (Base sur les sections de Folk, Zoellick & Riccardi,
Atelier de formation : MAT optimisation II (les graphes).
Structures de données IFT-10541
Algorithmique et structures de données en C
Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009.
Pour le chemin le plus court pour tous les couples
INF1101 Algorithmes et structures de données
Structures de données IFT-2000 Abder Alikacem La récursivité Département d’informatique et de génie logiciel Édition Septembre 2009.

Graphes 1. Introduction 2. Définition 3. Représentation mémoire
LES PILES ET FILES.
Méthodes de tri.
Arbres binaires et tables de hachage
Chaînage et LSC : motivation et principe Manipuler la LSC : exemples Variantes : LDC, liste circulaire, … Etude de cas : réalisation d’un buffer clavier.
Modèles Mathématiques et représentation discrètes pour la description des images couleur Luc Brun.
ETNA – 1ème année Guillaume Belmas –
La récursivité Mireille Goud HEG Vd AlgSD - Résurisivité.

Ajouts et retraits dans un arbre de connexion Nicolas Thibault et Christian Laforest, Équipe OPAL Laboratoire IBISC (regroupement LaMI et LSC), Évry 8.
Structures de données IFT-2000
Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département d’informatique et de génie logiciel Édition Septembre 2009.
Arbres Arbres Arbres binaires Propriétés des arbres binaires
4/25/2017 4:30 PM Arbres (2,4) CSI2510 CSI2510.
CSI25101 Tri Plus efficace. CSI25102 Tri récursif Le tri récursif divise les données de grande taille en deux presque moitiés et est appelé récursivement.
CSI2510 Structures de données et algorithmes Plus court chemin
CSI2510 Structures de données et algorithmes Arbres couvrants minimaux
Les arbres Arbres binaires
Techniques d’Optimisation Chapitre 2: Problème de flôt Dr TARI Abdelkamel Mars 2014.
Cycle, Cocycle, Arbre et Arborescence
Transcription de la présentation:

Traversées (Parcours ) de graphes B A C E

Un sous-graphe couvrant Sous-graphes Un sous-graphe S d’un graphe G est un graphe tel que Les sommets de S forment un sous-ensemble des sommets de G Les arêtes de S forment un sous-ensemble des arêtes de G Un sous-graphe couvrant d’un graphe G est un sous-graphe contenant tous les sommets de G sous-graphe Un sous-graphe couvrant

Un graphe non-connexe ayant deux composantes connexes Connexité Un graphe est connexe s’il existe un chemin entre chaque paire de sommets. Une composante connexe d'un graphe G est un sous-graphe G'=(V',E') connexe maximal (pour l'inclusion) : il n'est pas possible d'ajouter à V' d'autres sommets en conservant la connexité du sous-graphe. graphe connexe Un graphe non-connexe ayant deux composantes connexes

Arbres et forêts Un arbre est un graphe non-orienté T tel que T est connexe T est acyclique (sans cycles) Une forêt est un graphe non-orienté acyclique (sans cycles) une collection des arbres Les composantes connexes d’une forêt sont des arbres arbre Forêt

Arbres et forêts couvrants Un arbre couvrant d’un graphe connexe est un sous-graphe couvrant qui est un arbre Un arbre couvrant n’est pas unique sauf si le graphe est un arbre Arbres couvrant ont applications à design de réseaux informatiques Une forêt couvrante d’un graphe est un sous-graphe couvrant qui est une forêt Graphe Arbre couvrant

Traversées de graphes Traversée d’un graphe G: Visite tous les sommets et toutes les arêtes de G Détermine si G est connexe ou non Trouve les composantes connexes de G Trouve un arbre/une forêt couvrante pour G

Parcours en profondeur:DFS (Depth-First Search) B A C E

Parcours en profondeur Le parcours en profondeur est une technique pour traverser les graphes qui: Prends un temps en O(n + m ) pour un graphe avec n sommets et m arêtes peut être modifié pour résoudre d’autres problèmes sur les graphes Trouver et retourner un chemin entre deux sommets donnés Trouver un cycle dans le graphe

Parcours en profondeur L’idée: recherche qui progresse à partir d'un sommet S en s'appelant récursivement pour chaque sommet voisin de S. Le nom d'algorithme en profondeur est dû au fait qu’il explore « à fond » les chemins un par un: pour chaque sommet, il prend le premier sommet voisin jusqu'à ce qu'un sommet n'aie plus de voisins (ou que tous ses voisins soient marqués), et revient alors au sommet père.

Algorithme DFS avec une pile B A C E (A,B)

Visités : {1} À visiter 9 8 11 7 10 1 6 2 12 3 4 5 Depth-First Search 4/26/2017 8:31 AM 2 8 10 11 9 7 6 5 3 4 12 1 Visités : {1} À visiter

POP: (1,2) Visités : {1,2} T={(1,2)} PUSH Depth-First Search 4/26/2017 8:31 AM 2 8 10 11 9 7 6 5 3 4 12 1 Visités : {1} (1,2) (1,11) (1,10) POP: (1,2) Visités : {1,2} T={(1,2)} PUSH À visiter

POP: (1,2) Visités : {1,2} T={(1,2)} PUSH Depth-First Search 4/26/2017 8:31 AM 2 8 10 11 9 7 6 5 3 4 12 1 Visited : {1} (1,11) (1,10) POP: (1,2) Visités : {1,2} T={(1,2)} PUSH À visiter

POP: (2,3) Visités : {1,2,3} T={(1,2), (2,3)} 8 10 11 9 7 6 5 3 4 12 1 POP: (2,3) Visités : {1,2,3} T={(1,2), (2,3)} (2,3) (2,10) (1,11) (1,10) PUSH À visiter

POP: (2,3) Visités : {1,2,3} T={(1,2), (2,3)} 8 10 11 9 7 6 5 3 4 12 1 POP: (2,3) Visités : {1,2,3} T={(1,2), (2,3)} (2,10) (1,11) (1,10) PUSH À visiter

PUSH À visiter 9 8 11 7 10 1 6 2 12 3 4 5 (3,12) (3,4) (2,10) (1,11) (1,10) PUSH À visiter

Depth-First Search 4/26/2017 8:31 AM T={(1,2), (2,3)} (3,12) (3,4) (2,10) (1,11) (1,10) 9 8 11 7 10 1 6 2 12 3 4 5

POP  (3,12) Visités : {1,2,3,12} T={(1,2), (2,3), (3,12)} Depth-First Search 4/26/2017 8:31 AM 2 8 10 11 9 7 6 5 3 4 12 1 (3,12) (3,4) (2,10) (1,11) (1,10) (3,4) (2,10) (1,11) (1,10) PUSH (rien à empiler ici) POP  (3,12) Visités : {1,2,3,12} T={(1,2), (2,3), (3,12)}

Depth-First Search 4/26/2017 8:31 AM (3,4) (2,10) (1,11) (1,10) 9 8 11 7 10 1 6 2 12 3 4 5 T={(1,2), (2,3), (3,12)}

… POP  (3,4) Visités : {1,2,3,12,4} T={(1,2), (2,3), (3,12), (3,4)} Depth-First Search 4/26/2017 8:31 AM (3,4) (2,10) (1,11) (1,10) 9 8 11 7 10 1 6 2 12 3 4 5 (4,10) (4,5) (2,10) (1,11) (1,10) POP  (3,4) Visités : {1,2,3,12,4} T={(1,2), (2,3), (3,12), (3,4)} PUSH (4,4) and (4,10) POP  (4,10) Visités : {1,2,3,12,4,10} T={(1,2), (2,3), (3,12), (3,4), (4,10)} PUSH (10,6) and (10,8) (10,8) (10,6) (4,5) (2,10) (1,11) (1,10) …

Depth-First Search 4/26/2017 8:31 AM (10,8) (10,6) (4,5) (2,10) (1,11) (1,10) 9 8 11 7 10 1 6 2 12 3 4 5 T={(1,2), (2,3), (3,12), (3,4), (4,10)} …

Complexité O(n+m) Nombre de PUSH: m Nombre de POP: m Visite de noeuds: n O(n+m)

Algorithme DFS - récursif Version simple DFS(v) Marquer v visité w  Adj(v) Si w n’est pas visité T = T  (v,w) DFS(w)

DFS encore - plus de détails… L'algorithme utilise un mécanisme pour placer et obtenir les “étiquettes” des sommets et arêtes Algorithm DFS(G, v) Entrée graphe G et un sommet de début v de G Sortie étiquetage des arêtes de G dans le composant connexe de v comme arêtes découvertes et arêtes de retour setLabel(v, VISITED) for all e  G.incidentEdges(v) if getLabel(e) = UNEXPLORED w  opposite(v,e) if getLabel(w) = UNEXPLORED setLabel(e, DISCOVERY) DFS(G, w) else setLabel(e, BACK) Algorithm DFS(G) Entrée graphe G Sortie étiquetage des arêtes de G comme arêtes découvertes et arêtes de retour for all u  G.vertices() setLabel(u, UNEXPLORED) for all e  G.edges() setLabel(e, UNEXPLORED) for all v  G.vertices() if getLabel(v) = UNEXPLORED DFS(G, v)

Exemple Algorithm DFS(G, v) setLabel(v, VISITED) for all e  G.incidentEdges(v) if getLabel(e) = UNEXPLORED w  opposite(v,e) if getLabel(w) = UNEXPLORED setLabel(e, DISCOVERY) DFS(G, w) else setLabel(e, BACK) A Sommets UNEXPLORED A Sommets VISITED Arêtes UNEXPLORED Arêtes DISCOVERY Arêtes BACK D B A C E D B A C E

D B A C E Algorithm DFS(G, v) setLabel(v, VISITED) for all e  G.incidentEdges(v) if getLabel(e) = UNEXPLORED w  opposite(v,e) if getLabel(w) = UNEXPLORED setLabel(e, DISCOVERY) DFS(G, w) else setLabel(e, BACK) D B A C E D B A C E

Algorithm DFS(G, v) setLabel(v, VISITED) for all e  G.incidentEdges(v) if getLabel(e) = UNEXPLORED w  opposite(v,e) if getLabel(w) = UNEXPLORED setLabel(e, DISCOVERY) DFS(G, w) else setLabel(e, BACK) D B A C E D B A C E D B A C E

DFS et traversée de labyrinthe L'algorithme de DFS est similaire à une stratégie classique pour explorer un labyrinthe Nous marquons chaque intersection, chaque coin et chaque cul de sac (sommet) visité Nous marquons chaque couloir (arête) traversé Nous prenons note du chemin de retour à l'entrée (le sommet du début) au moyen d'une corde (la pile de récursion)

Propriétés du DFS Propriété 1 DFS(G, v) visite tous les sommets et les arêtes dans le composant connexe de v Propriété 2 Les arêtes découvertes par DFS(G, v) forment un arbre couvrant des composantes connexes de v D B A C E

Complexité de DFS récursif + etiquetage Chaque sommet est étiquetté deux fois Une fois “non-exploré” Une fois “visité” Chaque arête est étiquettée deux fois Une fois “non-explorée” Une fois “découverte” ou “retour” L’opération incidentEdges est appelée une fois pour chaque sommet 2n 2m

Avec Liste d’adjacence: La complexité total de DFS est donc O(n + m) si le graphe est représenté avec une liste d’adjacence O(n + m) = O(m) Conclusion Avec Liste d’adjacence: O(m) Cas pire: m = O(n2)

Chemin entre deux sommets Nous pouvons spécialiser l'algorithme de DFS pour trouver un chemin entre deux sommets donnés u et z Nous appelons DFS(G, u) avec u comme le sommet de début Nous utilisons une pile S pour prendre note du chemin entre le sommet de début et le sommet actuel Aussitôt que le sommet de destination z est rencontré, nous retournons le chemin comme éléments stockés dans la pile

2 2 1 3 2 -- 6 4 1 4 3 5 5 6 6 Algorithm pathDFS(G, v, z) setLabel(v, VISITED) S.push(v) if v = z return S.elements() for all e  G.incidentEdges(v) if getLabel(e) = UNEXPLORED w  opposite(v,e) if getLabel(w) = UNEXPLORED setLabel(e, DISCOVERY) S.push(e) pathDFS(G, w, z) S.pop(e) else setLabel(e, BACK) S.pop(v) 5 6 6

Trouver un cycle dans un graphe Nous pouvons spécialiser l'algorithme de DFS pour trouver un cycle Nous utilisons une pile S pour prendre note du chemin entre le sommet de début v et le sommet actuel Aussitôt qu’une arête retour (v, w) est rencontrée, nous retournons le cycle comme la portion des éléments de la pile du sommet (top) au sommet w

Algorithm cycleDFS(G, v, z) setLabel(v, VISITED) S.push(v) for all e  G.incidentEdges(v) if getLabel(e) = UNEXPLORED w  opposite(v,e) S.push(e) if getLabel(w) = UNEXPLORED setLabel(e, DISCOVERY) pathDFS(G, w, z) S.pop(e) else T  new empty stack repeat o  S.pop() T.push(o) until o = w return T.elements() S.pop(v)

Parcours en largeur :BFS (Breadth-First Search)

Parcours en largeur Le parcours en largeur est une technique pour traverser les graphes qui: prends temps O(n + m ) sur un graphe avec n sommets et m arêtes peut être modifié pour résoudre d’autres problèmes sur les graphes Découvrir et retourner d’un chemin entre deux sommets donnés avec le minimum d’arêtes Trouve un cycle simple dans le graphe s’il y en a un

Parcours en largeur L’idée: Cet algorithme liste d'abord les voisins de S pour ensuite les explorer un par un. L0 A L1 B C D L2 E F niveau par niveau

On pourrait utiliser une file dans laquelle on prend le premier sommet et place en dernier ses voisins encore non-explorés.

Parcours en largeur avec une file 5 6 4 1 2 3 visité : {1} à visiter : {(1,2), (1,6)} T =  (1,2) – 2 est visité ? visité : {1,2} à visiter : {(1,6), (2,4), (2,5)} T = {(1,2)} (1,6) - 6 est visité ? visité : {1,2,6} à visiter : {(2,4), (2,5), (6,5)} T = {(1,2), (1,6)}

visité : {1,2,6} à visiter : {(2,4), (2,5), (6,5)} T = {(1,2), (1,6)} 5 6 4 1 2 3 (2,4) - 4 est visité ? visité : {1,2,6,4} à visiter : {(2,5), (6,5), (4,5), (4,3)} T = {(1,2), (1,6), (2,4)} (2,5) - 5 est visité ? visité : {1,2,6,4,5} à visiter : {(6,5), (4,5), (4,3)} T = {(1,2), (1,6), (2,4), (2,5)} (6,5) - 5? déjà visité! (4,5) - 5? déjà visité! (4,3) - 3?

BFS avec etiquettes En utilisant une sequence pour chaque niveau L0 L1 D L2 E F

Exemple L0 L1 L0 L0 L1 L1 C B A E D F A Sommets UNEXPLORED A Sommets VISITED Arêtes UNEXPLORED Arêtes DISCOVERY Arêtes CROSS L0 L0 A A L1 L1 B C D B C D E F E F

Exemple (suite) L0 L1 L0 L1 L2 L0 L1 L2 L0 L1 L2 C B A E D F C B A E D

Exemple (suite) L0 L1 L2 L0 L1 L2 L0 L1 L2 C B A E D F A B C D E F C B

BFS plus de details Algorithm BFS(G, s) L0  nouvelle séquence vide L0.insertLast(s) setLabel(s, VISITED) i  0 while ! Li.isEmpty() Li +1  nouvelle séquence vide for all v  Li.elements() for all e  G.incidentEdges(v) if getLabel(e) = UNEXPLORED w  opposite(v,e) if getLabel(w) = UNEXPLORED setLabel(e, DISCOVERY) setLabel(w, VISITED) Li +1.insertLast(w) else setLabel(e, CROSS) i  i +1 L'algorithme utilise un mécanisme pour placer et obtenir les “étiquettes” des sommets et arêtes Algorithm BFS(G) Entrée graphe G Sortie étiquetage des arêtes et partition des sommets de G for all u  G.vertices() setLabel(u, UNEXPLORED) for all e  G.edges() setLabel(e, UNEXPLORED) for all v  G.vertices() if getLabel(v) = UNEXPLORED BFS(G, v)

Propriétés Notation Propriété 1 Propriété 2 Propriété 3 L0 L1 L2 Gs: composante connexe de s Propriété 1 BFS(G, s) visite tous les sommets et toutes les arêtes de Gs Propriété 2 Les arêtes découvertes par BFS(G, s) forment un arbre couvrant Ts de Gs Propriété 3 Pour chaque sommet v dans Li Le chemin de Ts à partir de s à v a i arêtes Chaque chemin de s à v dans Gs a au moins i arêtes A B C D E F L0 A L1 B C D L2 E F

Analyse Chaque sommet est étiquetté deux fois Une fois “non-exploré” Une fois “visité” Chaque arête est étiquettée deux fois Une fois “non-explorée” Une fois “découverte” ou “de traversée” Chaque sommet est inséré une fois dans une séquence Li L’opération incidentEdges (s) est appelée pour chaque sommet La complexité en temps du parcours en profondeur est en O(n+m) si on utilise la structure de données “liste d’adjacence” Rappel que v deg(v) = 2m

Applications Nous pouvons spécialiser l'algorithme de BFS pour résoudre les problèmes suivants en O (n + m) Calculer les composantes connexes de G Calculer une forêt couvrante de G Chercher un chemin simple dans G, ou signaler que G est une forêt Avec deux sommets de G donnés, chercher un chemin dans G entre eux avec le minimum d’arêtes ou signaler qu’aucun tel chemin existe

DFS versus BFS DFS BFS DFS BFS Applications Forêt couvrante, composantes connexes, chemins, cycles  Plus court chemin Composantes biconnexes C B A E D L0 L1 F L2 A B C D E F DFS BFS

DFS versus BFS (suite) Arêtes de retour (v,w) DFS BFS w est un ancêtre de v dans l’arbre des arêtes découvertes Arête de traverse (v,w) w est sur le même niveau que v ou dans le prochain niveau dans l’arbre des arêtes découvertes C B A E D L0 L1 F L2 A B C D E F DFS BFS