Graphes - Département Informatique et Interactionsgcolas/algo-licence/slides/graphes...Graphes Plan...

Post on 16-Jun-2021

12 views 2 download

Transcript of Graphes - Département Informatique et Interactionsgcolas/algo-licence/slides/graphes...Graphes Plan...

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