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 XVX \subseteq V będzie takim zbiorem, że sXs \in X oraz tXt \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=(ad)+(bc)=(ad)+(ef)=(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 sXs \in X oraz tXt \notin X) nazywamy liczbę c(X)={c(e):fst(e)Xsnd(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 XVX \subseteq V będzie takim zbiorem, że sXs \in X oraz tXt \notin X. Wówczas fc(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)Xsnd(e)X}{c(e):fst(e)Xsnd(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 tXt \notin X (gdyby tXt \in X, to moglibyśmy powiększyć ff). Jeśli xX,yXx \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 xX,yXx \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 cNEc \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)Ef((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 ff' 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 V2\frac{|V|}{2} razy.
  6. Z tego wnioskujemy, że główna pętla może być wykonywana przez co najwyżej EV2\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 2E2|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)VE)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