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 Semaine 5, suite et fin… 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 Semaine 5, suite et fin… 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 Semaine 5, suite et fin… Département dinformatique et de génie logiciel Édition Septembre 2009

2 Deuxième partie Parcours dun graphe par contagion (ou largeur) Parcours dun graphe par sondage (ou profondeur) Description dun graphe en terme de type abstrait Implantation

3 Rappel Défilement dun graphe Deux manières standard d'exécuter cette opération: Parcours par contagion ou par largeur Breadth-First Search ou BFS Parcours par sondage ou en profondeur(Depth-First Search ou DFS) Question: Est-ce que tout graphe peut être parcouru par ces 2 algorithmes ?

4 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.consulter un sommet 6.voir si un chemin existe entre 2 sommets 7. trouver le chemin le plus court (# arêtes/arcs, distance) 8.trouver tous les chemins entre 2 sommets Etc..

5 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é

6 Interface template class Graphe { public: /** Constructeurs (graphe vide)*/ Graphe(); Graphe (const Graphe&); ~Graphe (); Graphe& operator = (const Graphe&); void ajouterSommet(T s); void ajouterArc (T s1, T S2); void enleverArc (T s1, T s2); void enleverSommet ( T s); bool sommetExiste(T s) const; int nbSommets() const; // etc... private: //… }; class Sommet { public: …getData(); void setData(..); //etc.. private: … data; int no; int tag; bool pres; }

7 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

8 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 Linéariser la matrice

9 STL : Standard Template Library Conteneurs: En C++, une classe contenant un ensemble déléments d'un certain type est appelée conteneur. Ce sont donc eux qui contiendront les informations que lon veut stocker. Itérateurs: utilisés pour parcourir les items qui se retrouvent dans les conteneurs, ils jouent un peu le rôle de pointeurs sur des éléments dun conteneur. Algorithmes: utilisés pour faire des traitements sur les éléments qui se retrouvent dans les conteneurs.

10 Conteneurs Séquentiels vector: tableau dynamique - extensible - accès direct en O(1) - insertions et retraits à la fin en O(1) - insertions et retraits lents au milieu list: liste doublement chaînée - insertions et retraits nimporte où en O(1) - accès au début et à la fin en O(1) - accès lent aux autres éléments STL : Standard Template Library

11 Liste (list) et vecteur (vector) Méthodes communes à vector et list push_back(): Ajoute à la fin du conteneur. pop_back(): Enlève le dernier objet du conteneur back(): Retourne l'objet situé à la fin du conteneur front(): Retourne l'objet situé au début du conteneur Pour les conteneurs de type list seulement push_front(): Ajoute au début du conteneur pop_front(): Enlève le premier objet du conteneur Pour les conteneurs de type vector seulement operator[] : Retourne l'objet situé à la position i du conteneur at (): Comme le précédent mais déclenche une exception out of range lorsqu'un indice est incorrect. resize(): Redéfini la taille du conteneur capacity(): Retourne la capacité du conteneur reserve(): Redéfini la capacité du conteneur

12 Les itérateurs #include using namespace std; int main( ) { list list1; for (int i = 1; i<=40; i++) list1.push_back(i+i); list :: iterator i; //reverse_iterator //const_iterator for (i = list1.begin( ); i!=list1.end( ); i++) cout <<*i << ; return 0 ; } Les principaux opérateurs sont * donnant accès à la valeur, ++ et -- pour incrémenter et décrémenter une valeur. - Opérateur * : Retourne lélément de la position courante - Opérateur ++ : Fait pointer litérateur à lélément suivant - Opérateur == : Indique si 2 itérateurs pointent sur le même élément - Opérateur = : Assigne un itérateur

13 Pile (stack) et file (file) Ladapteur de conteneurs Stack ( la pile ) Peut être implémentée avec vector, list, (*)deque Principe LIFO : push et pop à la même extrémité Queue ( la file ) Dérive dun (*)deque. Principe FIFO (*)deque: tableau dynamique qui peut sétendre par les deux extrémités. Cest un des conteneurs séquentiels de la STL

14 Pile (stack) #include using namespace std; stack s; s.push(1); s.pop(); int n = s.size(); if(s.empty()){…} int i = s.top(); Lib « stack » stack est générique Déclaration (pile dentiers) Empiler Dépiler Taille de la pile Pile vide? Sommet de la pile

15 File (queue) #include using namespace std; queue f; int n =f.size(); f.push(10); f.pop(); int tete =f.front(); int fin = f.back(); Lib « queue » queue est générique Déclaration Taille Ajouter en tête Supprimer en queue Tête de la file Fin de la file

16 Retour à la 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

17 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 Laboratoire#5

18 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

19 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.

20 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é Solution: liste des arêtes B 4

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

22 Plan Tri topologique Retour sur la connexité des graphes Algorithme de Dijkstra Algorithme de Bellman-Ford Algorithme A*

23 On cherche à déterminer dans quel ordre on enfiler ses vêtements pour s'habiller de la tête aux pieds. Sachant que : Il faut dabord enfiler son caleçon pour mettre ensuite ses chaussures, son pantalon et sa ceinture. Pour mettre ses chaussures il faut avoir mis ses chaussettes et son pantalon. Pour mettre sa ceinture il faut avoir enfile sa chemise. Pour mettre sa veste il faut avoir enfilé sa cravate et sa ceinture. Pour mettre sa cravate il faut avoir mis sa chemise. On peut mettre sa montre n'importe quand! Tri topologique : exemple

24 ch ettes slippant. montrech se cecrve ch res slip chaussettes pantalon chaussures chemise cravate veste ceinture montre Graphe de dépendance Graphe trié topologiquement Tri topologique : exemple

25 Tri topologique Idée : ordonner les sommets selon la préséance indiquée par les arcs But : comparer deux sommets s1 et s2 pour savoir si lun vient avant lautre Précondition S est un graphe orienté et acyclique Postcondition s 1 vient avant s 2 il y a un chemin de s 1 à s 2 et : s 1 < s 2

26 Tri topologique : trace de lalgorithme (a) A B C D E F G (b) A B C D E F G

27 Retour sur la connexité des graphes Un graphe non orienté G est connexe ssi il existe un chemin entre nimporte quelle paire de sommets distincts du graphe si le graphe G n'est pas connexe, il apparaîtra comme un ensemble de sous-graphes connexes. Chacun de ces sous-graphes forme une composante connexe maximale

28 Connexité des graphes orientés Un graphe G est fortement connexe ssi pour nimporte quelle paire de sommets distincts (a,b) de G, il existe un chemin du sommet a au sommet b et un autre chemin du sommet b au sommet a. Un graphe orienté G est faiblement connexe ssi son graphe non orienté sous-jacent G est connexe.

29 Problématique des plus courts chemins Plus cours chemin pour tout couple de sommets (coûteux dans notre cas) Algorithmes de Floyd-Warshall. Les plus courts chemins à origine unique Parcours exhaustif des nœuds Algorithme de parcours par largeur (BFS) (graphes non pondérés) Algorithme de Dijkstra (pondération positive). Algorithme de Bellman-Ford (pondération négative). Comment trouver le plus court chemin entre 2 sommets s et t d'un graphe G ?

30 Algorithme de Dijkstra 3 s dc b a s dc b a Exemple. Plus court chemin entre s et i v (v : lensemble des sommets) Pour chaque sommet i v, on maintient à jour un attribut y i : une estimation de la pondération dun plus court chemin: État initial : y s = 0 (s étant la source) y i = + avec i s À chaque étape : essayer de minimiser les y i État final : y i = lpcc(s,i) (lpcc: le plus court chemin) Lalgorithme est basée sur la technique de relâchement

31 RELÂCHER (a,b, c (a,b)) Si y b > y a + c (a,b) Alors y b y a + c (a,b) ba b a Relâcher(a,b, c(a,b)) ba b a Dans lalgorithme de Dijkstra, chaque arc est relâché exactement une fois. Algorithme de Dijkstra

32 Soit V lensemble des sommets dun graphes Initialiser y i = + pour tous les sommets i Initialiser y s = 0. Initialiser S à l'ensemble vide, T = V. Tant que T n'est pas vide 1.Sélectionner le sommet j de T de plus petite valeur y i 2.Faire T = T \ j et S = S j 3.Pour tous les sommets k de T adjacents à j, faire RELÂCHER(j, k, c(j,k)) Fin Tant que. Complexité ? V :ensemble des sommets dun graphe S : sommets dont les poids finaux de plus court chemin à partir de la source ont été calculés. T: file pour gérer les sommets de v – S suivant leur attribut y i.

33 RELÂCHER (a,b, c (a,b)) Si y b > y a + c (a,b) Alors y b y a + c (a,b) P[b] a Tous les P[i] sont initialisés à NIL au départ (i v ) Algorithme de Dijkstra et le chemin f d d e g h e Pour aller dun sommet A à un sommet B appliquer lalgorithme de Dijkstra avec le sommet A comme source, en conservant pour chaque nœud le nœud origine à partir duquel sa plus petite distance de la source a été calculée.

34 Algorithme de Dijkstra a db f c e abcdef V, S, T Y P V: ensemble des sommets S: les sommets solutionnés T: une file dattente (suivant le coût) Y: tableau des coûts P: tableau des sommets précédents

35 Algorithme de Dijkstra a db f c e abcdef V, S, T Y P

36 Algorithme de Dijkstra a db f c e (a) 4 (a) acbdef 024 -aa--- V, S, T Y P

37 Algorithme de Dijkstra a db f c e (a)12 (c) 3 (c)10 (c) acbdef accc- V, S, T Y P

38 Algorithme de Dijkstra a db f c e (a)12 (c) 3 (c)8 (b) acbdef acbc- V, S, T Y P

39 Algorithme de Dijkstra a db f c e (a)10 (d) 3 (c)8 (b) 14 (d) acbdef acbdd V, S, T Y P

40 Algorithme de Dijkstra a db f c e (a)10 (d) 3 (c)8 (b) 13 (e) acbdef acbde V, S, T Y P

41 Algorithme de Dijkstra a db f c e (a)10 (d) 3 (c)8 (b) 13 (e) acbdef acbde V, S, T Y P

42 s c b a Algorithme de Dijkstra Autre exemple s c b a ,s 9,a 11,b 0

43 s c b a Pause, profitons pour nous amuser! 0 Appliquons le principe du relâchement à chaque arc de ce graphe, lordre des arcs est choisi aléatoirement. Un arc relâché sera mis avec une autre couleur.

44 s c b a er tour… 0

45 s c b a er tour…

46 s c b a er tour…

47 s c b a er tour…

48 s c b a er tour…

49 s c b a er tour… On a relâché tous les arcs. Recommençons une nouvelle fois. Un arc relâché sera mis cette fois en bleu

50 s c b a ième tour…

51 s c b a ième tour…

52 s c b a ième tour…

53 s c b a ième tour…

54 s c b a ième tour…

55 s c b a ième tour…

56 s c b a Un autre tour? On arrête ce jeu!

57 s c b a Un autre tour? s c b a Résultat suite à lexécution de lalgorithme de Dijkstra Résultat à lissu de lexécution de lalgorithme de notre jeu … Il sagit en fait de la simulation De lalgorithme de Bellman-Ford! Limité à des poids positifs Poids positifs et négatifs

58 Problématique des arcs de poids négatifs Algorithme de Bellman-Ford s c a Si un graphe ne contient aucun circuit de poids négatif accessible à partir dune origine s, alors, pour tout sommet i v, le poids du plus court chemin reste bien défini, même si sa valeur est négative. Sil existe un circuit de poids négatif accessible depuis s, le poids du plus court chemin nest pas correctement défini. Aucun chemin entre s et un sommet du circuit ne peut être plus court, on peut toujours trouver un encore plus court! s c a

59 Algorithme de Bellman-Ford Complexité ? Soit le graphe G(V,E) Initialiser y i = + pour tous les sommets i Initialiser y s = 0. Répéter |V| - 1 FOIS Pour tout arc (u,v) de E faire RELÂCHER(u, v, c(u,v)) Pour tout arc (u,v) de E faire Si y v > y u + c(u,v) Alors Retourner FAUX Retourner VRAI Faire les étapes nécessaires pour faire converger le poids des chemins sachant quun plus court chemin de s à tout autre sommet est un chemin dordre au plus n -1 arcs. Vérifier sils ont tous convergé. Retourner VRAI si cest le cas. Retourner FAUX sinon.

60 s dc b a s dc b a Étape 1 relaxation de tous les arcs dans lordre : (s,a) (s,c) (a,b) (a,c) (b,d) (c,a) (c,b) (c,d) (d,b) (d,s) Exemple 1 Algorithme de Bellman-Ford

61 s dc b a s dc b a Étape 2 relaxation de tous les arcs dans lordre : (s,a) (s,c) (a,b) (a,c) (b,d) (c,a) (c,b) (c,d) (d,b) (d,s) Algorithme de Bellman-Ford

62 s dc b a s dc b a Étape 3 relaxation de tous les arcs dans lordre : (s,a) (s,c) (a,b) (a,c) (b,d) (c,a) (c,b) (c,d) (d,b) (d,s) Algorithme de Bellman-Ford

63 s dc b a s dc b a Étape 4 relaxation de tous les arcs dans lordre : (s,a) (s,c) (a,b) (a,c) (b,d) (c,a) (c,b) (c,d) (d,b) (d,s) Cycle de coût négatif: réduction encore possible ! Algorithme de Bellman-Ford

64 Bellman-Ford revu…. Soit le graphe G(V,E) Initialiser y i = + pour tous les sommets i Initialiser y s = 0. K 1 Répéter Stable VRAI Pour tout arc (u,v) de E faire RELÂCHER(u, v, c(u,v)) Si …Alors Stable FAUX K k + 1 Tant que Stable est FAUX ET k < n+1 Si non Stable alors présence dun circuit de poids négatif

65 s dc b a Exemple 2 Étape 1 relaxation de tous les arcs dans lordre : (s,a) (s,c) (a,b) (a,c) (b,d) (c,a) (c,b) (c,d) (d,b) (d,s) s dc b a Algorithme de Bellman-Ford

66 s dc b a Étape 2 relaxation de tous les arcs dans lordre : (s,a) (s,c) (a,b) (a,c) (b,d) (c,a) (c,b) (c,d) (d,b) (d,s) Pas de réduction possible : coûts corrects! s dc b a Algorithme de Bellman-Ford

67 Algorithme A* Coût total (F) = Coût depuis la source(G) + Coût vers la destination(H) Principe général : évaluation du coût total dun sommet Pourquoi évaluer un coût vers la destination ? Afin de resserrer lensemble des sommets à explorer en privilégiant les sommets « qui semblent » nous rapprocher de la destination. Conséquence lalgorithme A* est plus performant que nimporte quel autre algorithme puisquil diminue lensemble des sommets à explorer. Comment évaluer un coût vers la destination ? En utilisant des heuristiques (prédictions) afin dévaluer un coût vers la destination INFERIEUR au coût réel (encore inconnu). À ce titre, A* est un algorithme dit optimiste.

68 Algorithme A* Distance euclidienne S D 40 H 20 Théorème de Pythagore H 2 = (Coté oppose) 2 + (Coté adjacent) 2 H 2 = = 2000 H = 20 x (5) 1/2

69 Algorithme A* Distance de Manhattan S D Nombre de cellules, en horizontal et en vertical entre la source et la destination. Plus conforme à la nature des déplacements autorisés (haut, bas, gauche, droite)

70 Retour sur les piles p1 pile debut cpt tab suiv nœud... en-tête (header) Pile, modèle hybride

71 Graphe, lab#6 /** * Algorithme de Warshall */ template Graphe fermetureGraphe(Graphe g); Graphe (int nbSommet); Graphe (const Graphe&); Graphe(const Graphe& g, std::vector &); ~Graphe (); Graphe& operator = (const Graphe&); void ajouterSommet(T s) ; void ajouterArc (T s1, T S2); void enleverArc (T s1, T s2); void enleverSommet ( T s); bool sommetExiste(T s); bool arcExiste ( T s1, T s2); int nbSommets(); void affiche(); std::vector listerSommetsGraphe(); int ordreEntreeSommet(T sommet); std::vector listerSommetsAdjacents(T sommet); int ordreSortieSommet(T sommet) ; Algorithme de Warshall {Soit A, un graphe orienté} P A Pour k = 1, 2,..., n Pour i = 1, 2,..., n Pour j = 1, 2,..., n P ij P ij ou (P ik et P kj )

72 Graphe, lab#6 Algorithme de Warshall {Soit A, un graphe orienté} P A Pour k = 1, 2,..., n Pour i = 1, 2,..., n Pour j = 1, 2,..., n P ij P ij ou (P ik et P kj ) template Graphe_Lab7::Graphe fermetureGraphe (Graphe_Lab7::Graphe g) { Graphe fermG(g); vector v = fermG.listerSommetsGraphe(); int nb = fermG.nbSommets(); for (int k = 0; k < nb; k++) for (int i = 0; i < nb; i++) for (int j = 0; j < nb; j++) if (fermG.arcExiste(v[i], v[j]) == false) { if ((fermG.arcExiste(v[i], v[k]) == true) && (fermG.arcExiste(v[k], v[j]) == true)) { fermG.ajouterArc(v[i], v[j]); } return fermG; }


Télécharger ppt "Structures de données IFT-2000 Abder Alikacem Les graphes Semaine 5, suite et fin… Département dinformatique et de génie logiciel Édition Septembre 2009."

Présentations similaires


Annonces Google