Przepływy w sieciach II

by Jerry Sky



Lemat A

Niech (V,E,s,t,c)(V,E,s,t,c) będzie siecią. Niech ff będzie przepływem w sieci.
Niech X⊆VX \subseteq V będzie takim zbiorem, że s∈Xs \in X oraz t∉Xt \notin X.
Wówczas ∥f∥=outf(X)−inf(X). \lVert f \rVert = \mathrm{out}_f(X) - \mathrm{in}_f(X).

D-d Lematu A

Niech:

Wtedy:

  1. ∥f∥=(a+b)−(c+d)\lVert f \rVert = (a+b) - (c+d)
  2. e+c=f+be + c = f + b (bo Y∩{s,t}=∅Y \cap \{s,t\} = \emptyset)
  3. outf(X)−inf(X)=(a+e)−(d+f)\mathrm{out}_f(X) - \mathrm{in}_f(X) = (a+e) - (d+f)

Zatem ∥f∥=(a−d)+(b−c)=(a−d)+(e−f)=(a+e)−(d+f)=outf(X)−inf(X). \lVert f \rVert = (a-d) + (b-c) \\= (a-d) + (e-f) = (a+e) - (d+f) \\= \mathrm{out}_f(X) - \mathrm{in}_f(X).

Oznaczenie #1

Przepustowością cięcia XX (czyli takiego zbioru wierzchołków, że s∈Xs \in X oraz t∉Xt \notin X) nazywamy liczbę c(X)=∑{c(e):fst(e)∈X∧snd(e)∈X∁} c(X) = \sum \{c(e): \mathrm{fst}(e) \in X \land \mathrm{snd}(e) \in X^\complement \}

Wniosek #1 (Lemat B)

Niech (V,E,s,t,c)(V,E,s,t,c) będzie siecią. Niech ff będzie przepływem w sieci. Niech X⊆VX \subseteq V będzie takim zbiorem, że s∈Xs \in X oraz t∉Xt \notin X. Wówczas ∥f∥≤c(X) \lVert f \rVert \le c(X)

D-d Lematu B

Korzystając z poprzedniego Lematu mamy ∥f∥=outf(X)−inf(X)≤outf(X)=∑{f(e):fst(e)∈X∧snd(e)∈X∁}≤∑{c(e):fst(e)∈X∧snd(e)∈X∁}=c(X) \lVert f \rVert = \mathrm{out}_f(X) - \mathrm{in}_f(X) \\ \le \mathrm{out}_f(X) = \sum \{ f(e): \mathrm{fst}(e) \in X \land \mathrm{snd}(e) \in X^\complement \} \\ \le \sum \{ c(e): \mathrm{fst}(e) \in X \land \mathrm{snd}(e) \in X^\complement \} = c(X)

Uwaga: poprzedni fakt można zapisać następująco: max⁡{∥f∥:f jest przepływem}≤min⁡{c(X):X jest cięciem} \max \{ \lVert f \rVert: f \text{ jest przepływem} \} \le \min \{ c(X): X \text{ jest cięciem} \}

Twierdzenie (Ford-Fulkerson)

Niech N\mathcal{N} będzie siecią.
Wówczas max⁡{∥f∥:f jest przepływem N}=min⁡{c(X):X jest cięciem w N} \max \{ \lVert f \rVert: f \text{ jest przepływem } \mathcal{N} \} = \min \{ c(X): X \text{ jest cięciem w } \mathcal{N} \}

D-d Twierdzenia (Ford-Fulkerson)

Niech ff będzie przepływem o największej możliwej wartości ∥f∥\lVert f \rVert. Niech XX będzie zbiorem tych wszystkich wierzchołków xx, że istnieje ff–ścieżka powiększająca od ss do xx. Wówczas t∉Xt \notin X (gdyby t∈Xt \in X, to moglibyśmy powiększyć ff). Jeśli x∈X,y∈X∁x \in X, y \in X^\complement oraz (x,y)∈E(x,y) \in E, to f((x,y))=c((x,y))f((x,y)) = c((x,y)) (inaczej mielibyśmy ff–ścieżkę powiększającą od ss do yy). Podobnie, jeśli x∈X,y∈X∁x \in X, y \in X^\complement oraz (y,x)∈E(y,x) \in E, to f((y,x))=0f((y,x)) = 0 (inaczej mielibyśmy ff–ścieżkę powiększającą od ss do yy).
Zatem ∥f∥=outf(X)=inf(X)=c(X)−0=c(X) \lVert f \rVert = \mathrm{out}_f(X) = \mathrm{in}_f(X) = c(X) - 0 = c(X)

Source: Bela Bollobas, Modern Graph Theory, Springer, 1998

Metoda Forda-Fulkersona

f := 0;
WHILE istnieje f-ścieżka powiększająca
    P := jakaś ścieżka f-powiększająca;
    f := f poprawione o P
ENDWHILE

Uwaga: powyższy pseudokod nazywamy metodą, a nie algorytmem, bo nie określamy jak wybierać ścieżkę ff–powiększającą

Przykład (Metoda Forda-Fulkersona)

Przykład sieci, dla której metoda ta działa bardzo długo:

Rozważamy prostą sieć z czterema wierzchołkami. Zaczynamy od potoku równego zero. Rozważamy dwie ścieżki powiększające: P=(s,a,b,t)P = (s,a,b,t) oraz Q=(a,b,a,t)Q = (a,b,a,t)

przykład

Po tych dwóch krokach przepustowość zwiększyliśmy o 22. Po 9898 kolejnych krokach P,Q,P,Q…,P,QP,Q,P,Q\dots,P,Q dojdziemy do przepływu o maksymalnej wartości równej 200200.
Zauważmy, że gdybyśmy stosowali inne ścieżki powiększające (s,a,t)(s,a,t) oraz (s,b,t)(s,b,t) to po dwóch krokach otrzymalibyśmy maksymalny przepływ.

Fakt #1

Jeśli funkcja ograniczeń przyjmuje wartości naturalne (czyli c∈NEc \in \mathbb{N}^E), to metoda Forda-Fulkersona kończy swoje działanie po skończonej liczbie kroków.

Fakt #2

Jeśli cc przyjmuje wartości niewymierne, to może się zdarzyć (przy doborze „złośliwej” funkcji cc), że metoda ta działa nieskończenie długo i, o zgrozo, nawet graniczny potok nie jest najlepszy!

Algorytm Edmontona-Karpa

f := 0
WHILE istnieje f-ścieżka powiększająca
    P := jakaś ścieżka f-powiększająca o najkrótszej (w sensie liczby wierzchołków) długości
    f := f poprawione o P
ENDWHILE

Twierdzenie #2

Algorytm Edmontona-Karpa kończy swoje działanie po skończonej liczbie kroków i zwraca przepływ o największej wartości.

D-d Twierdzenia #2

  1. Wprowadźmy pojęcia grafu ff-powiększającego: Ff={(x,y)∈E:f((x,y))<c((x,y,))}∪∪{(x,y):(y,x)∈E∧f((y,x))>0} F_f = \\ \{ (x,y) \in E: f((x,y)) < c((x,y,)) \} \cup \\ \cup \left\{ (x,y): (y,x) \in E \land f((y,x)) > 0 \right\} i definiujemy df(x)=dGf(s,x)d_f(x) = d_{G_f}(s,x).
  2. Pokazujemy, że jeśli f′f' jest potokiem otrzymanym z potoku ff przez zastosowanie ścieżki powiększającej o najkrótszej długości, to df(x)≤df′(x)d_f(x) \le d_{f'}(x) dla każdego wierzchołka xx.
  3. Definiujemy pojęcie krawędzi aktywnej na ścieżce powiększającej: jest to taka krawędź, na której zmieniamy wartość potoku. Zauważamy, że na każdej ścieżce musi być krawędzi aktywna.
  4. Sprawdzamy, że jeśli krawędź e=(x,y)e = (x,y) była aktywna w krokach ii oraz jj i jednocześnie i<ji < j to dfj(x)≥dfi(x)+2d_{f_j}(x) \ge d_{f_i}(x) + 2.
  5. Wnioskujemy, że krawędź może być aktywna co najwyżej ∣V∣2\frac{|V|}{2} razy.
  6. Z tego wnioskujemy, że główna pętla może być wykonywana przez co najwyżej ∣E∣⋅∣V∣2\frac{|E|\cdot |V|}{2} razy.
  7. To w zasadzie wystarcza. Ale można się zastanowić nad złożonością pod-procedury wyznaczania ścieżek powiększających. Graf GfG_f ma co najwyżej 2∣E∣2|E| krawędzi. Algorytm przeszukiwania wszerz wykonywany jest w czasie O(∣V∣+∣E∣)O(|V| + |E|).
    Zatem złożoność algorytmu można oszacować przez O((∣V∣+∣E∣)⋅∣V∣⋅∣E∣)O\left(\left(|V| + |E|\right) \cdot |V| \cdot |E| \right). Można to zrobić lepiej – więcej w source. Dla nas ważne jest to, że algorytm ten działa w czasie wielomianowym od ∣V∣|V| i ∣E∣|E|.

Source: CLRS