graphes - département informatique et interactionsgcolas/algo-licence/slides/graphes...graphes plan...
TRANSCRIPT
Graphes
Plan du cours :
définitions,
exemples,
parcours en profondeur,
algorithme de Dijkstra.
Un graphe exprime une relation, une distance entre desobjets.
Graphes 1 – SG – p. 1/51
Graphes : G = (S,A)
S : ensemble des sommets,
A : ensemble des arêtes A = {{u, v}, u ∈ S, v ∈ S}
(1,2)(2,3)(1,3)(1,5)(3,7)(4,6)(8,4)(7,5)(3,5)(8,6)
8
1
2
4
6
5
3
7
Graphes 1 – SG – p. 2/51
Graphes orientés.
G = (S, A), avec A = {(u, v), u ∈ S, v ∈ S} un ensemble d’arcs
4
1
2
5
6
3
Graphes 1 – SG – p. 3/51
Graphes pondérés.
G = (S, A, w) : chaque arête (u, v) a pour poids w(u, v)
6
12
15
20
26
1210
17
11
4
33
20
14
3
8
7
6
4
1
2 5
9
Graphes 1 – SG – p. 4/51
Exemple : Trajet le plus court entre deux villes.
90
183150
10050
100
57
60
120
100100
105
170
153
60
Gap
Turin
Marseille
Digne
Cuneo
Nice
Toulon
Briancon
Grenoble
Barcelonette
Graphe représentant les liaisons routières et les durées de trajet.
Graphes 1 – SG – p. 5/51
Exemple : Trajet le plus court entre deux villes.
90
183150
10050
100
57
60
120
100100
105
170
153
60
Gap
Turin
Marseille
Digne
Cuneo
Nice
Toulon
Briancon
Grenoble
Barcelonette
Calcul d’un plus court chemin entre Marseille et Turin.
Graphes 1 – SG – p. 6/51
Exemple : le choux, la chèvre et le loup (le passeur).
Conflits :
loup et chèvre,
chèvre et choux.
Problème : est-il possible de faire traverser la rivière au choux, à lachèvre et au loup, sans perte ?
Graphes 1 – SG – p. 7/51
Exemple : le choux, la chèvre et le loup (le passeur).
Cv P Cv
Cx Lp P Cx
Cv Lp P
Cx P
Cv Lp
Lp P
Cx Cv
Lp Cx Lp P
Cv Cv P
Cx Lp
Cx Cv Lp P
Cx Cv Lp
P
Cx Cv P
Cx Cv Lp P
Cx P
Cv Lp Cx
Cv Lp P Lp
Cx Cv P
Lp P
Cx Cv
Cx Lp
Graphe représentant les états et les transitions.
Graphes 1 – SG – p. 8/51
Exemple : le choux, la chèvre et le loup (et le passeur).
Cv P Cv
Cx Lp P Cx
Cv Lp P
Cx P
Cv Lp
Lp P
Cx Cv
Lp Cx Lp P
Cv Cv P
Cx Lp
Cx Cv Lp P
Cx Cv Lp
P
Cx Cv P
Cx Cv Lp P
Cx P
Cv Lp Cx
Cv Lp P Lp
Cx Cv P
Lp P
Cx Cv
Cx Lp
Elimination des états conflictuels.
Graphes 1 – SG – p. 9/51
Exemple : le choux, la chèvre et le loup (et le passeur).
Cx
Cv Lp P
Lp Cx Lp P
Cv Cv P
Cx Lp
Cx Cv Lp P
Cx Cv P
Cx Cv Lp P
Cx
Cv Lp P Lp
Cx Cv P
Cx Lp
Cv P Cv
Cx Lp P
Graphes 1 – SG – p. 10/51
Exemple : le choux, la chèvre et le loup (et le passeur).
Cx
Cv Lp P
Lp Cx Lp P
Cv Cv P
Cx Lp
Cx Cv Lp P
Cx Cv P
Cx Cv Lp P
Cx
Cv Lp P Lp
Cx Cv P
Cx Lp
Cv P Cv
Cx Lp P
Calcul d’un chemin entre l’état initial et l’objectif.
Graphes 1 – SG – p. 11/51
Vocabulaire (graphes non orientés).
chemin (6 sommets)
sommet de degré 5voisins
graphe complet : aretesn × (n − 1)/2
Graphes 1 – SG – p. 12/51
Vocabulaire (graphes non orientés).
Arbre : connexe, sans cycle
Graphe connexe Graphe non connexe
cycle
Graphes 1 – SG – p. 13/51
Vocabulaire (graphes non orientés).
Densité : proportion d’arêtes présentes
nombre d′aretes
n × (n − 1)/2
10 sommets, 18 arêtes → densité 0.4
Graphes 1 – SG – p. 14/51
Représentation.
listes d’adjacences,
matrice d’adjacence,
liste des arêtes (ou arcs).
La représentation dépends des algorithmes que l’on va utiliser.
Graphes 1 – SG – p. 15/51
Représentation par des listes d’adjacence.
1
2
1
2
3
4
5
2 4
1
Voisins
3
3
4 5
2
1 5
2
4
3
A chaque sommet est associée la liste de ses voisins.
Graphes 1 – SG – p. 16/51
Représentation par des listes d’adjacence.
1
2
1
2
3
4
5
2 4
1
Voisins
3
3
4 5
2
1 5
2
4
3
typedef struct maillon *Liste ;struct maillon {
int sommet ;int poids ; /* le poids de l’arete ou de l’arc */Liste suiv ;
} ;Liste Voisins[MAX_SOMMETS] ;
Graphes 1 – SG – p. 17/51
Représentation par des listes d’adjacence.
1
2
1
2
3
4
5
2 4
1
Voisins
3
3
4 5
2
1 5
2
4
3
typedef struct maillon *Liste ;struct maillon {
int sommet ;int poids ; /* le poids de l’arete ou de l’arc */Liste suiv ;
} ;Liste * Voisins ; /* allocation dynamique */
Graphes 1 – SG – p. 18/51
Représentation avec des matrices d’adjacence.
1
1 1 0 0
0010
1
2
4
3
2
3 4 5
5 0
00110
1 1 0 1 0
11101
0
3
5
2
1
4
Pour chaque couple de sommets un booléen indique s’ils sont voisins.
Graphes 1 – SG – p. 19/51
Représentation avec des matrices d’adjacence.
1
1 1 0 0
0010
1
2
4
3
2
3 4 5
5 0
00110
1 1 0 1 0
11101
0
3
5
2
1
4
Pour chaque couple de sommets un booléen indique s’ils sont voisins.
#define MAX_SOMMETS 1000int MatAdj[MAX_SOMMETS][MAX_SOMMETS] ;
ou
int ** MatAdj ;
Graphes 1 – SG – p. 20/51
Représentation avec des matrices d’adjacence.
5
1
2
3
4
1 2 3 4 5
0
19
19 5
5
7
7
22
22
14
14 12
12
0
0
0
0
19 22
12
5
714
5
2
1
4
3
∞
∞
∞ ∞
∞
∞
∞∞
Graphe pondéré : une deuxième matrice est nécessaire.On peut aussi utiliser un drapeau dans certains cas particuliers.
Graphes 1 – SG – p. 21/51
Parcours en profondeur.
exploration récursive (semblable au parcours en profondeur pour lesarbres),
marquage des sommets afin de ne pas parcourir indéfiniment lesmêmes sommets s’il y a des cycles,
produit plusieurs arborescences.
Graphes 1 – SG – p. 22/51
Parcours en profondeur.
Coloration des sommets pendant l’exploration
BLANC : sommet non découvert
GRIS : sommet découvert, arborescence en cours d’exploration
NOIR : sommet visité, arborescence sous-jacente parcourue
debut : date de découvertefin : date de fin de parcours de l’arborescence sous-jacente (tous lessommets voisins ont été explorés)
Pour tout sommet u
debut[u] < fin[u]
Graphes 1 – SG – p. 23/51
Parcours en profondeur.
2
1
8
4
3
765
Graphes 1 – SG – p. 24/51
Parcours en profondeur.
1−3
4
2
1
8
75 6
Graphes 1 – SG – p. 24/51
Parcours en profondeur.
2−
1−3
4
2
1
8
5 6 7
Graphes 1 – SG – p. 24/51
Parcours en profondeur.
3−
1−
2−
3
4
2
1
8
5 6 7
Graphes 1 – SG – p. 24/51
Parcours en profondeur.
3−4
1−
2−
3
4
2
1
8
5 6 7
Graphes 1 – SG – p. 24/51
Parcours en profondeur.
2−5
3−4
1−4
2
1
83
65 7
Graphes 1 – SG – p. 24/51
Parcours en profondeur.
6−
1−
3−4
2−5
4
2
1
83
5 6 7
Graphes 1 – SG – p. 24/51
Parcours en profondeur.
6−72−5
3−4
1−4
1
2
3
5
8
76
Graphes 1 – SG – p. 24/51
Parcours en profondeur.
1−8
6−72−5
3−4
4
2
3
6
8
5
1
7
Graphes 1 – SG – p. 24/51
Parcours en profondeur.
9−
3−4
2−5 6−7
1−8
2
4
3 8
5 6 7
1
Graphes 1 – SG – p. 24/51
Parcours en profondeur.
10−
3−4
2−5 6−7
1−8
9−
2
41
8
75 6
3
Graphes 1 – SG – p. 24/51
Parcours en profondeur.
11− 3−4
2−5 6−7
1−8
9−
10−
2
5
4
8
1
6 7
3
Graphes 1 – SG – p. 24/51
Parcours en profondeur.
12− 3−4
2−5 6−7
1−8
9−
10−
11−
4
65
2
3
7
8
1
Graphes 1 – SG – p. 24/51
Parcours en profondeur.
3−4
2−5
11−
6−7
10−
1−8
9−
12−13
2
4
5
8
6
3
1
7
Graphes 1 – SG – p. 24/51
Parcours en profondeur.
3−4
2−5
12−13
6−7
10−
1−8
9−
11−14
4
2
83
6 75
1
Graphes 1 – SG – p. 24/51
Parcours en profondeur.
3−4
2−5
11−14
6−7
12−13
1−8
9−
10−15
2
1
8
6
3
5 7
4
Graphes 1 – SG – p. 24/51
Parcours en profondeur : arborescence.
9−16
3−4
2−5 6−7
1−8
12−1311−14
10−15
2
3
5
8
14
76
Graphes 1 – SG – p. 25/51
Parcours en profondeur : arcs arrières.
9−16
3−4
2−5 6−7
1−8
12−1311−14
10−15
2
3
5
8
14
76
Graphes 1 – SG – p. 26/51
Parcours en profondeur : arcs avants.
9−16
3−4
2−5 6−7
1−8
12−1311−14
10−15
2
3
5
8
14
76
Graphes 1 – SG – p. 27/51
Parcours en profondeur : arcs transverses.
9−16
3−4
2−5 6−7
1−8
12−1311−14
10−15
2
3
5
8
14
76
Graphes 1 – SG – p. 28/51
Parcours en profondeur : mise en place.
procédure PARCOURS_EN_PROFONDEUR(G)(In : G = (S, A) un graphe)
1 pour chaque sommet u ∈ S faire2 pred[u] :=AUCUN,3 couleur[u] :=BLANC,4 date := 0,5 pour chaque sommet u ∈ S faire6 si couleur[u] =BLANC alors7 VISITER(u),
Graphes 1 – SG – p. 29/51
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) faire5 si couleur[v] =BLANC alors6 pred[v] := u,7 VISITER(v),8 couleur[u] :=NOIR,9 date := date + 1,10 fin[u] := date,
Graphes 1 – SG – p. 30/51
Parcours en profondeur.
Complexité O(|S| + |A|)
Initialisation O(|S|)Parcours des voisins de chaque sommet O(|A|)
Graphes 1 – SG – p. 31/51
Parcours en profondeur : dates.
Soient deux sommets u et v
soit [debut[u], fin[u]] et [debut[v], fin[v]] sont disjoints(arborescences disjointes)
soit [debut[u], fin[u]] est inclus dans [debut[v], fin[v]](v est un ancêtre de u)
soit [debut[v], fin[v]] est inclus dans [debut[u], fin[u]](u est un ancêtre de v)
Doncdebut[u] < debut[v] < fin[u] ⇒ fin[v] < fin[u]
(v est un descendant de u)
Graphes 1 – SG – p. 32/51
Parcours en profondeur : dates.
Inversement si v est descendant de u dans une arborescence alors
debut(u) < debut(v) < fin(v) < fin(u)
car
v est découvert après u donc debut(u) < debut(v)
on finit de traiter v avant u donc fin(v) < fin(u)
Graphes 1 – SG – p. 33/51
Plus courts chemins
G = (S, A, w) un graphe pondéré.
La longueur du chemin (u1, . . . , uk) est
k−1∑
i=1
w(ui, ui+1)
Notation. δ(u, v) : longueur du plus court chemin entre u et v.
Graphes 1 – SG – p. 34/51
Plus courts chemins
Propriété. ∀s, u, v, δ(s, v) ≤ δ(s, u) + w(u, v)
s
u
v
δ(s, v)
δ(s, u)
Graphes 1 – SG – p. 35/51
Algorithme de Dijkstra.
Calcul des plus courts chemins à partir d’un sommet donné.
Graphes orientés ou non orientés.
Les arcs ont des poids positifs ou nuls.
Représentation du graphe par des listes d’adjacence.
L’algorithme de Dijkstra découvre à chaque étape de nouveaux cheminsissus du sommet source.
Graphes 1 – SG – p. 36/51
Algorithme de Dijkstra.
Notations.
s : sommet source.
d[u] : distance, indexée sur les sommets. A tout moment
∀u ∈ S, d[u] ≥ δ(s, u)
d[u] est la longueur du PCC de s à u découvert à ce stade.
Graphes 1 – SG – p. 37/51
Algorithme de Dijkstra.
Notations.
s : sommet source.
d[u] : distance, indexée sur les sommets. A tout moment
∀u ∈ S, d[u] ≥ δ(s, u)
d[u] est la longueur du PCC de s à u découvert à ce stade.
Initialement∀u ∈ S, u 6= s, d[u] = ∞,d[s] = 0.
Finalement∀u ∈ S, d[u] = δ(s, u).
Graphes 1 – SG – p. 38/51
Algorithme de Dijkstra.
Opération de 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)
u
vs
w(u, v) = 2
d[v] = 9
d[u] = 5
relachement de l’arc (u, v) ⇒ d[v] = 7
S’il existe un chemin de longueur 5 entre s et u, alors il existe une cheminde longueur 7 entre s et v.
Graphes 1 – SG – p. 39/51
Algorithme de Dijkstra.
File de priorité F (∀u 6∈ F, d[u] = δ(u))
Itération : extraction d’un sommet u de F de distance d[u] minimale
plus courts chemins
source
e
g
s
c
f
18
7
12
1122
a
b
d
F
Propriété : au moment de l’extraction le sommet u vérifie d[u] = δ(u)
Graphes 1 – SG – p. 40/51
Plus courts chemins : Dijkstra.
4
inf
inf
2
7
3
812
5
1
109
1 13
2
infinf
0
inf
sourcet
x
w
v
s
u
Graphes 1 – SG – p. 41/51
Plus courts chemins : Dijkstra.
2
inf
inf
7
2
12
3
8
1
5
94
1 13
10
infinf
0
inf
sourcet
x
w
v
s
u
Graphes 1 – SG – p. 41/51
Plus courts chemins : Dijkstra.
13
0
inf inf
inf
7
2
128
3
1
5
4
1
910
2
infinfsourceu t
w
vx
s
Graphes 1 – SG – p. 41/51
Plus courts chemins : Dijkstra.
4
inf
inf
12
27
2
128
35
1
2
13
109
1
inf
0
source
w
vx
u t
s
Graphes 1 – SG – p. 41/51
Plus courts chemins : Dijkstra.
13
12
27
2
12
3
1
5
48
1
910
2
inf
0
inf
inf
source
w
vx
u t
s
Graphes 1 – SG – p. 41/51
Plus courts chemins : Dijkstra.
13
12
27
2
12
3
1
5
48
1
910
2
inf
0
inf
inf
source
w
vx
u t
s
Graphes 1 – SG – p. 41/51
Plus courts chemins : Dijkstra.
13
12
27
2
12
3
1
5
48
1
910
2
inf
0
inf
inf
source
w
vx
u t
s
Graphes 1 – SG – p. 41/51
Plus courts chemins : Dijkstra.
2
10
37
1
49
10
13
2
1
53
128
inf
0 inf
2
sourceu t
w
x
s
v
Graphes 1 – SG – p. 41/51
Plus courts chemins : Dijkstra.
13
10
37
2
128
3
1
5
4
1
910
2
inf
0 inf
2
sourceu t
w
x
s
v
Graphes 1 – SG – p. 41/51
Plus courts chemins : Dijkstra.
13
10
37
2
128
3
1
5
4
1
910
2
inf
0 inf
2
sourceu t
w
x
s
v
Graphes 1 – SG – p. 41/51
Plus courts chemins : Dijkstra.
2
10
37
1
4
5
910
2
13
8
1
3
12
inf
0 inf
2
sourceu t
w
x
s
v
Graphes 1 – SG – p. 41/51
Plus courts chemins : Dijkstra.
3
13
16
7
28
1
49
10
13
2
1
5120
2 3
7source
w
vx
u
s
t
Graphes 1 – SG – p. 41/51
Plus courts chemins : Dijkstra.
13
13
16
7
2
12
3
8 49
10
2
1
5
1
0
2 3
7source
w
vx
u
s
t
Graphes 1 – SG – p. 41/51
Plus courts chemins : Dijkstra.
13
13
16
7
2
12
3
8 49
10
2
1
5
1
0
2 3
7source
w
vx
u
s
t
Graphes 1 – SG – p. 41/51
Plus courts chemins : Dijkstra.
13
13
16
7
2
128
3
4
1
9
5
1
2
100
2 3
7source
w
vx
u
s
t
Graphes 1 – SG – p. 41/51
Plus courts chemins : Dijkstra.
13
16
8
7
2
128
3
1
5
4
1
910
2
0
2 3
7source
w
vx
u
s
t
Graphes 1 – SG – p. 41/51
Plus courts chemins : Dijkstra.
13
16
8
7
2
12
3
1
5
48
1
910
2
0
2 3
7source
w
vx
u
s
t
Graphes 1 – SG – p. 41/51
Plus courts chemins : Dijkstra.
13
16
8
7
2
12
3
1
5
48
1
910
2
0
2 3
7source
w
vx
u
s
t
Graphes 1 – SG – p. 41/51
Plus courts chemins : Dijkstra.
13
16
8
7
2
12
3
1
5
48
1
910
2
0
2 3
7source
w
vx
u
s
t
Graphes 1 – SG – p. 41/51
Plus courts chemins : Dijkstra.
2
8
10
7
2
128
3
1
5
4
1
910
13
0
2 3
7source
w
vx
u
s
t
Graphes 1 – SG – p. 41/51
Plus courts chemins : Dijkstra.
13
8
10
7
2
128
3
1
5
4
1
910
2
0
2 3
7source
w
u t
vx
s
Graphes 1 – SG – p. 41/51
Plus courts chemins : Dijkstra.
13
8
10
7
2
128
3
1
5
4
1
910
2
0
2 3
7source
w
u t
vx
s
Graphes 1 – SG – p. 41/51
Plus courts chemins : Dijkstra.
2
8
10
7
28
12
3
1
5
4
1
910
13
0
2 3
7source
w
u t
vx
s
Graphes 1 – SG – p. 41/51
Algorithme de Dijkstra.
algorithme DIJKSTRA(G, s)in : G = (S, V [], w) un graphe pondéré, s un sommet de G(F une file de priorité)
1 F := S, {i.e. initialement F contient tous les sommets}2 pour chaque sommet u ∈ S faire3 d[u] := ∞,4 d[s] := 0,5 tant que F 6= ∅ faire6 u :=EXTRAIRE_LE_MIN(F ),7 pour chaque sommet v ∈ V [u] faire8 si d[v] > d[u] + w(u, v) alors9 d[v] = d[u] + w(u, v),10 fin pour ,11 fin tant que ,12 renvoyer d,
Graphes 1 – SG – p. 42/51
Algorithme de Dijkstra.
algorithme DIJKSTRA(G, s)in : G = (S, V [], w) un graphe pondéré, s un sommet de G(n le nombre de sommets, m le nombre d’arcs)
1 F := S, O(n)2 pour chaque sommet u ∈ S faire3 d[u] := ∞, O(n)4 d[s] := 0,5 tant que F 6= ∅ faire6 u :=EXTRAIRE_LE_MIN(F ), n × O(n)7 pour chaque sommet v ∈ V [u] faire8 si d[v] > d[u] + w(u, v) alors m fois9 d[v] = d[u] + w(u, v),10 fin pour ,11 fin tant que ,12 renvoyer d,
F : table contenant des sommets.EXTRAIRE_LE_MIN(F ) consiste à par-courir la table.Coût total : O(n2)
Graphes 1 – SG – p. 43/51
Algorithme de Dijkstra.
EXTRAIRE_LE_MIN(F ) :
7 sommets
10 2 3 4 5 6 7 8 9
2
10
d 0 44
10 2 3 4 5 6 7 8 9
F 2
10
8 3 7 410 05916
69 14231418 11
Graphes 1 – SG – p. 44/51
Algorithme de Dijkstra.
EXTRAIRE_LE_MIN(F ) :
7 sommets
10 2 3 4 5 6 7 8 9
2
10
d 0 44
10 2 3 4 5 6 7 8 9
F 2
10
8 3 7 410 05916
69 14231418 11
Graphes 1 – SG – p. 45/51
Algorithme de Dijkstra.
EXTRAIRE_LE_MIN(F ) :
7 sommets
10 2 3 4 5 6 7 8 9
2
10
d 0 44
10 2 3 4 5 6 7 8 9
F 2
10
8 3 7 410 05916
69 14231418 11
Graphes 1 – SG – p. 46/51
Algorithme de Dijkstra.
EXTRAIRE_LE_MIN(F ) :
6 sommets
10 2 3 4 5 6 7 8 9
2
10
d 0 44
10 2 3 4 5 6 7 8 9
F 2
10
8 310 05916
69 14231418 11
4 7
Graphes 1 – SG – p. 47/51
Algorithme de Dijkstra.
algorithme DIJKSTRA(G, s)in : G = (S, V [], w) un graphe pondéré, s un sommet de G(n le nombre de sommets, m le nombre d’arcs)
1 F := S, O(n)2 pour chaque sommet u ∈ S faire3 d[u] := ∞, O(n)4 d[s] := 0,5 tant que F 6= ∅ faire6 u :=EXTRAIRE_LE_MIN(F ), n × O(log n)7 pour chaque sommet v ∈ V [u] faire8 si d[v] > d[u] + w(u, v) alors9 d[v] = d[u] + w(u, v), m × O(log n)10 fin pour ,11 fin tant que ,12 renvoyer d,
F : tas binaire.Extraire le min et diminuer la clé sonten O(log n).Coût total : O(m × log n)
Graphes 1 – SG – p. 48/51
Algorithme de Dijkstra.
En faisant une recherche linéaire dans F : O(|S|2 + |A|)
En implémentant F avec un tas :
initialisations : O(|S|)
Construction du tas : O(|S|)
maintien du tas : O(|S| × log|S| + |A| × log|S|) = O(|A| × log|S|)
Le coût total est donc O(|A| × log|S|) si le graphe est connexe
(O(|S| × log|S| + |A|) avec un tas de Fibonacci)
Graphes 1 – SG – p. 49/51
Algorithme de Dijkstra : preuve.
Supposition. quand u est extrait de F , d[u] > δ(s, u)
[on suppose que u est le premier dans ce cas]
considérons un plus court chemin entre s et u,
soit y le premier sommet de F dans ce chemin,
soit x le sommet précédent y.
s
u
yx
F
Graphes 1 – SG – p. 50/51
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) et δ(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]
s
u
yx
F
Graphes 1 – SG – p. 51/51