Graphes : introduction Graphes Graphes Graphes : G = (S, A)
Transcription
Graphes : introduction Graphes Graphes Graphes : G = (S, A)
Graphes définitions, représentation, génération aléatoire, Graphes : introduction parcours en largeur, parcours en profondeur, plus courts chemins, Stéphane Grandcolas arbres couvrants de poids minimal (ACM), [email protected] flots, problème du voyageur de commerce. Graphes – Stéphane Grandcolas – p. 1/40 Graphes – Stéphane Grandcolas – p. 2/40 Graphes : G = (S, A) Graphes Une façon de représenter une relation ou une distance entre des objets, des éléments d’un ensemble. Exemple : distances routières. S : ensemble des sommets A : ensemble des arêtes A = {{u, v}, u ∈ S, v ∈ S} (souvent notées (u, v)) Sisteron 38 53 2 Digne Manosque 60 6 3 8 107 1 86 67 Brignoles Aix 7 20 Martigues 37 20 20 Marseille 4 48 5 Aubagne 48 Hyères Toulon 20 Graphes – Stéphane Grandcolas – p. 3/40 (1,2) (2,3) (1,3) (1,5) (3,7) (4,6) (8,4) (7,5) (3,5) (8,6) Graphes – Stéphane Grandcolas – p. 4/40 Graphes orientés. Graphes pondérés. G = (S, A), avec A = {(u, v), u ∈ S, v ∈ S} un ensemble d’arcs G = (S, A, w) : chaque arête (u, v) a pour poids w(u, v) 2 7 5 20 5 2 12 4 10 1 1 33 14 12 26 3 4 4 6 6 Exemple : container packing. 11 15 3 9 Graphes – Stéphane Grandcolas – p. 5/40 17 8 20 6 Graphes – Stéphane Grandcolas – p. 6/40 Modelisation de Fekete et Scheppers. un ensemble d’objets rectangulaires (orientés) un conteneur rectangulaire Problème : peut-on placer tous les objets à l’intérieur du conteneur sans qu’ils se recoupent ? 1. Graphes d’intervalles 2. Aucune arête n’apparait dans les deux graphes 3. Poids maximal des stables inférieur à la dimension correspondante S. P. Fekete and J. Schepers, A combinatorial characterization of higher-dimensional orthogonal packing, 2004. Graphes – Stéphane Grandcolas – p. 7/40 Graphes – Stéphane Grandcolas – p. 8/40 Vocabulaire (graphes non orientés). Vocabulaire (graphes non orientés). Sommet adjacent à un sommet u : tout sommet v tel que (u, v) ∈ A. Graphe connexe : il existe un chemin entre tout couple de sommets. Voisins d’un sommet u : tous les sommets qui lui sont adjacents. Composantes connexes : classes d’équivalences pour la relation est atteignable. Degré d’un sommet u : nombre de sommets qui lui sont adjacents. Chemin (u0 , u1 , . . . , uk ) : suite de sommets adjacents (∀i, (ui , ui+1 ) ∈ A). Longueur d’un chemin : somme des poids des arêtes qui constituent le chemin (ou nombre d’arêtes du chemin si le graphe n’est pas pondéré). Cycle : chemin dont l’origine et la destination sont le même sommet Graphe complet : tous les sommets sont reliés entres eux (il existe une arête entre deux sommets quelconques) : n × (n − 1)/2 arêtes. Densité : proportion d’arêtes présentes par rapport au graphe complet. Arbre : graphe sans cycles. Sommet atteignable à partir d’un sommet u : tout sommet v tel qu’il existe un chemin entre u et v. Graphes – Stéphane Grandcolas – p. 9/40 Vocabulaire (graphes non orientés). voisins sommet de degré 5 Graphes – Stéphane Grandcolas – p. 10/40 Génération aléatoire Données : n le nombre de sommets, θ la densité désirée, en choisissant les arêtes : pour le nombre d’arêtes voulu (θ × n × (n − 1)/2) on tire au hasard deux sommets non déja connectés et on les connecte, en sélectionnant ou non chaque arête : pour chaque arête potentielle (il y en a n × (n − 1)/2) on tire au hasard en fonction de θ sa sélection. chemin (6 sommets) Avec la deuxième méthode on n’obtient pas forcément la densité θ. Avec la première méthode si la densité est élevée (si θ vaut 1 dans le pire des cas), il vaut mieux choisir au hasard les arêtes qui ne seront pas dans le graphe. graphe complet Graphes – Stéphane Grandcolas – p. 11/40 Graphes – Stéphane Grandcolas – p. 12/40 Représentation par des listes d’adjacence. Représentation par des listes d’adjacence. A chaque sommet est associée la liste de ses voisins. Voisins 2 typedef struct maillon *LISTE ; struct maillon { int s ; le poids de l’arete ou de l’arc si il y a besoin int w ; LISTE suiv ; }; 5 1 3 4 1 2 3 2 1 2 3 2 4 4 1 5 2 4 3 LISTE Voisins[MAX_SOMMETS] ; ou LISTE * Voisins ; /* allocation dynamique */ Graphes – Stéphane Grandcolas – p. 13/40 Représentation avec des matrices d’adjacence. Graphes – Stéphane Grandcolas – p. 14/40 Représentation avec des matrices d’adjacence. Pour chaque couple de sommets un booléen indique s’ils sont voisins. 1 2 3 4 5 0 1 1 0 0 2 1 0 1 1 1 3 1 1 0 1 0 4 0 1 1 0 0 5 1 0 0 0 2 1 int Mat[MAX_SOMMETS][MAX_SOMMETS] ; 5 1 Ces tables sont souvent allouées dynamiquement 3 int ** Mat ; 4 0 Graphe pondéré : une deuxième matrice pour les poids ou +∞ pour signaler qu’il n’y a pas d’arête Graphes – Stéphane Grandcolas – p. 15/40 Graphes – Stéphane Grandcolas – p. 16/40 Parcours en largeur. Parcours en largeur. Coloration des sommets pendant le parcours parcours à partir d’un sommet origine s : sommet non visité (état initial) calcul des distances des sommets parcourus à s (nombre de sommets) BLANC GRIS : sommet découvert, ses voisins n’ont pas été traités construction d’une arborescence en largeur de racine s NOIR : sommet visité, ses voisins ont été découverts On découvre les sommets situés à la distance k (nombre d’arcs ou d’arêtes) avant les sommets situés à la distance k + 1 Les sommets non atteignables à partir de l’origine ne sont jamais découverts d : distance des sommets au sommet origine pred : prédécesseurs ou pères dans l’arborescence les sommets découverts (GRIS) sont stockés dans une file d’attente origine Graphes – Stéphane Grandcolas – p. 17/40 Graphes – Stéphane Grandcolas – p. 18/40 Parcours en largeur. 6 5 Parcours en largeur. 7 6 5 1 7 1 3 4 3 9 4 2 1 9 2 3 4 5 Graphes – Stéphane Grandcolas – p. 19/40 Graphes – Stéphane Grandcolas – p. 19/40 Parcours en largeur. 6 5 Parcours en largeur. 7 6 5 1 7 1 3 3 9 4 9 4 2 4 5 2 2 5 2 Graphes – Stéphane Grandcolas – p. 19/40 Graphes – Stéphane Grandcolas – p. 19/40 Parcours en largeur. 6 5 Parcours en largeur. 7 6 5 7 1 1 3 4 3 9 4 2 9 2 6 2 6 Graphes – Stéphane Grandcolas – p. 19/40 Graphes – Stéphane Grandcolas – p. 19/40 Parcours en largeur. 6 5 Parcours en largeur. 7 6 5 1 7 1 3 3 9 4 9 4 2 7 2 9 Graphes – Stéphane Grandcolas – p. 19/40 Parcours en largeur. 6 5 Parcours en largeur procédure ParcoursEnLargeur(G, s) O(|S| + |A|) (In : G = (S, A) un graphe, s un sommet de S) (F est une file d’attente (FIFO)) 7 1 3 4 Graphes – Stéphane Grandcolas – p. 19/40 1 pour chaque sommet u ∈ S − {s} faire 2 d[u] := ∞, pred[u] :=AUCUN, couleur[u] :=BLANC, 3 d[s] := 0, pred[s] :=AUCUN, couleur[s] :=GRIS, 4 F := ∅, 5 ENFILE(s, F ), 6 tant que F 6= ∅ faire 7 u :=DEFILE(F ), 8 pour chaque v ∈ V oisins[u] faire 9 si couleur[v] =BLANC alors 10 couleur[v] :=GRIS, 11 d[v] := d[u] + 1, 12 pred[v] := u, 13 ENFILE(v, F ), 14 couleur(u) :=NOIR, 9 2 Graphes – Stéphane Grandcolas – p. 19/40 Graphes – Stéphane Grandcolas – p. 20/40 Parcours en profondeur. Parcours en profondeur. produit plusieurs arborescences en profondeur exploration récursive des voisins non déja visités du sommet courant Coloration des sommets pendant l’exploration (permet de détecter un sommet déja visité) BLANC comparable au parcours en profondeur d’un arbre : sommet non découvert GRIS : sommet découvert, arborescence en cours d’exploration NOIR : sommet visité, arborescence sous-jacente parcourue debut : date de découverte f in : date de fin de parcours de l’arborescence sous-jacente (tous les sommets voisins ont été explorés) Pour tout sommet u debut[u] < f in[u] Graphes – Stéphane Grandcolas – p. 21/40 Graphes – Stéphane Grandcolas – p. 22/40 Parcours en profondeur. 6 5 Parcours en profondeur. 7 2 2 3 7 2− 3 8 1− 4 6 5 8 1− 4 1 Graphes – Stéphane Grandcolas – p. 23/40 1 Graphes – Stéphane Grandcolas – p. 23/40 Parcours en profondeur. Parcours en profondeur. 3− 6 5 2 3−4 7 2 2− 3 8 1− 4 7 2− 8 3 6 5 1− 4 1 1 Graphes – Stéphane Grandcolas – p. 23/40 Graphes – Stéphane Grandcolas – p. 23/40 Parcours en profondeur. Parcours en profondeur. 3−4 6 5 2 3−4 7 5 2 2−5 6− 8 3 1− 4 7 2−5 8 3 6 1− 4 1 Graphes – Stéphane Grandcolas – p. 23/40 1 Graphes – Stéphane Grandcolas – p. 23/40 Parcours en profondeur. Parcours en profondeur. 3−4 6 5 3−4 7 2 2−5 2 6−7 3 6 5 9− 2−5 8 6−7 3 8 1− 4 7 1−8 4 1 1 Graphes – Stéphane Grandcolas – p. 23/40 Graphes – Stéphane Grandcolas – p. 23/40 Parcours en profondeur. Parcours en profondeur. 3−4 6 5 9− 2 7 2−5 10− 4 2 8 4 1 Graphes – Stéphane Grandcolas – p. 23/40 7 2−5 10− 1−8 6 5 9− 6−7 3 3−4 11− 6−7 3 8 1−8 1 Graphes – Stéphane Grandcolas – p. 23/40 Parcours en profondeur. 9− 11− 12− 5 6 2 3−4 2 6−7 8 4 7 2−5 6−7 3 10− 1−8 8 1−8 4 1 3−4 6 5 9− 3 12−13 11− 7 2−5 10− Parcours en profondeur. 1 Graphes – Stéphane Grandcolas – p. 23/40 Graphes – Stéphane Grandcolas – p. 23/40 Parcours en profondeur. 12−13 11−14 2 10− 4 3−4 6 5 9− Parcours en profondeur. 12−13 11−14 7 2−5 6−7 3 8 2 10−15 1−8 4 1 Graphes – Stéphane Grandcolas – p. 23/40 6 5 9− 3−4 7 2−5 6−7 3 8 1−8 1 Graphes – Stéphane Grandcolas – p. 23/40 Parcours en profondeur : arborescence. 12−13 11−14 2 3−4 6 5 9−16 2 6−7 8 4 7 2−5 10−15 1−8 6−7 8 3 1−8 4 1 3−4 6 5 9−16 3 12−13 11−14 7 2−5 10−15 Parcours en profondeur : arcs arrières. 1 Graphes – Stéphane Grandcolas – p. 24/40 Parcours en profondeur : arcs avants. 12−13 11−14 2 10−15 4 Parcours en profondeur : arcs transverses. 3−4 6 5 9−16 Graphes – Stéphane Grandcolas – p. 25/40 12−13 11−14 7 2−5 6−7 3 8 2 10−15 1−8 4 1 Graphes – Stéphane Grandcolas – p. 26/40 6 5 9−16 3−4 7 2−5 6−7 3 8 1−8 1 Graphes – Stéphane Grandcolas – p. 27/40 Parcours en profondeur : mise en place. procédure ParcoursEnProfondeur(G) (In : G = (S, A) un graphe) 1 2 3 4 5 6 7 Parcours en profondeur : parcours. procédure VISITER(u) 1 couleur[u] =GRIS, 2 date := date + 1, 3 debut[u] := date, 4 pour chaque sommet v ∈ V oisins(u) faire 5 si couleur[v] =BLANC alors 6 pred[v] := u, 7 VISITER(v), 8 couleur[u] :=NOIR, 9 date := date + 1, 10 f in[u] := date, u ∈ S faire pred[u] :=AUCUN, couleur[u] :=BLANC, date := 0, pour chaque sommet u ∈ S faire si couleur[u] =BLANC alors VISITER(u), pour chaque sommet Graphes – Stéphane Grandcolas – p. 28/40 Graphes – Stéphane Grandcolas – p. 29/40 Parcours en profondeur. Parcours en profondeur : dates. Complexité O(|S| + |A|) Soient deux sommets u et v soit [debut[u], f in[u]] et [debut[v], f in[v]] sont disjoints Initialisation O(|S|) Parcours des voisins de chaque sommet O(|A|) (arborescences disjointes) soit [debut[u], f in[u]] est inclus dans [debut[v], f in[v]] (v est un ancêtre de u) soit [debut[v], f in[v]] est inclus dans [debut[u], f in[u]] (u est un ancêtre de v) Donc debut[u] < debut[v] < f in[u] ⇒ f in[v] < f in[u] (v est un descendant de u) Graphes – Stéphane Grandcolas – p. 30/40 Graphes – Stéphane Grandcolas – p. 31/40 Parcours en profondeur : dates. Parcours en profondeur : théorème du chemin blanc. Inversement si v est descendant de u dans une arborescence alors debut(u) < debut(v) < f in(v) < f in(u) Un sommet v est un descendant d’un sommet u si et ssi à la date debut[u] où u est découvert il existe un chemin blanc de u à v. v car 6 5 9− v est découvert après u donc debut(u) < debut(v) 2 on finit de traiter v avant u donc f in(v) < f in(u) 3−4 7 2−5 u 6−7 3 8 1−8 4 1 Graphes – Stéphane Grandcolas – p. 32/40 Graphes – Stéphane Grandcolas – p. 33/40 Parcours en profondeur : théorème du chemin blanc. Parcours en profondeur : théorème du chemin blanc. v est descendant de u ⇒ il existe un chemin blanc de u à v il existe un chemin blanc de u à v ⇒ v est descendant de u supposons que v soit le premier sommet du chemin blanc qui ne soit pas un descendant de u. on note w son prédécesseur dans le chemin blanc Tout sommet w situé entre u et v dans l’arborescence vérifie debut[w] > debut[u] donc w est BLANC quand u est découvert v w u 6 5 9− 2 3−4 7 2−5 u 6−7 3 8 1−8 4 Graphes – Stéphane Grandcolas – p. 34/40 1 Graphes – Stéphane Grandcolas – p. 35/40 Parcours en profondeur : théorème du chemin blanc. debut[u] < debut[v] puisque v est blanc quand u est découvert debut[v] < f in[w] puisque v est un voisin de w Plus courts chemins G = (S, A, w) un graphe pondéré La longueur du chemin (u1 , . . . , uk ) est f in[w] ≤ f in[u] puisque w est un descendant de u k−1 X Donc w(ui , ui+1 ) i=1 debut[u] < debut[v] < f in[u] δ(u, v) : longueur du plus court chemin entre u et v. et donc v est un descendant de u Propriété. ∀s, u, v, δ(s, v) ≤ δ(s, u) + w(u, v) Graphes – Stéphane Grandcolas – p. 36/40 Graphes – Stéphane Grandcolas – p. 37/40 Algorithme de Dijkstra. Algorithme de Dijkstra. calcul des plus courts chemins à partir d’un sommet donné notations graphes orientés sans arcs de poids négatifs s est le sommet source représentation par listes d’adjacence d[v] représente une borne supérieure pour δ(s, v) à tout moment d[v] vérifie d[v] ≥ δ(s, v) initialisation : ∀u, u 6= s, d[u] = ∞, d[s] = 0. Graphes – Stéphane Grandcolas – p. 38/40 Graphes – Stéphane Grandcolas – p. 39/40 Algorithme de Dijkstra. Algorithme de Dijkstra. Relachement. Affinage de la borne d[v] si d[v] > d[u] + w(u, v) alors on remplace d[v] par d[u] + w(u, v) E : sommets traités (plus courts chemins connus) F : sommets en attente itération : extraction du sommet de F le plus proche u w(u,v)=2 d[u]=5 18 source s w t 7 E d[v]=9 relachement de l’arc (u,v) 12 u v s F y x d[v]=7 11 v validité : puisque d[u] ≥ δ(u) plus courts chemins d[u] + w(u, v) ≥ δ(u) + w(u, v) ≥ δ(v) sommets en attente Graphes – Stéphane Grandcolas – p. 40/40 Plus courts chemins : Dijkstra. 1 inf source s 2 7 8 x inf 1 w 10 4 0 2 7 Graphes – Stéphane Grandcolas – p. 42/40 inf 9 8 x 1 w 10 4 inf inf 2 5 13 v t 12 s inf u 3 inf 9 1 inf 2 5 12 Plus courts chemins : Dijkstra. source t u 3 0 inf Graphes – Stéphane Grandcolas – p. 41/40 13 v inf Graphes – Stéphane Grandcolas – p. 42/40 Plus courts chemins : Dijkstra. 1 inf source 12 s 2 5 2 8 x 7 w 10 4 0 v inf 2 5 2 inf 9 8 x 7 13 1 v 2 inf w 10 4 13 1 t 12 s inf u 3 inf 9 1 12 source t u 3 0 inf Plus courts chemins : Dijkstra. inf Graphes – Stéphane Grandcolas – p. 42/40 Plus courts chemins : Dijkstra. 1 12 source s 2 7 8 x 2 1 w 10 4 0 2 7 Graphes – Stéphane Grandcolas – p. 42/40 inf 9 8 x 1 w 10 4 2 inf 2 5 13 v t 12 s inf u 3 inf 9 1 12 2 5 12 Plus courts chemins : Dijkstra. source t u 3 0 inf Graphes – Stéphane Grandcolas – p. 42/40 13 v inf Graphes – Stéphane Grandcolas – p. 42/40 Plus courts chemins : Dijkstra. 1 10 source 12 s 2 5 2 8 x 7 w 10 4 0 v 2 2 5 2 8 7 w 10 4 x 3 inf 9 13 1 t 12 s inf u 3 inf 9 1 10 source t u 3 0 inf Plus courts chemins : Dijkstra. 13 1 v 2 3 Graphes – Stéphane Grandcolas – p. 42/40 Plus courts chemins : Dijkstra. 1 10 source s 2 7 8 x 2 1 w 10 4 0 2 7 Graphes – Stéphane Grandcolas – p. 42/40 16 9 8 x 1 w 10 4 2 3 2 5 13 v t 12 s 13 u 3 inf 9 1 7 2 5 12 Plus courts chemins : Dijkstra. source t u 3 0 inf Graphes – Stéphane Grandcolas – p. 42/40 13 v 3 Graphes – Stéphane Grandcolas – p. 42/40 Plus courts chemins : Dijkstra. 1 7 source 12 s 2 5 2 8 x 7 w 10 4 0 v 2 2 5 2 8 7 w 10 4 x 3 16 9 13 1 t 12 s 13 u 3 16 9 1 7 source t u 3 0 13 Plus courts chemins : Dijkstra. 13 1 v 2 3 Graphes – Stéphane Grandcolas – p. 42/40 Plus courts chemins : Dijkstra. 1 7 source s 2 7 8 x 2 1 w 10 4 0 2 7 3 16 9 8 x 1 w 10 4 2 Graphes – Stéphane Grandcolas – p. 42/40 2 5 13 v t 12 s 8 u 3 16 9 1 7 2 5 12 Plus courts chemins : Dijkstra. source t u 3 0 8 Graphes – Stéphane Grandcolas – p. 42/40 13 v 3 Graphes – Stéphane Grandcolas – p. 42/40 Plus courts chemins : Dijkstra. 1 7 source 12 s 2 5 2 8 x 7 w 10 4 0 v 2 2 5 2 7 3 10 9 8 x 1 2 w 10 4 13 1 t 12 s 8 u 3 10 9 1 7 source t u 3 0 8 Plus courts chemins : Dijkstra. 13 v 3 Graphes – Stéphane Grandcolas – p. 42/40 Plus courts chemins : Dijkstra. 1 7 source 0 s 2 7 2 5 10 9 8 x 2 1 w 10 4 pondéré, s un sommet de G (F une file de priorité) t 12 Algorithme de Dijkstra. procédure DIJKSTRA(G, s) in : G = (S, V [], w) un graphe 8 u 3 Graphes – Stéphane Grandcolas – p. 42/40 13 v 3 Graphes – Stéphane Grandcolas – p. 42/40 1 F := S, 2 pour chaque sommet u ∈ S faire 3 d[u] := ∞, 4 d[s] := 0, 5 tant que F 6= ∅ faire 6 u :=ExtraireLeMin(F ), 7 pour chaque sommet v ∈ V [u] faire 8 si d[v] > d[u] + w(u, v) alors 9 d[v] = d[u] + w(u, v), 10 renvoyer d, Graphes – Stéphane Grandcolas – p. 43/40 Algorithme de Dijkstra. Algorithme de Dijkstra : preuve. En faisant une recherche linéaire dans F : O(|S|2 + |A|) Supposition. quand u est extrait de F , d[u] > δ(s, u) [on suppose que u est le premier dans ce cas] En implémentant F avec un tas : initialisations : O(|S|) considérons un plus court chemin entre s et u, Construction du tas : O(|S|) soit y le premier sommet de ce chemin non dans E, maintien du tas : O(|S| × log|S| + |A| × log|S|) = O(|A| × log|S|) soit x le sommet précédent y. soit O((|S| + |A|) × log|S|) E (O(|S| × log|S| + |A|) avec un tas de Fibonacci) u s x Graphes – Stéphane Grandcolas – p. 44/40 Algorithme de Dijkstra : preuve. le chemin jaune est un plus court chemin le chemin jaune et l’arête rouge est un plus court chemin (car sous chemin d’un plus court chemin entre s et u) δ(s, u) ≥ δ(s, y) = d[y] car (x, y) a été relaché d[y] ≥ d[u] puisqu’on a extrait u et non pas y donc δ(s, u) ≥ d[u] ce qui contredit l’hypothèse δ(s, u) < d[u] E u s x y Graphes – Stéphane Grandcolas – p. 46/40 y Graphes – Stéphane Grandcolas – p. 45/40