graphes iigcolas/algo-licence/slides/pcc.pdfdes àv constituédeauplusi arcs, objectiffinal:opt(n...
TRANSCRIPT
Graphes II
Stéphane Grandcolas - Yann Vaxès
Aix-Marseille Université
2019-2020
Graphes
Plan du cours :
I définitions, exemples,
I plus courts chemins : Dijkstra,
I plus courts chemins : Bellman-Ford,
I plus courts chemins : Floyd et Warshall,
I arbres couvrants de poids minimal (ACM) : (Prim, Kruskal),
Plus courts chemins dans un graphe
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)
la longueur d’un plus court chemin de u à v .
Plus courts chemins dans un graphe
Arcs de poids positifs :I algorithme de Dijkstra (source unique)
Circuits de longueur négative :I pas de plus courts chemins,
Arcs de poids quelconques :I algorithme de Bellman-Ford (source unique)I algorithme de Floyd-Warshall (tous les PCC)
utilisent le principe de la programmation dynamique
Algorithme de Bellman-Ford
Si le graphe G ne contient aucun cycle de longueur négative,alors il existe un plus court chemin élémentaire entre s et t.
s
t
Chemin élémentaire :I chaque sommet apparaît au plus une fois (pas de cycle
dans le chemin)
Algorithme de Bellman-Ford
Si le graphe G ne contient aucun cycle de longueur négative,alors il existe un plus court chemin élémentaire entre s et t.
s
t
Chemin élémentaire :I chaque sommet apparaît au plus une fois (pas de cycle
dans le chemin)
Algorithme de Bellman-Ford
Si le graphe G ne contient aucun cycle de longueur négative,alors il existe un plus court chemin élémentaire entre s et t.
≤ n − 1 arcs
t
s
Chemin élémentaire :I au plus n sommets =⇒ au plus n − 1 arcs,
Algorithme de Bellman-Ford
Entrée : un graphe G , un sommet source s,
Sortie : les longueurs des plus courts chemins issus de s,(constitués d’au plus n − 1 arcs)
Algorithme de Bellman-Ford
Entrée : un graphe G , un sommet source s,
Sortie : les longueurs des plus courts chemins issus de s,(constitués d’au plus n − 1 arcs)
Sous-problèmes OPT (i , v) : longueur minimale d’un cheminde s à v constitué de au plus i arcs,
Objectif final : OPT (n − 1, v)
(plus courts chemins issus de s constitués de au plus n − 1arcs : OPT (n − 1, v) = δ(v))
Algorithme de Bellman-Ford
Entrée : un graphe G , un sommet source s,
Sortie : les longueurs des plus courts chemins issus de s,(constitués d’au plus n − 1 arcs)
Algorithme :
calculer OPT (0, v) pour tout v ,
calculer OPT (1, v) pour tout v ,
. . .
calculer OPT (n − 1, v) pour tout v .
Algorithme de Bellman-Ford
Soit P un chemin optimal pour le sous-problème OPT (i , v)
I si P contient au plus i − 1 arcs alors OPT (i , v) = OPT (i − 1, v),
I si P contient exactement i arcs, alors il existe un sommet u tel que
OPT (i , v) = OPT (i − 1, u) + w(u, v)
OPT (i − 1, u)
OPT (i , v)
Ps
v
w(u, v)u
Algorithme de Bellman-Ford
Définition récursive de OPT (i , v) :
OPT (0, s) = 0
OPT (0, v) = +∞ si v 6= s,
OPT (i , v) = min(OPT (i − 1, v),minu∈V (OPT (i − 1, u) + w(u, v))
)si i > 0.
Algorithme de Bellman-Ford
algorithme BELLMAN-FORD(G , s)in : G = (S ,A,w) un graphe pondéré, s un sommet de S ,
pour v ∈ S faired [0, v ] :=∞,
d [0, s] := 0,pour i := 1, . . . , n − 1 faire
pour v ∈ S faired [i , v ] := min
(d [i − 1, v ],
minu∈S(d [i − 1, u] + w(u, v))),
fin pour,fin pour,renvoyer d ,
avec w(u, v) = +∞ si (u, v) 6∈ A.
Algorithme de Bellman-Ford
algorithme BELLMAN-FORD(G , s)in : G = (S ,A,w) un graphe pondéré, s un sommet de S ,
pour v ∈ S faired [0, v ] :=∞,
d [0, s] := 0,pour i := 1, . . . , n − 1 faire
pour v ∈ S faired [i , v ] := min
(d [i − 1, v ],
minu∈S(d [i − 1, u] + w(u, v))), O(n)
fin pour,fin pour,renvoyer d ,
Complexité : O(n3) (n × n calculs, chacun en O(n)).
Algorithme de Bellman-Ford : amélioration 1
Calcul de minu∈S(d [i − 1, u] + w(u, v))
si (u, v) 6∈ A alors w(u, v) = +∞,
=⇒ inutile de considérer u si (u, v) 6∈ A
Algorithme de Bellman-Ford : amélioration 1
Calcul de minu∈S(d [i − 1, u] + w(u, v))
si (u, v) 6∈ A alors w(u, v) = +∞,
=⇒ inutile de considérer u si (u, v) 6∈ A
donc
minu∈S
(d [i − 1, u] + w(u, v)) = minu∈Adj−1(v)
(d [i − 1, u] + w(u, v))
avec Adj−1(v) = {u ∈ S tel que (u, v) ∈ A}
Algorithme de Bellman-Ford : amélioration 1
algorithme BELLMAN-FORD-a1(G , s)in : G = (S ,A,w) un graphe pondéré, s un sommet de S ,
pour v ∈ S faired [0, v ] :=∞,
d [0, s] := 0,pour i := 1, . . . , n − 1 faire
pour v ∈ S faired [i , v ] := min
(d [i − 1, v ],
minu∈Adj−1(v)(d [i − 1, u] + w(u, v))),
fin pour,fin pour,renvoyer d ,
A l’étape i , on considère chaque arc une fois :
Complexité : O(m × n) (n = |S |, m = |A|)
Algorithme de Bellman-Ford : amélioration 1
algorithme BELLMAN-FORD-a1(G , s)in : G = (S ,A,w) un graphe pondéré, s un sommet de S ,
pour v ∈ S faired [0, v ] :=∞,
d [0, s] := 0,pour i := 1, . . . , n − 1 faire
pour v ∈ S faired [i , v ] := d [i − 1, v ],
pour (u, v) ∈ A fairesi d [i , v ] > d [i − 1, u] + w(u, v) alors
d [i , v ] := d [i − 1, u] + w(u, v),fin pour,
fin pour,renvoyer d ,
Peu importe l’ordre dans lequel on considère les arcs.
Algorithme de Bellman-Ford : exemple
s
3-3
2-2
-1 4
-3
-4
8
b
a
d
c
e
9 0 1 2 3 4 5s 0a ∞b ∞c ∞d ∞e ∞
(a) (b)
Algorithme de Bellman-Ford : exemple
s
3-3
2-2
-1 4
-3
-4
8
b
a
d
c
e
9 0 1 2 3 4 5s 0 0a ∞ −3b ∞ ∞c ∞ 3d ∞ 4e ∞ 2
(a) (b)
Algorithme de Bellman-Ford : exemple
s
3-3
2-2
-1 4
-3
-4
8
b
a
d
c
e
9 0 1 2 3 4 5s 0 0 0a ∞ −3 −3b ∞ ∞ 0c ∞ 3 3d ∞ 4 4e ∞ 2 0
(a) (b)
Algorithme de Bellman-Ford : exemple
s
3-3
2-2
-1 4
-3
-4
8
b
a
d
c
e
9 0 1 2 3 4 5s 0 0 0 0a ∞ −3 −3 −4b ∞ ∞ 0 −2c ∞ 3 3 3d ∞ 4 4 4e ∞ 2 0 0
(a) (b)
Algorithme de Bellman-Ford : exemple
s
3-3
2-2
-1 4
-3
-4
8
b
a
d
c
e
9 0 1 2 3 4 5s 0 0 0 0 0a ∞ −3 −3 −4 −6b ∞ ∞ 0 −2 −2c ∞ 3 3 3 3d ∞ 4 4 4 4e ∞ 2 0 0 0
(a) (b)
Algorithme de Bellman-Ford : exemple
s
3-3
2-2
-1 4
-3
-4
8
b
a
d
c
e
9 0 1 2 3 4 5s 0 0 0 0 0 0a ∞ −3 −3 −4 −6 −6b ∞ ∞ 0 −2 −2 −2c ∞ 3 3 3 3 3d ∞ 4 4 4 4 3e ∞ 2 0 0 0 0
(a) (b)
Algorithme de Bellman-Ford : amélioration 2
Tableau à une dimension D[] pour représenter les distances
D[v ] : longueur d’un chemin entre s et v
initialement :I ∀v , v 6= s, D[v ] = +∞,I D[s] = 0.
mise à jour :I D[v ] = min
(D[v ],minu∈Adj−1(v)(D[u] + w(u, v))
)Justification : après i mises à jour D[v ] ≤ d [i , v ].D[v ] est au plus la longueur d’un plus court chemin entre s et vcontenant au plus i arcs.
Algorithme de Bellman-Ford : amélioration 2
Tableau à une dimension D[] pour représenter les distances
D[v ] : longueur d’un chemin entre s et v
initialement :I ∀v , v 6= s, D[v ] = +∞,I D[s] = 0.
mise à jour :I D[v ] = min
(D[v ],minu∈Adj−1(v)(D[u] + w(u, v))
)Justification : après i mises à jour D[v ] ≤ d [i , v ].D[v ] est au plus la longueur d’un plus court chemin entre s et vcontenant au plus i arcs.
Algorithme de Bellman-Ford : amélioration 2
Tableau à une dimension D[] pour représenter les distances
D[v ] : longueur d’un chemin entre s et v
initialement :I ∀v , v 6= s, D[v ] = +∞,I D[s] = 0.
mise à jour :I D[v ] = min
(D[v ],minu∈Adj−1(v)(D[u] + w(u, v))
)
Justification : après i mises à jour D[v ] ≤ d [i , v ].D[v ] est au plus la longueur d’un plus court chemin entre s et vcontenant au plus i arcs.
Algorithme de Bellman-Ford : amélioration 2
Tableau à une dimension D[] pour représenter les distances
D[v ] : longueur d’un chemin entre s et v
initialement :I ∀v , v 6= s, D[v ] = +∞,I D[s] = 0.
mise à jour :I D[v ] = min
(D[v ],minu∈Adj−1(v)(D[u] + w(u, v))
)Justification : après i mises à jour D[v ] ≤ d [i , v ].D[v ] est au plus la longueur d’un plus court chemin entre s et vcontenant au plus i arcs.
Algorithme de Bellman-Ford : amélioration 2
algorithme BELLMAN-FORD-a2(G , s)in : G = (S ,A,w) un graphe pondéré, s un sommet de S ,
pour v ∈ S faireD[v ] :=∞,
D[s] := 0,pour i := 1, . . . , n − 1 faire
pour v ∈ S faireD[v ] := min
(D[v ], minu∈Adj−1(v)(D[u] + w(u, v))
),
fin pour,fin pour,renvoyer D,
Espace : O(n)
Algo. de Bellman-Ford : reconstruction des PCC
si D[v ] est modifiée à l’étape i :
D[v ] := D[u] + w(u, v)
alors mémoriser u, dernier sommet intermédiaire
pred [v ] := u
quand l’algorithme est terminé :I le graphe constitué des arcs (pred [v ], v) est acyclique,I dans ce graphe, le chemin entre s et v est un plus court
chemin dans G .
Algo. de Bellman-Ford : reconstruction des PCC
s
3-3
2-2
-1 4
-3
-4
8
b
a
d
c
e
9
s a b c d eD 0 −6 −2 3 3 0
pred − b e s a c
Algorithme de Bellman-Ford
algorithme BELLMAN-FORD-PATHS(G , s)in : G = (S ,A,w) un graphe pondéré, s un sommet de S ,
pour v ∈ S faireD[v ] :=∞,pred [v ] := NONE ,
fin pour,D[s] := 0,pour i := 1, . . . , n − 1 faire
pour (u, v) ∈ A fairesi D[v ] > D[u] + w(u, v) alors
D[v ] := D[u] + w(u, v),pred [v ] := u,
fin si,fin pour,
fin pour,renvoyer (D, pred),
Routage dans les réseaux de communication
Une application importante des algorithmes de plus courts chemins :Déterminer le meilleur chemin pour router les messages
Graphe Réseau de CommunicationsSommets RouteursArcs Lignes de communicationsLongueurs Délais
Algorithme de Dijkstra : fonctionnement globalchoix du sommet le plus proche parmis tous les sommets.
Algorithme de Bellman-Ford : fonctionnement local
chaque noeud a juste besoin de connaître les marques de ses voisins∗.
Bellman-Ford : amélioration pour le routage
Calcul de D[v ] à l’étape i :
I calcul à partir des distances D[u] des voisins∗.Si aucune distance n’a changé le calcul estinutile.
v
u
Bellman-Ford : amélioration pour le routage
Calcul de D[v ] à l’étape i :
I calcul à partir des distances D[u] des voisins.Si aucune distance n’a changé le calcul estinutile.
I nouvelle approche : chaque sommet dont ladistance change informe ses voisins.
I si aucune distance n’est modifiée alorsl’algorithme s’arrête.
v
u
Bellman-Ford : amélioration pour le routage
algorithme BELLMAN-FORD-R1(G , s) G = (S ,A,w)pour chaque v ∈ S : D[v ] :=∞,D[s] := 0,pour i := 1, . . . , n − 1 faire
pour chaque sommet u tel que D[u] a changé à l’étape i − 1pour chaque arc (u, v) faire
D[v ] := min(D[v ],D[u] + w(u, v)
),
si D n’a pas été modifié à l’étape i alorsbreak,
fin pour,
renvoyer (D, pred),
Bellman-Ford : amélioration pour le routage
Notifications :I avertir les noeuds voisins d’un changement,I les notifications ne sont pas synchronisées,I version asynchrone de l’algorithme : noeuds
actifs/inactifs.
Bellman-Ford : amélioration pour le routagealgorithme BELLMAN-FORD-Asynchrone(G , s) G = (S ,A,w)
pour chaque v ∈ S : D[v ] :=∞, pred [v ] := NONE ,D[s] := 0,F := {s}, F : ensemble des noeuds actifstant que F 6= ∅ faire
choisir et enlever un sommet u de F ,pour chaque arc (u, v) faire
si D[v ] > D[u] + w(u, v) alorsD[v ] := D[u] + w(u, v),pred [v ] := u,F := F ∪ {v}, v devient actif
fin si,fin pour,
fin tant que,
renvoyer (D, pred),
Plus courts chemins : Floyd-Warshall
I graphes orientés,I arcs de poids négatifs,I calcul de tous les plus courts chemins.
Plus courts chemins : Floyd-Warshall
On suppose les sommets numérotés de 1 à n
Définition. (s, v1, . . . , vm, t) est un chemin C (k) si tout sommet vi vérifievi ≤ k .
114
11
13
8
154
10
2 6
5 73
1712
9
16
14 ; 7 : Chemin C (11) 2 ; 15 : Chemin C (9)
Plus courts chemins : Floyd-Warshall
Remarque. Tout chemin C (k), avec k ≥ 1,
I est un chemin C (k−1)
t
s
C (k−1)
I ou contient le sommet k , il est alors composé de deuxchemins C k−1
s
t
k
C (k−1)C (k−1)
Plus courts chemins : Floyd-Warshall
La propriété est vraie pour les plus courts chemins.
Propriété. Soit P un plus court chemin C (k) entre les sommets s et t :
I soit P est un (plus court) chemin C (k−1) entre s et t,
I soit P contient le sommet k , il est alors composé de deux cheminsP1 et P2 :
(a) P1 est un plus court chemin C (k−1) entre s et k ,(b) P2 est un plus court chemin C (k−1) entre k et t.
Plus court chemin C (k) : chemin C (k) le plus court.
Plus courts chemins : Floyd-Warshall
Définition récursive :
d(0)(s, t) = w(s, t) ou +∞d(k)(s, t) = min
[d(k−1)(s, t),
d(k−1)(s, k) + d(k−1)(k , t)]
d(k)(s, t) : longueur d’un plus court chemin C (k) entre s et t.
d(n)(s, t) : longueur du plus court chemin entre s et t dans G .
Plus courts chemins : Floyd-Warshall
algorithme de Floyd et Warshall :
I entrée : graphe orienté sans circuit de poids négatif,(matrice d’adjacence avec les poids des arcs,)
I sortie : les longueurs des plus courts chemins entretoutes les paires de sommets.
Méthode de programmation dynamique.
Plus courts chemins : Floyd-Warshall
algorithme FLOYD-WARSHALL(G )in : G = (S ,A,w) et S = {1, . . . , n},
1 pour (u, v) ∈ S × S , u 6= v faire2 d(0)[u, v ] := w(u, v), (+∞ si (u, v) 6∈ A)
3 pour k := 1 à n faire4 d(k) := CalculCheminsCk (d(k−1), k) ,5 fin pour,6 renvoyer d(n),
Calcul des longueurs des plus courts chemins C (0),C (1), . . . ,C (n).
d(k) : longueurs des plus courts chemins C (k).
Plus courts chemins : Floyd-Warshall
algorithme FLOYD-WARSHALL(G )in : G = (S ,A,w), avec S = {1, . . . , n},
1 pour (u, v) ∈ S × S , u 6= v faire2 d(0)[u, v ] := w(u, v), (+∞ si (u, v) 6∈ A)
3 pour k := 1 à n faire4 pour u := 1 à n faire5 pour v := 1 à n faire6 d(k)[u, v ] := min{d(k−1)[u, v ],d(k−1)[u, k] + d(k−1)[k, v ]},7 fin pour,8 fin pour,9 fin pour,10 renvoyer d,
d(k)[u, k] = d(k−1)[u, k] et d(k)[k, v ] = d(k−1)[k, v ] =⇒ même calculavec une table unique d.
Plus courts chemins : Floyd-Warshall
algorithme FLOYD-WARSHALL(G )in : G = (S ,A,w), avec S = {1, . . . , n},
1 pour (u, v) ∈ S × S , u 6= v faire2 d(0)[u, v ] := w(u, v), (+∞ si (u, v) 6∈ A)
3 pour k := 1 à n faire4 pour u := 1 à n faire5 pour v := 1 à n faire6 d(k)[u, v ] := min{d(k−1)[u, v ],d(k−1)[u, k] + d(k−1)[k, v ]},7 fin pour,8 fin pour,9 fin pour,10 renvoyer d,
d(k)[u, k] = d(k−1)[u, k] et d(k)[k , v ] = d(k−1)[k , v ] =⇒ même calculavec une table unique d.
Plus courts chemins : Floyd-Warshall
algorithme FLOYD-WARSHALL(G )in : G = (S ,A,w), avec S = {1, . . . , n},
1 pour (u, v) ∈ S × S , u 6= v faire2 d[u, v ] := w(u, v), (+∞ si (u, v) 6∈ A)
3 pour k := 1 à n faire4 pour u := 1 à n faire5 pour v := 1 à n faire6 d[u, v ] := min{d[u, v ],d[u, k] + d[k , v ]},7 fin pour,8 fin pour,9 fin pour,10 renvoyer d,
Coût total O(n3).
Plus courts chemins : Floyd-Warshall
1
2
3
4
5
6
12 4
1
-10
1
-74
12
133
11
-4
-5
1 2 3 4 5 6
1 0 12 ∞ 4 ∞ ∞2 ∞ 0 -10 1 ∞ 13 3 ∞ 0 ∞ 13 ∞4 ∞ ∞ -7 0 4 125 -4 ∞ ∞ ∞ 0 116 ∞ ∞ ∞ ∞ -5 0
d (0)
1 2 3 4 5 6
1 0 12 ∞ 4 ∞ ∞2 ∞ 0 -10 1 ∞ 13 3 15 0 7 13 ∞4 ∞ ∞ -7 0 4 125 -4 8 ∞ 0 0 116 ∞ ∞ ∞ ∞ -5 0
d (1)
Plus courts chemins : Floyd-Warshall
1
2
3
4
5
6
12 4
1
-10
1
-74
12
133
11
-4
-5
1 2 3 4 5 6
1 0 12 ∞ 4 ∞ ∞2 ∞ 0 -10 1 ∞ 13 3 15 0 7 13 ∞4 ∞ ∞ -7 0 4 125 -4 8 ∞ 0 0 116 ∞ ∞ ∞ ∞ -5 0
d (1)
1 2 3 4 5 6
1 0 12 2 4 ∞ 132 ∞ 0 -10 1 ∞ 13 3 15 0 7 13 164 ∞ ∞ -7 0 4 125 -4 8 -2 0 0 96 ∞ ∞ ∞ ∞ -5 0
d (2)
Plus courts chemins : Floyd-Warshall
1
2
3
4
5
6
12 4
1
-10
1
-74
12
133
11
-4
-5
1 2 3 4 5 6
1 0 12 2 4 ∞ 132 ∞ 0 -10 1 ∞ 13 3 15 0 7 13 164 ∞ ∞ -7 0 4 125 -4 8 -2 0 0 96 ∞ ∞ ∞ ∞ -5 0
d (2)
1 2 3 4 5 6
1 0 12 2 4 15 132 -7 0 -10 -3 3 13 3 15 0 7 13 164 -4 8 -7 0 4 95 -4 8 -2 0 0 96 ∞ ∞ ∞ ∞ -5 0
d (3)
Plus courts chemins : Floyd-Warshall
1
2
3
4
5
6
12 4
1
-10
1
-74
12
133
11
-4
-5
1 2 3 4 5 6
1 0 12 2 4 15 132 -7 0 -10 -3 3 13 3 15 0 7 13 164 -4 8 -7 0 4 95 -4 8 -2 0 0 96 ∞ ∞ ∞ ∞ -5 0
d (3)
1 2 3 4 5 6
1 0 12 -3 4 8 132 -7 0 -10 -3 1 13 3 15 0 7 11 164 -4 8 -7 0 4 95 -4 8 -7 0 0 96 ∞ ∞ ∞ ∞ -5 0
d (4)
Plus courts chemins : Floyd-Warshall
1
2
3
4
5
6
12 4
1
-10
1
-74
12
133
11
-4
-5
1 2 3 4 5 6
1 0 12 -3 4 8 132 -7 0 -10 -3 1 13 3 15 0 7 11 164 -4 8 -7 0 4 95 -4 8 -7 0 0 96 ∞ ∞ ∞ ∞ -5 0
d (4)
1 2 3 4 5 6
1 0 12 -3 4 8 132 -7 0 -10 -3 1 13 3 15 0 7 11 164 -4 8 -7 0 4 95 -4 8 -7 0 0 96 -9 3 -12 -5 -5 0
d (5)
Plus courts chemins : Floyd-Warshall
1
2
3
4
5
6
12 4
1
-10
1
-74
12
133
11
-4
-5
1 2 3 4 5 6
1 0 12 -3 4 8 132 -7 0 -10 -3 1 13 3 15 0 7 11 164 -4 8 -7 0 4 95 -4 8 -7 0 0 96 -9 3 -12 -5 -5 0
d (5)
1 2 3 4 5 6
1 0 12 -3 4 8 132 -8 0 -11 -4 -4 13 3 15 0 7 11 164 -4 8 -7 0 4 95 -4 8 -7 0 0 96 -9 3 -12 -5 -5 0
d (6)
Plus courts chemins : coûts
source unique tous les chemins
Dijkstra∗ m + n logn m × n + n2 logn
Bellman-Ford m × n m × n2
Floyd-Warshall n3
∗ avec des tas de Fibonacci, pas d’arcs de poids négatif.