Učinkovita izvedba algoritma Goldberg-Tarjan Teja Peklaj 26. februar 2009 1 Definicije Definicija 1 Naj bo (G, u, s, t) omrežje, f : E(G) R, za katero velja 0 f(e) u(e) za e E(G). Za v V (G) definiramo presežek f v točki v: ex f (v) := f(e) f(e) e δ (v) e δ + (v) Opomba 1 Če je ex f (v) = 0 v V (G)\{s, t} in je ex f (t) 0, potem je f (s, t)-tok. Definicija 2 Omejen f je (s, t)-predtok, če je ex f (v) 0 za v V (G)\{s}. Točka v je aktivna, če je njen prežek ex f (v) > 0. (s, t)-tok je (s, t)-predtok, ki nima aktivnih točk. Opomba 2 Omejen f je maskimalen (s, t)-tok, kadar veljata: 1. ohranitev toka (ex f (v) = 0) v V (G)\{s, t}, 2. v G f ni povečujoče poti. Goldberg-Tarjanov algoritem ves čas vzdržuje 2. točko in na koncu doseže 1. Ford-Fulkersonov algoritem pa ves čas vzdržuje 1. in šele na koncu zagotovi 2. Definicija 3 Naj bo (G, u, s, t) omrežje in f (s, t)-predtok. Funkcija Ψ : V (G) Z je razdaljna označitev, če velja: 1. Ψ(v) 0 za v V (G), za točki s in t pa velja: Ψ(s) = n in Ψ(t) = 0 2. Ψ(u) + 1 Ψ(v) za uv E(G f ) 1
Če velja v 2. enačaj, rečemo, da je povezava dopustna. 2. točka nam pove, da Ψ pade vzdolž povezave kvečjemu za 1. Opomba 3 Če je Ψ razdaljna označitev, potem je Ψ(v) za v s spodnja meja za razdaljno označitev od v do t v G f. 2 Algoritem Push-Relabel Goldberg-Tarjanov algoritem izvajamo s pomočjo postopka Push - Relabel. Vhod: omrežje (G, u, s, t) Izhod: maksimalni (s, t)-tok f 1. Naj bo: f(e) := u(e) za e δ + (s) f(e) := 0 za e / δ + (s) Imamo začetni (s, t)-tok. 2. Naj bo: Ψ(s) = n in Ψ(u) = 0 za u V (G)\{s}, kjer je n = V (G). Imamo začetno razdaljno označitev. 3. Dokler obstaja aktivna točka naredi naj bo v aktivna točka Push(e) če ne obstaja dopustna povezava e δ + (G f ) potem Relabel(v) sicer naj bo e δ + (G f ) dopustna povezava in naredi Push(e) 1. Naj bo γ = min{ex f (v), u f (e)}, kjer je e δ + (G f ). (Torej je u začetek povezave e.) 2. Spremeni f vzdolž e za γ. (Povečamo f, če je povezava originalna, in jo zmanjšamo, če je nasprotna.) Relabel(u) 1. Naj bo Ψ(v) = min{ψ(w)+1; e = (v, w) E(G f )}. (Pogledamo konce izhodnih povezav iz u in ustrezno spremenimo razdaljno onzačitev.) 2
3 Trditve o Push-Relabel Trditev 1 Med izvajanjem algoritma je f (s, t)-predtok in Ψ razdaljna označitev. Lema 1 (o razdaljnih označitvah) Naj bo f (s, t)-predtok in Ψ razdaljna označitev glede na f. Potem velja: a) Točka s je v G f dosegljiva iz vsake aktivne točke. b) Če je točka v v G f dosegljiva iz točke u, potem velja: Ψ(u) Ψ(v) + n 1. c) Točka t v G f ni dosegljiva iz točke s. Posledica 1 Ko se algoritem Push-Relabel konča, je f maksimalni (s, t)-tok. Lema 2 (o Relabel) a) Vsak klic Relabel poveča Ψ od argumenta. Vrednosti razdaljne označitve Ψ se nikoli ne zmanjšajo. b) Na vsakem koraku algoritma velja Ψ(u) 2n 1 n. c) Za vsako točko kličemo Relabel kvečjemu 2n 1-krat. Skupno število klicev je 2n 2 n. Enako velja za skupno povečanje kateregakoli Ψ. Ločimo dve vrsti klicev Push: nasičene, pri katerih je po klicu u f (e) = 0 nenasičene, pri katerih u po klicu ni več aktivna. Lema 3 (lema o nasičenih Push) Število nasičenih klicev je 2mn. Lema 4 (lema o nenasičenih Push) Število nenasičenih klicev je 4(m + n)n 2. Trditev 2 Z Goldberg-Tarjanovim algoritmom lahko poiščemo maksimalni pretok v času O(mn 2 ), kar je za n boljše od Edmonds-Karpovega algoritma. 3
4 Učinkovita izvedba algoritma Prava izvedba Goldberg-Tarjanovega algoritma pri algoritmu Push-Relabel pri 3. točki vedno izbere aktivno točko z največjim Ψ. Pokazali bomo, da je za tako izvedbo meja za časovno zahtevnost O(n 2 m). Dokažimo najprej, da se zanka dokler ponovi O(n 2 m)-krat: Relabel se po lemi 2 izvede v O(n 2 ) operacijah. Nasičenih klicev Push je po lemi 3 v O(2mn). Tukaj upoštevamo še: če je m n, potem velja tudi O(mn) O(n 2 m) in dobimo oceno: O(2mn) O(2n 2 m) = O(n 2 m). Z lemo 5 bomo dokazali, da če na 3. koraku Push-Relabel algoritma izberemo aktivno točko z največjo vrednostjo Ψ, potem je število nenasičenih klicev Push 8n 2 m. Lema 5 (o nenasičenih Push) Če na 3. koraku v algoritmu Push-Relabel vedno izberemo aktivno točko z največjo vrednostjo Ψ, potem število nenasičenih klicev Push ni večje od 8n 2 m. Dokaz. Predpostavimo lahko, da graf ni drevo, torej velja n m n 2. Združili smo torej vzporedne povezave. Definirajmo: Ψ := max{ψ(v); v aktivna}. Definiramo fazo kot zaporedje korakov algoritma, pri katerih je Ψ konstanten. Vemo, da se lahko Ψ poveča le pri Relabel, saj Relabel edini spremeni Ψ. Skupno povečanje Ψ je po lemi 2 o Relabel torej 2n 2. Začetna vrednost Ψ = 0, kar je tudi končna vrednost. Zato je skupno povečanje enako skupnemu zmanjšanju in število faz je zato 4n 2. Ločimo dve vrsti faz: - kratke, kjer algoritem vsebuje m nenasičenih Push - dolge, kjer so preostali klici nenasičenih Push. V vseh kratkih fazah je skupaj 4n 2 m nenasičenih Push ukazov in smo izrek dokazali za kratke faze. Za oceno pri dolgih fazah pa definirajmo: Φ := {v V (G); Ψ(v) Ψ(u)}. u aktivna Oglejmo si, kako se spreminja Φ: 4
1. Na začetku je Φ n 2, kar sicer velja vedno. Na koncu je Φ = 0, torej je zmanjšanje n 2. 2. Relabel poveča Φ kvečjemu za n, saj poveča le pri eni točki. (Število klicev Relabel je 2n 2 n.) 3. Nasičeni Push poveča Φ prav tako kvečjemu za n, saj morda dobimo eno novo aktivno točko. (Število klicev nasičenih Push je 2mn.) 4. Nenasičeni Push ne poveča Φ, saj izgubimo eno aktivno točko in hkrati morda dobimo novo, ki ima manjši Ψ. Ocenimo sedaj, kakšno je zmanjšanje Φ. Iz zgornjih ugotovitev 1., 2. in 3. sledi, da je skupno zmanjšanje Φ kvečjemu: n 2 + n(2n 2 n) + n(2mn) 4mn 2. 4. točke nismo upoštevali, ker nenasičeni Push ne poveča Ψ. Oglejmo si torej še nenasičene ukaze Push v dolgi fazi. Predpostavimo, da vsak nenasičeni Push v dolgi fazi zmanjša Φ za m. Potem je skupno število nenasičenih klicev Push v dolgih fazah 4mn2 m = 4n 2 m in s tem je izrek dokazan tudi za dolge faze. Sedaj moramo le še dokazati našo predpostavko. Recimo, da nenasičeni Push uporabimo na povezavi uv. Ker pri 3. točki algoritma Push-Relabel vedno izbiramo aktivno točko z največjim Ψ, velja Ψ = Ψ(u). Če smo naredili Push, vemo, da je morala biti povezava dopustna, kar je po definiciji: Ψ(u) = Ψ(v) + 1. Velja torej: Ψ = Ψ(u) = Ψ(v) + 1. S tem klicem smo točko u deaktivirali, točka v pa morda postane aktivna, vendar ima manjši Ψ. Faza (dolga) se konča v dveh primerih: Pri klicu Relabel, kjer smo Ψ povečali pri točki, pri kateri je bil dosežen maksimum. Zato Ψ pri vsakem klicu Relabel zraste in se s tem faza konča. Ko deaktiviramo zadnjo aktivno točko s Ψ = Ψ in ne obstaja več nobena aktivna točka s Ψ = Ψ, zato se faza zaključi. 5
Zaradi tega je znotraj dolge faze množica točk, za katere je Ψ = Ψ, konstantna. Vanjo namreč ne prihajajo nove točke. Ker je faza dolga, imamo v tej množici vsaj m točk. Kot smo videli zgoraj, v vsakem klicu nenasičenega Push iz vsote za Φ izgubimo točko u. Točka v, ki morda postane aktivna ima manjši Ψ, zato je novi člen v vsoti za Φ manjši od prejšnjega za točko z Ψ = Ψ. Ker pa je teh točk vsaj m, vsak nenasičeni Push v dolgi fazi zmanjša Φ za m. S tem smo dokazali našo predpostavko. Izrek 1 Izvedba algoritma Push-Relabel, pri kateri vedno izbiramo aktivno točko z največjo razdaljno označitvijo, v času O(n 2 m) pravilno reši problem maksimalnega toka. Dokaz. Vemo že, da algoritem deluje pravilno (če se konča). To vidimo iz trditve 1 in posledice 1. Videli smo tudi, da se zanka dokler ponovi O(n 2 m)-krat. V algoritmu moramo tako poskrbeti še za časovno zahtevnost: 1. Izbire aktivne točke z največjim Ψ. 2. Iskanja dopustne povezave iz izbrane aktivne točke. 3. Izvedbe min v Relabel. Za učinkovito izvedbo 3. točke lahko za iskanje minimuma uporabimo sprehod skozi seznam sosedov. V celoti u V (# klicev za u)deg(u) 2n u V deg(u) 2nm. Za učinkovito izvedbo točk 1. in 2. pa vodimo dve podatkovni strukturi: sezname L i, i {0,..., 2n 1}, ki vsebujejo aktivne točke z Ψ = i, in hkrati vodimo maksimalni indeks zadnjega nepraznega seznama. sezname A u, u V (G)\{s, t}, ki vsebujejo dopustne povezave iz G f, ki se začnejo v u. Obe strukturi nam omogočata preprosto izvedbo točk 1. in 2. Med postopkom ju vzdržujemo: 1. Relabel: Prestavimo u v nov prazen seznam L in popravimo maksimalni indeks zadnjega nepraznega seznama, izračunamo nov A u ter pogledamo tudi vhodne povezave. Po potrebi jih popravimo (dodamo ali odstranimo). 6
To storimo v času O(deg(u)). 2. Push: Pri klicu Push lahko dobimo novo aktivno točko ali pa izgubimo aktivno točko. To popravimo tako, da: Literatura naredimo sprehod iz maksimalnega indeksa nazaj do prvega nepraznega (celotna dolžina teh sprehodov ni večja od skupne rasti vseh Ψ, ta pa je O(n 2 )), popravimo še A u kot zgoraj. [1] B. Korte, J. Vygen, Combinatorial Optimization: Theory and Algorithms, 3. izdaja, Springer, Berlin, 2006. [2] http://www.fmf.uni-lj.si/ juvan/racunalnistvo3/gradivo/maxflow_gt.pdf 7