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 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 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 Département dinformatique et de génie logiciel Édition Septembre 2009

2 Première partie Introduction Nomenclature des graphes Matrice de connectivité Clôture transitive: algorithme de Warshall Plus court chemin: algorithme de Floyd

3 Les graphes Modélisent quoi au juste ? cartes géographiques : réseaux routiers, de téléphonie, etc. trajets dautobus, de trains, davions, de commis voyageurs circuits électriques, réseaux électriques Gestion dune ville (transport, feux tricolore, voies à sens unique etc..) Etc

4 Graphe (orienté) G = (S, A) S ensemble fini des sommets A S x S ensemble des arcs, i.e., relation sur S Graphe non orienté G = (S, A) A ensemble des arêtes, relation symétrique S = { 1, 2, 3, 4, 5 } A = { (1, 2), (1, 3), (2, 3), (3, 2), (4, 4), (4, 5) } S = { 1, 2, 3, 4 } A = { {1, 2}, {1, 3}, {1, 4}, {2, 4} } Les graphes: définitions

5 Graphe G (S,A), un graphe orienté (digraphe) S = {1,2,3,4,5}, A = {1-5,2-1,2-4,4-1,4-3,5-4} adjacence dun nœud V si 1 arc V-W y est relié chemin suite darcs où le dernier dune paire est le premier de la paire suivante (chemins simples) et = 2 chemins de 2 à 4 ordre dun chemin nombre darcs le composant

6 Les graphes : définitions ordre de sortie dun nœud (arité de sortie) ordre dentrée dun nœud (arité dentrée) = degré dun sommet circuit chemin où lorigine est égale au dernier nœud ex. : boucle circuit dordre 1 graphe acyclique graphe ne contenant aucun circuit puits nœud dont larité de sortie est 0 source nœud dont larité dentrée est 0 nœud indépendant arité dentrée = arité de sortie =

7 Les graphes : définitions Graphe connexe : en oubliant le sens des flèches, un graphe est connexe sil existe un chemin entre toutes paires de nœuds sinon : graphe à composantes connexes

8 Graphe fortement connexe : en tenant compte du sens des flèches, un graphe est fortement connexe sil existe un chemin entre toutes paires de nœuds Ce graphe comporte 5 composantes fortement connexes Les graphes : définitions

9 Points darticulation Ce graphe non orienté est connexe, c'est-à-dire formé d'une seule composante. Ce graphe contient quatre points d'articulation, c'est-à-dire un sommet qui, s'il est éliminé, casse le graphe en deux ou plusieurs morceaux. Ces points darticulation sont : A qui déconnecte B H qui déconnecte I J qui déconnecte K G qui produit 3 composantes. Un graphe qui ne possède pas de points darticulation est appelé bi-connexe (ou 2-connexe) Les graphes : définitions

10 à chaque arc valeur (numérique) type-de mange sur saveur à-côté près à chaque arc valeur (nominale) Graphe pondéré (valué) Les graphes orientés et pondérés sont appelés des réseaux

11 Les graphes : définitions Graphe pondéré : à chaque arc valeur (nominale) Graphe décoré (étiqueté) : à chaque nœud valeur lasagne chat tapis pepperoni paillasson type-de mange sur saveur à-côté près

12 Opérations importantes Connectivité Existe-t-il un chemin entre V et W ? Quel est le chemin le plus court entre V et W ? avec chaque arc valeur de 1 ? avec un graphe pondéré ? Est-ce quun graphe g est inclus dans un autre graphe g ?

13 Explorations Parcours en profondeur, en largeur Tri topologique Composantes fortement connexes,... Recherche de chemins Clôture transitive (algorithme de Warshall) Chemin de coût minimal (algorithme de Floyd, Dijkstra, Bellman-Ford)... Arbres recouvrants : Algorithmes de Kruskal et Prim Réseaux de transport Flot maximal (algorithme de Ford-Fulkerson) Divers Coloration d'un graphe... Algorithmique des graphes

14 En général, il existe 2 manières pour mettre un graphe en mémoire: Par chaînage Listes des successeurs Dans une matrice Matrice de nœuds adjacents Implantation

15 S = { 1, 2, 3 } A = { (1,1), (1, 2), (1, 3), (2, 1), (3, 2)} Listes des successeurs Exemple

16 S = { 1, 2, 3 } A = { (1,1), (1, 2), (1, 3), (2, 1), (3, 2)} M = V = M [ i, j ] = 1 ssi j adjacent à i Matrices dadjacences Exemple

17 Opérations importantes graphe orienté Matrice dadjacence graphe non orienté

18 Opérations importantes arité de sortie Matrice dadjacence arité dentrée

19 Opérations importantes puits Matrice dadjacence source

20 Opérations importantes boucle Matrice dadjacence

21 Opérations importantes chemins de longueur 1 = A Matrice dadjacence

22 Opérations importantes chemins de longueur 2 ? Matrice dadjacence

23 Opérations importantes chemins de longueur 2 ? Matrice dadjacence

24 Chemins de longueur 2

25 Chemins de longueur 2 = A 2

26 x Chemins de longueur 3

27 Chemins de longueur 3 = A 3

28 Fermeture transitive des graphes Définition Soit G un graphe orienté de n noeuds. Soit A la matrice de nœuds adjacents correspondant. Soit B n-1 = A + A 2 + A 3 … + A n-1 la matrice P est appelée fermeture ou clôture transitive du graphe G (dans notre cas, on a une clôture par produits de matrices). Complexité ? B n-1 P : matrice de booléens qui indique sil existe un chemin entre toutes paires de nœuds

29 Exemple graphe Ggraphe H Fermeture transitive des graphes H : la fermeture transitive de A.

30 Algorithme de Warshall {Soit A, un graphe orienté} 1. [Initialisation] P A 2. [Boucle sur tous les sommets intermédiaires] Pour k = 1, 2,..., n répéter jusqu'à l'étape [Boucle sur les sommets de départ] Pour i = 1, 2,..., n répéter l'étape [Boucle sur les sommets adjacents] Pour j = 1, 2,..., n répéter P ij P ij ou (P ik et P kj ) 5. [Fin de l'algorithme] Stop Algorithme de Warshall Complexité ?

31 P 0 = P 1 = P 2 = P 3 = P 4 = Algorithme deWarshall

32 pour k = 1 à n faire pour i = 1 à n faire pour j = 1 à n faire C [i, j] MIN { C [i, j], C [i, k] + C [k, j] } ; k c i b a kj MIN { a, b + c } C k = i j a k b c Algorithme de Floyd

33 P 0 = P 1 = P 2 = P 3 = P 4 = Warshall P 0 = P 1 = P 2 = P 3 = P 4 = Floyd P 1 = P 2 = P 3 = P 4 = CALCULMATRICIELCALCULMATRICIEL

34 Algorithme de Floyd {Soit A, un graphe orienté.} 1. [Initialisation] C A 2. [Boucle sur les sommets intermédiaires] Pour k = 1, 2,..., n répéter jusqu'à l'étape [Boucle sur les sommets de départ] Pour i = 1, 2,..., n répéter l'étape [Boucle sur les sommets adjacents] Pour j = 1, 2,..., n répéter C ij MIN (C ij, C ik + C kj ) 5. [Fin de l'algorithme] Stop Algorithme de Floyd Complexité ?

35 C 0 = W = C 1 = C 2 = C 3 = C 4 = Matrice des poids : W [i,j] =0 si i = j v((i,j)) si (i, j) A sinon Algorithme de Floyd et les distances

36 C 0 = W = C 1 = C 2 = C 3 = C 4 = P 1 = P 2 = P 3 = P 4 = P 0 = Matrice des prédécesseurs P k [i, j] = prédécesseur de j sur un plus court chemin de i à j dont les sommets intermédiaires sont tous k Algorithme de Floyd et les chemins

37 C 4 = P 4 = Exemple de chemin distance de 2 à 1 = C 4 [2,1] = 13 P 4 [2,1] = 4 ;P 4 [2,4] = 3 ;P 4 [2,3] = 2 ; Algorithme de Floyd

38 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

39 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é, une et une seule fois. 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é). Défilement dun graphe

40 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) Il existe deux manières standard d'exécuter ces opérations: Parcours par contagion ou par largeur Breadth-First Search ou BFS Parcours par sondage ou en profondeur(Depth-First Search ou DFS)

41 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)

42 Exemple Défilement dun graphe

43 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)

44 Parcours par sondage Questions Peut-on parcourir tout un graphe avec ce type de parcours ? 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)

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

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 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; }

48 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

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

50 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

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

52 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

53 Liste (list) et vecteur (vector) Méthodes communes à vector et list push_back():Ajoute x à 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 x 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 conteneu

54 Les itérateurs Un itérateur peut être vu comme un pointeur sur un élément dun conteneur. Chaque conteneur fourni un type ditérateur. Exemple le type list donne un itérateur de type : list :: iterator. Tous les conteneurs offrent les mêmes fonctions de base permettant aux itérateurs daccéder aux éléments: begin() retourne un itérateur pointant au premier élément du conteneur end() retourne un itérateur pointant après le dernier élément du conteneur

55 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

56 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

57 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

58 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

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

60 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

61 Laboratoire #5 template class Graphe { public: //Les méthodes publiques private: class Noeud { public: T sommet; /*!< l'étiquette d'un sommet */ Noeud * suivant; /*!< pour le chaînage dans les listes de noeuds adjacents */ }; int nbNoeud; /*!< nombre de sommets dans le graphe */ int nbNoeudMax;/*!< nombre total possible de sommets */ T * tableauSommet; /*!< tableau représentant les sommets (i.e. les étiquettes)*/ Noeud** listeNoeud; /*!< structure pour les listes de noeuds adjacents*/ }; 1 1 2

62 Exercice Gestion dune seule file insertion se fait selon la priorité éléments toujours triés selon leur priorité in file in file Files prioritaires

63 Exercice p1 pile debut cpt tab suiv nœud... en-tête (header) Pile, modèle hybride


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

Présentations similaires


Annonces Google