cours 3

publicité
Problème du flot maximum
MSE3211A: Flot et Routage
(d’après Ahuja, R.K., T.L. Magnanti and J.B. Orlin, Prentice Hall, 1993,
et d’après les notes des cours de L.A. Wolsey et F. Vanderbeck )
Last update: January 10, 2011
Gautier Stauffer, MAB, Bur. A33:358, Email [email protected]
PROBLÈME DE FLOT MAXIMUM
Dans un réseau orienté avec des capacités sur les arcs, envoyer autant de
flot que possible entre un noeud source s et un noeud puits t, sans excéder
les capacités.
DONNÉES / Hypothèses
Un graphe orienté G = (N, A) avec les noeuds s & t;
Des bornes 0 ≤ ui j ≤ U entier, pour chaque arc (i, j).
6 ∃ chemin s − t dont tous les arcs ont une capacité infinie
(i, j) ∈ A
(j, i) ∈ A (on peut avoir uji = 0)
=
>
Pas d’arcs parallèles
FORMULATION
2
v
s
max v
s.a.
7
10
t
1
v
P
j∈N + (i)
6
10
3
xi j −
P
j∈N − (i)
0 ≤ xi j ≤ ui j
xj i
=
8
<
v pour i = s
0 pour i 6= s, t
:
−v pour i = t
pour tout (i, j) ∈ A
PROBLÈME DUAL: COUPE de capacité MINIMALE
On interprete v comme un arc fictif entre t et s et on cherche à maximiser le
flot sur cet arc
PRIMAL
X
xi j −
j∈N + (i)
DUAL
max xt s
X
xj i
=
0
xi j
≤
ui j ∀(i, j) 6= (t, s)
xi j
≥
0
∀i
(yi )
j∈N − (i)
min
X
(zi j )
∀(i, j) 6= (t, s)
ui j zi j
(i,j)6=(t,s)
yi − yj + zi j
≥
0 ∀(i, j) 6= (t, s)
yt − ys
=
1
zi j
≥
0 ∀(i, j) 6= (t, s)
Toute (S, T )-coupe peut etre representée dans le dual
yi = 1 si i est dans la partition de noeud coté t et zéro si coté s
zi j = 1 si l’arc (i, j) est dans la coupe s - t et zéro sinon.
FLOT MAXIMUM ET COUPE MINIMALE: dualité
Pour toute coupe s-t, c-à-d (S, T ) tel que S ∋ s et T = N \ S ∋ t, le flot
au travers de la coupe est égal au flot v entrant en s / sortant de t.
+
v
0
v
=
=
=
P
xs j − j∈N − (i) xj s
P
( j∈N + (i) xi j − j∈N − (i) xj i )
i∈S\{s}
P
P
i∈S, j∈T xi j −
j∈T , i∈S xj i
P
P
+ (s)
j∈NP
Pour toutes coupes s-t, le flot au travers de la coupe est inférieur ou
égal à la capacité de la coupe (DUALITÉ FAIBLE):
v
=
≤
P
x
i∈S, j∈T
P ij
−
P
i∈S, j∈T
j∈T , i∈S
ui j
xj i
=
CAP(S, T )
Theorem
Le flot maximum égale la capacité minimale d’ une coupe s-t (DUALITÉ
FORTE): max v = min(S,T ) CAP(S, T )
Applications : PROBLÈMES DE CONNEXITÉ
La sécurisation de réseaux de télécom demande de prévoir des chemins
disjoints entre paires de noeuds.
Deux chemims de s à t sont disjoints en termes d’arcs s’ils n’ont
aucun arc en commun.
Deux chemims de s à t sont disjoints en termes de noeuds s’ils n’ont
aucun noeud en commun en-dehors de s et t.
Theorem
Le nombre maximum de chemins de s à t disjoints en terme d’arcs égale le
nombre minimum d’arcs qu’il faudrait enlever pour disconnecter s de t.
Theorem
Le nombre maximum de chemins de s à t disjoints en terme de noeuds égale
le nombre minimum de noeuds qu’il faudrait enlever pour disconnecter s de t.
Deux Types d’Algo pour le MAX FLOW
ALGORITHME DES CHEMINS D’AUGMENTATION
Trouver un chemin de s à t avec une capacité résiduelle et augmenter
le flot le long de ce chemin.
A chaque itération le flot vérifie les équations de conservation du flot en
chaque noeud.
PREFLOW-PUSH
Envoie le plus de flot possible vers les noeuds voisins, ré-envoie l’excès
de flot d’où il provient. De proche en proche, le flot est ainsi acheminé
de s à t, tandis que l’excès retourne en s.
A chaque itération le flot ne vérifie pas nécessairement les équations
de conservation du flot en chaque noeud; donc, il peut y avoir un excès
de flot en certain noeud (d’où le nom de “pré-flot”).
ALGORITHME DES CHEMINS D’AUGMENTATION
Trouver un chemin de s à t avec une capacité résiduelle et augmenter le flot
le long de ce chemin.
1er chemin d’augmentation
2
v
s
v
s
t
10
3
3
2ème chemin d’augmentation
3ème chemin d’augmentation
2
2
1
s
t
6
6
3
7
7
t
1
6
2
7
10
s
1
t
1
3
ALGORITHME DES CHEMINS D’AUGMENTATION
RÉSEAU RÉSIDUEL
Pour mieux se représenter le flot courant et les possibilités d’augmentation
Pour un flot x donné dans un graphe G = (N, A), le réseau résiduel G(x) est
défini par les arcs sur lesquels il reste une capacité positive:
rij = uij − xij + xji
∀(i, j) ∈ A
L’algorithme de flot-max de FORD-FULKERSON
SCHEMATIQUEMENT
On recherche un chemin d’augmentation en étiquetant les noeuds qu’ on
peut atteindre depuis s.
Si on en trouve un,
alors on augmente le flot le long de ce chemin d’une quantité égale à la
capacité résiduelle du chemin,
sinon, on a identifié une coupe dont la capacité est égale à la valeur du
flot courant.
L’algorithme de flot-max de FORD-FULKERSON
x =0
while 1 do
for tout i ∈ N do
label(i) = 0, pred(i) = 0
end for
label(s) = 1, LIST = {s}
while LIST 6= ∅ et label(t) == 0 do
Soit i ∈ LIST , poser LIST = LIST \ {i}
+
for tout (i, j) ∈ δG(x
) (i) do
if label(j) == 0 then
label(j) = 1, pred(j) = i, LIST = LIST ∪ {j}
end if
end for
end while
if (label(t) 6= 1), break
Remonter les pred(.) à partir de t =
> s − t chemin P
δ = min{rij | (i, j) ∈ P}
xij = xij + δ pour tout (i, j) ∈ P
Mettre à jour G(x)
end while
L’algorithme est correct (donne une solution optimale)
L’algorithme termine avec un ensemble S ∋ s de noeuds qui peuvent recevoir
un flot depuis s et S 6∋ t. Soit S l’ensemble des noeuds tels que label(i) == 1
à la fin de l’algorithme et T = N \ S. Donc, (S, T ) forme une coupe s-t.
Propriétés :
La capacité résiduelle de cette coupe est zéro: r (S, T ) = 0
La capacité de cette coupe est égal à v : v = CAP(S, T )
En effet, les noeuds de T n’ont pas pu être étiquetés, parce que les arcs de
la coupe (S, T ) ont une capacité résiduelle nulle.
∀(i, j) ∈ (S, T ), ri j = 0 ∈ G(x)
⇔
∀(i, j) ∈ (S, T ), xi j = ui j
∀(i, j) ∈ (T , S), xi j = 0
Donc
v
=
=
P
x
i∈S, j∈T
P ij
−
P
i∈S, j∈T
j∈T , i∈S
ui j
xj i
=
CAP(S, T )
Résultats
Theorem
(algo correct) L’algorithme des chemins d’augmentation produit une solution
x de valeur v et une coupe (S, T ) de capacité v .
Corollary
(max-flot/min cut) La quantité maximum de flot de s à t dans un réseaux est
égale au mimium de la capacité de toute coupe s-t.
Corollary
(condition d’optimalité) Le flot x ∗ est maximum ssi G(x ∗ ) ne contient plus
de chemin d’augmentation.
Corollary
(intégralité) Si les capacités sont entières, le problème de flot maximun
admet une solution entière.
COMPLEXITÉ DE L’ALGORITHME
Si les capacités ui j sont entières et bornées par U, alors v ≤ nU:
U
U
v
s
1
2
U
n
Comme on augmente le flot d’au moins 1 à chaque augmentation (les
donées sont supposées entières), il y a au plus n U augmentations.
Pour chaque augmentation, le travail nécessaire à l’identification d’un
chemin d’augmentation (étiquetage) prend O(m) opérations.
La complexité totale est donc O(n m U).
COMPLEXITÉ DE L’ALGORITHME
INCONVÉNIENT DE L’ALGORITHME
U
v
2
s
U
1
U
t
v
U
3
COMMENT AMÉLIORER LA COMPLEXITÉ?
Plus court chemin ( ♯ min d’arcs) d’augmentation: O(n2 m)
Algorithmes des chemins d’augmentation le long de
plus courts chemins
Idée : Pousser du flot sur les chemins les plus courts évite de corriger
des erreurs en repoussant du flots en sens inverse
Soit d(i) la distance minimale (en nombre d’arc de i à t dans G(x):
d(t) = 0
d(i) ≤ d(j) + 1 pour tout (i, j) ∈ G(x ), i.e. rij > 0
Les distances minimales se calculent en faisant un parcours
“reverse”de G(x) en profondeur d’abord au départ de t.
Si d(i) ≥ n, alors il n’existe pas dans G(x) de chemin allant de i à t.
Définition : On dit que l’arc (i, j) de G(x) est admissible si rij > 0 et
d(i) = d(j) + 1 (arc tendu pour le problème des plus chemin en terme
de nombre d’arcs).
Algorithme des plus courts chemins augmentants
x = 0, Calculer les labels de distances exacts d(i), i = s
while d(s) < n do
if il existe un arc admissible (i, j) ∈ δ + (i) then
/* on ajoute (i,j) au chemin partiel */
pred(j) = i, i = j
if i == t then
/* on augmente le flot */
Remonter les pred(.) à partir de t → s − t chemin P
δ = min{rij | (i, j) ∈ P}, xij = xij + δ pour tout (i, j) ∈ P
Mettre à jour G(x), i = s
end if
else
/* on corrige d(i) et on enlève i du chemin partiel */
d(i) = min{d(j) + 1 | (i, j) ∈ δ + (i) et rij > 0}
if i 6= s then
i = pred(j)
end if
end if
end while
Algorithmes des chemins d’augmentation le long de
plus courts chemins
Complexité : O(n2 m2 )
Chaque augmentation rend un arc inadmissible;
quand un arc devient inadmissible, il ne pourra plus être considéré tant
qu’une distance n’a pas augmenté;
Chaque d(i) peut augmenter au plus n fois,
donc au total, il y a au plus n2 accroissements de distance;
le nombre de chemin augmentant est borné par le nombre de fois qu’on
peut annuler la capacité residuelle d’un arc, soit O(n2 m).
chaque itération coute O(m).
Algorithmes des chemins d’augmentation le long de
plus courts chemins
Inconvénient de l’algo des chemins d’aug. le long de plus courts ch.:
U
v
U
U
1
1
1
1
1
1
1
1
1
1
v
Algorithmes des pré-flots
Idée des algorithmes de préflots: pousser tout le flot possible, quitte à
avoir un excédant de flot à un noeud i: i est actif si
X
X
xij > 0
xji −
e(i) =
(j,i)∈δ − (i)
(i,i)∈δ + (i)
Algorithme générique O(n2 m)
x = 0, Calculer les labels de distances exacts d(i),
xsj = usj pour tout (s, j) ∈ δ + (s),d(s) = n
while il existe un noeud actif i do
if il existe un arc admissible (i, j) ∈ δ + (i) then
/* on pousse un maximum de flot sur (i,j) */
δ = min{e(i), rij }
xij = xij + δ
Mettre à jour G(x)
else
/* on change le label de i */
d(i) = min{d(j) + 1 | (i, j) ∈ δ + (i) et rij > 0}
end if
end while
Téléchargement