La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Structures de données IFT-2000 Abder Alikacem Les graphes (2) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009.

Présentations similaires


Présentation au sujet: "Structures de données IFT-2000 Abder Alikacem Les graphes (2) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009."— Transcription de la présentation:

1 Structures de données IFT-2000 Abder Alikacem Les graphes (2) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009

2 Plan Parcours dun graphe par contagion (ou largeur) Parcours dun graphe par sondage (ou profondeur) Description dun graphe en terme de type abstrait Implantation

3 Défilement dun graphe opération importante visite dun graphe problème : éviter les circuits !!! solution : marquer les nœuds (Petit-Poucet)

4 Défilement dun graphe opération importante visite dun graphe problème : éviter les circuits !!! solution : marquer les nœuds (Petit-Poucet) x

5 Défilement dun graphe opération importante visite dun graphe problème : éviter les circuits !!! solution : marquer les nœuds (Petit-Poucet) x x x

6 Marquer les nœuds (Petit-Poucet) De nombreux algorithmes relatifs aux graphes nécessitent une procédure qui permet l'examen systématique des noeuds et des arêtes (arcs) d'un graphe G donné. La procédure consiste à classer les sommets en 3 catégories: La catégorie A des sommets déjà visités. La catégorie B des sommets adjacents à ceux de la catégorie A mais pas encore visités (sommets qui peuvent être atteints). La catégorie C des sommets invisibles qui n'ont pas encore été rencontrés du tout (qui ne peuvent pas être atteints depuis un sommet déjà visité).

7 Les différentes variantes de parcours dépendront de la manière dont on fait passer les sommets de la catégorie C à la catégorie B et de la B dans la A. On construit l'état initial en plaçant le sommet de départ dans la catégorie B et tous les autres dans la catégorie C. On répète alors : faire passer un sommet x de la catégorie B à la catégorie A; mettre dans la catégorie B tous les sommets de catégorie C adjacents à x. Marquer les nœuds (Petit-Poucet)

8 Au cours de l'exécution de nos algorithmes, chaque noeud N de G sera dans l'un des trois états suivants : STATUS = 1 :(Prêt)État initial du noeud N STATUS = 2 :(Attente)Le noeud N est soit empilé, soit dans la file d'attente, en attente d'être traité. STATUS = 3 :(Traité)Le noeud N a été traité. Marquer les nœuds (Petit-Poucet) Noter quau lieu de marquer les nœuds par 1, 2 ou 3, peut simplement le faire En utilisant un booléen: vrai : le nœud est soit traité soit en attente dêtre traité (status =1 ou 2) Faux: le nœud na pas été parcouru (status = 1)

9 Il existe deux manières standard d'exécuter ces opérations: Parcours par contagion ou par largeur Parcours par sondage ou en profondeur Défilement dun graphe

10 L'algorithme de recherche par sondage ou en profondeur (Depth-First Search ou DFS) permet: d'explorer un graphe, d'en déterminer les composantes connexes, de découvrir s'il contient des cycles. Cet algorithme de parcours dans un graphe a été mis au point par Trémaux au siècle dernier pour résoudre le problème de la sortie d'un labyrinthe. Trémaux qui n'avait pas la possibilité dutiliser la récursivité à l'époque utilisait un ''fil d'Ariane'' lui permettant de se souvenir par où il était arrivé à cet endroit dans le labyrinthe. L'algorithme utilise une pile pour le parcours du graphe à partir d'un sommet donné. On progresse le long d'un de ces arcs et, si lon ne trouve pas ce que lon cherche, on progressera alors le long d'un autre de ces arcs.

11 Lalgorithme de recherche par contagion ou en largeur (Breadth-First Search ou BFS) est à la base de la résolution de problèmes tels que celui du chemin minimum. Le principe: si l'on suppose que tout un groupe de personnes entreprennent l'exploration dune ville, à chaque carrefour, le groupe pourra se partager pour aller dans toutes les directions à la fois. L'algorithme utilise une file pour le parcours du graphe à partir d'un sommet donné. Défilement dun graphe

12 Exemple au tableau Défilement dun graphe

13 Parcours en largeur 1.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 nest pas vide: a)Défiler le prochain nœud. b)Pour chaque voisin qui nest pas marqué: i.Le marquer ii.Lenfiler. Remarque: Sil sagit dun parcours fait pour retrouver un chemin comportant le plus petit nombre détapes entre deux nœuds donnés, alors on peut sarrêter dès quon atteint le nœud darrivé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 à lalgorithme de Floyd pour les chemins (sauf que ce ne sera plus dans une matrice mais dans un tableau à une dimension).

14 Parcours en largeur A F G D B C E A Nœud de départ File ()

15 Parcours en largeur A F G D B C E Nœud de départ File () Défilé: A

16 Parcours en largeur A F G D B C E G ; B ; F Nœud de départ File () (A ) () (A ) Défilé: A

17 Parcours en largeur A F G D B C E B ; F Nœud de départ File () (A ) () (A ) Défilé: G

18 Parcours en largeur A F G D B C E F Nœud de départ File () (A ) () (A ) Défilé: B

19 Parcours en largeur A F G D B C E F ; C ; D Nœud de départ File () (A ) () (B ) (A ) Défilé: B

20 Parcours en largeur A F G D B C E C ; D Nœud de départ File () (A ) () (B ) (A ) Défilé: F

21 Parcours en largeur A F G D B C E D Nœud de départ File () (A ) () (B ) (A ) Défilé: C

22 Parcours en largeur A F G D B C E Nœud de départ File () (A ) () (B ) (A ) Défilé: D

23 Parcours en largeur A F G D D B C E Nœud de départ File () (A ) () (B ) (A ) Meilleur chemin entre A et D: D

24 Parcours en largeur A F G D D B C E Nœud de départ File () (A ) () (B ) (A ) Meilleur chemin entre A et D: D

25 Parcours en largeur A F G D B B C E Nœud de départ File () (A ) () (B ) (A ) Meilleur chemin entre A et D: B D

26 Parcours en largeur A F G D B B C E Nœud de départ File () (A ) () (B ) (A ) Meilleur chemin entre A et D: B D

27 Parcours en largeur A A F G D B C E Nœud de départ File () (A ) () (B ) (A ) Meilleur chemin entre A et D: A B D

28 Parcours par contagion Questions Est-ce que tout graphe peut être parcouru par cet algorithme ? Comment modifier lalgorithme pour que tout graphe soit parcouru ? Comment est-ce que lalgorithme sarrêtera ? Pourquoi est-ce que ça marche bien pour trouver le chemin le plus court ? Quelle est la complexité de lalgorithme de parcours par largeur? Lalgorithme prend un temps O(n+m)

29 Algorithme parcours en profondeur 1.Initialiser (mettre à « faux ») une marque (une valeur booléenne) associée à chaque sommet pour dire quil na pas été parcouru. 2.Empiler et marquer le nœud de départ. 3.Tant et aussi longtemps que la pile nest 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 nest pas marqué: i.Le marquer. ii.Lempiler. Remarque: Ce parcours nest 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.

30 Algorithme parcours en profondeur

31 Une approche par « BackTracking »

32 Parcours en profondeur A F G D B C E A Nœud de départ Pile

33 Parcours en profondeur A F G D B C E Nœud de départ Pile Dépilé: A

34 Parcours en profondeur A F G D B C E G ; B ; F Nœud de départ Pile Dépilé: A

35 Parcours en profondeur A F G D B C E G ; B Nœud de départ Pile Dépilé: F

36 Parcours en profondeur A F G D B C E G Nœud de départ Pile Dépilé: B

37 Parcours en profondeur A F G D B C E G ; C ; D Nœud de départ Pile Dépilé: B

38 Parcours en profondeur A F G D B C E G ; C Nœud de départ Pile Dépilé: D

39 Parcours en profondeur A F G D B C E G Nœud de départ Pile Dépilé: C

40 Parcours en profondeur A F G D B C E Nœud de départ Pile Dépilé: G

41 Parcours en profondeur A F G D B C E Nœud de départ Pile FIN

42 Parcours par sondage Questions Peut-on parcourir tout un graphe avec ce type de parcours ? Comment lalgorithme saperçoit-il quil est dans un cul-de- sac et quil doit faire du retour-arrière (« backtracking ») ? Est-ce que ce parcours peut être utilisé pour trouver le chemin le plus court ? Quelle est la complexité de lalgorithme de parcours en profondeur? Lalgorithme prend un temps O(n+m)

43 Comparaison des deux parcours Le graphe correspondant est obtenu en plaçant un sommet en chaque point du labyrinthe où il y a plus d'un chemin possible et, ensuite, en connectant les sommets conformément à l'architecture du labyrinthe.

44 Comparaison des deux parcours

45 Spécifications de linterface du type Graphe Description en termes de types abstraits 1.ajouter un sommet à un graphe 2.ajouter un arc/arête à un graphe 3.ôter un sommet du graphe et tous les arcs/arêtes associés 4.ôter un arc/arête 5.permettre l'accès à un sommet nommé (désigné) 6.indiquer si un sommet n'a pas de voisins 7.parcourir les voisins d'un sommet (parcours) 8.voir si un chemin existe entre 2 sommets 9.trouver le chemin le plus court (# arêtes, distance) 10. trouver tous les chemins entre 2 sommets Etc..

46 Implantation Il existe deux principales méthodes de modélisation des graphes en tant que type abstrait: les matrices et les listes dites de connectivité ou d'adjacence. Le choix entre elles se fera en fonction de la densité du graphe. Par densité, on entend la proportion d'arcs effectifs par rapport au nombre maximum d'arcs ou darêtes possibles: NbArcs / NbSommets 2 dans le cas de graphe orienté. NbAretes / (NbSommets(NbSommets-1)/2) dans le cas dun graphe non orienté

47 Implantation Matrice dadjacence Une matrice de valeurs booléennes de dimension NbSommets*NbSommets pour indiquer qu'il y a un arc entre un sommet x et un sommet y. On suppose que les sommets du graphe sont étiquetés de 0 à N Sil existe une arête/arc du sommet i au sommet j, on met 1 à la position A[i][j], sinon on met 0 comme valeur. Si le graphe est valué, on met à la position A[i][j], le poids associé à larête/arc, 0 pour la position A[i][i], ailleurs. Si le graphe est peu dense, ce qui est souvent le cas, il y aura beaucoup de 0 dans la matrice. Cette méthode de représentation est donc indiquée si le graphe est dense car il faut NbSommets 2 booléens pour stocker le graphe et NbSommets 2 étapes pour initialiser la matrice.

48 Implantation Listes dadjacence Pour chaque sommet, on associe une liste de tous les autres sommets auquel il est lié par une arête dont il est lorigine En principe (tout comme avec la matrice dadjacence), il faut une table qui associe lidentificateur de chaque sommet à un numéro interne dans la représentation En C++, cette table peut nous retourner un pointeur sur la structure qui représente le sommet

49 Interface template class Graphe { public: /** Constructeur (graphe vide)*/ Graphe(); /** Constructeur à partir des sommets et arcs/arêtes*/ Graphe(vector sommets, vector aretes); Graphe (const Graphe&); Graphe(const Graphe&g, const std::vector &sommets); ~Graphe (); Graphe& operator = (const Graphe&); void ajouterSommet(const T& s); void ajouterArc (const T& s1, const T& S2); void enleverArc (const T& s1, const T& s2); void enleverSommet ( const T& s); bool sommetExiste(const T& s) const; int nbSommets() const; // etc... private: //… class Arete { public: int u; int v; Arete(int u, int v) {this->u = u; this->v = v; } class Sommet { public: …getData(); void setData(..); //etc.. private: … data; int no; int tag; bool pres; }

50 Classe Graphe template class Graphe { public: //.. private: int nbSommets; T* sommets; int **mat;//implémentation dans une matrice }// de sommets adjacents Cas dun graphe orienté Implantation dans une matrice dadjacence

51 Classe Graphe template class Graphe { public: //.. private: int nbSommets; T* sommets; int **mat; // trop de perte mémoire!! } Cas dun graphe non orienté Implantation dans une matrice dadjacence

52 Matrice triangulaire matrice dadjacence : (avec graphe non orienté) On peut, pour un graphe non-orienté, économiser de l'espace en ne stockant que le triangle supérieur de la matrice symétrique. Matrice triangulaire possède n = [n (n+1)] / 2 éléments. On la représente dans un tableau à une dimension (ou vector) ayant ce même nombre d'éléments. Si on la range par ligne, alors le tableau aura l'allure suivante : A 00 A 10 A 11 A 20 A 21 A 22 A A n-1n-1 Si A 00 est en position 0, alors l'adresse de tout lément A ij est donnée par : ( i +1 ) * i / 2 + j Ainsi, la position de A 42 dans la matrice est équivalent à la position 12 dans le tableau

53 Classe Graphe template class Graphe { public: //.. private: int nbSommets; T* sommets; int *mat; // tableau à une dimension } Cas dun graphe non orienté Implantation dans une matrice dadjacence ( i + 1 ) * i / 2 + j

54 Classe Graphe template class Graphe { public: //.. private: vector sommets; // Les sommets vector > voisins; // Les sommets adjacents } Implantation dans une matrice dadjacence Utilisation de vector de la STL

55 Classe Graphe Implantation dans une matrice dadjacence Remarque Dans ce type de représentation, on na pas le choix que de représenter les données reliées aux sommets dans une structure séparée. sommets =

56 Classe Graphe template class Graphe { public: //.. private: class Noeud { public: T data; /* au lieu de T data, on peut avoir T* ou int*/ Noeud * suivant; /* chaînage des sommets adjacents */ }; /* le noeud typique du graphe */ int nbSommet; /* nombre de sommets dans le graphe */ int nbSommetMax;/* nombre total possible de sommets */ T * sommet; /* tableau représentant les sommets*/ Noeud** listeSommet; /* les listes de sommets adjacents*/ } Implantation dans une liste de sommets adjacents

57 Classe Graphe template class Graphe { public: //.. private: class Noeud { public: T data; //données // dans un sommet list voisins; }; vector listeSommets; } Implantation dans une liste de sommets adjacents Utilisation de vector et list de la STL

58 Classe Graphe Implantation dans une liste de sommets adjacents Cas dun graphe non orienté La liste des sommets adjacents soufre de la même redondance que nous avons rencontrer avec les matrices de sommets adjacents. Une solution plus efficace utilisation de listes darêtes Elle consiste à lier les arêtes un lien pour chaque arête vers les 2 sommets délimitant larête.

59 Classe Graphe template class Graphe { public: //.. private: class AreteNode { public: int sommet[2]; AreteNode * lien[2]; }; typedef AreteNode * AretePtr; class Noeud { public: T data; AretePtr first; }; vector listeSommets; } Cas dun graphe non orienté Liste des arêtes B 4

60 Classe Graphe Liste des arêtes Chaque AreteNode représente une arête sommet[1] et sommet[2] sont les sommets directement connectés par cette arête. Lien[1] pointe vers un autre AreteNode ayant sommet[1] comme délimitateur. Lien[2] pointe vers un autre AreteNode ayant sommet[2] comme délimitateur. B


Télécharger ppt "Structures de données IFT-2000 Abder Alikacem Les graphes (2) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009."

Présentations similaires


Annonces Google