]> mj.ucw.cz Git - ads2.git/commitdiff
Cast kapitoly o Goldbergove algoritmu.
authorMartin Mares <mj@ucw.cz>
Wed, 7 Nov 2007 14:20:51 +0000 (15:20 +0100)
committerMartin Mares <mj@ucw.cz>
Wed, 7 Nov 2007 14:20:51 +0000 (15:20 +0100)
4-goldberg/4-goldberg.tex [new file with mode: 0644]
4-goldberg/Makefile [new file with mode: 0644]
all/Makefile

diff --git a/4-goldberg/4-goldberg.tex b/4-goldberg/4-goldberg.tex
new file mode 100644 (file)
index 0000000..7d5bdfe
--- /dev/null
@@ -0,0 +1,123 @@
+\input lecnotes.tex\r
+\r
+\prednaska{4}{Goldgergùv algoritmus}{(zapsali R. Tupec, \r
+%J. Volec,\r
+J. Záloha)}\r
+\r
+\noindent\r
+Pøedstavíme si nový algoritmus pro hledání toku v síti, který se uká¾e stejnì dobrý jako\r
+{\I Dinicùv alogritmus} ($\O(mn^{2})$), a po nìkolika vylep¹eních bude i lep¹í.\r
+\r
+\s{Definice:} Funkce $f:E \rightarrow \bb{R}_{0}^{+}$ \r
+je {\I vlna} v síti ($V, E, z, s, c$), t.¾. $ \forall e \in E : f(e) \leq c(e) \wedge $ pro \r
+$ \forall v \ne z, v \ne s : f^{\Delta}(v) \geq 0 $.\r
+\r
+\s{Poznámka:} Funkce $f^{\Delta}(v)$ vrací pøebytek ve vrcholu \r
+$v$ : $$f^{\Delta}(v):=\sum_{(u,v) \in E}{f(u,v)} - \sum_{(v,u) \in E}{f(v,u)}$$\r
+Tok je vlna, kde $ f^{\Delta}(v) = 0 , \forall v \in V , v \ne z,s $.\r
+\r
+\noindent r(v,u)\r
+V algoritmu budeme provádìt dvì operace na vrcholech sítì. K tomu budeme potøebovat pøiøadit v¹em \r
+vrcholùm vý¹ky pomocí funkce $h : V \rightarrow \bb{N}$.\r
+\r
+\s{Operace:} pro $ (u,v) \in E$\r
+\r
+\algo\r
+\:{\I Pøevedení pøebytku} \r
+\r
+Pokud platí:\r
+\itemize\ibull\r
+       \: $u : f^{\Delta}(v) > 0$\r
+       \: $v : h(u) > h(v)$\r
+       \: $r(u,v)>0$   \r
+\endlist\r
+ pøevedeme tok o velikosti $\delta:=min(f^{\Delta}(u),r(u,v))$ z $u$ do $v$ takto: $f^{\Delta}(u):=f^{\Delta}(u)-\delta$ $f^{\Delta}(v):=f^{\Delta}(v)+\delta$, $r(u,v)=r(u,v)-\delta$ a $r(v,u)=r(v,u)+\delta$ .\r
+\r
+Øekneme, ¾e pøevedení je {\I nasycené}, pokud je po pøevodu rezerva na hranì $(u,v)$ nulová, tedy $r(u,v)=0$. \r
+Naopak pøevedení {\I nenasycené}, pokud po pøevodu $f^{\Delta}(v) = 0$. Pokud $r(u,v)=0 \wedge f^{\Delta}(v) = 0$\r
+budeme pøevedení pova¾ovat za {\I nasycené}.\r
+\r
+\:{\I Zvednutí vrcholu} $u$ \r
+\r
+Pokud v algoritmu narazíme na pøebytek, kterého se nelze pøevést, zvedneme vrchol $h(u):=h(u)+1$.  \r
+\endalgo\r
+\r
+\s{Algoritmus:} (Goldberg)\r
+\r
+\algo\r
+\:$h(*)\leftarrow 0, h(z)\leftarrow \bb{N}$.\r
+\:$f(*)\leftarrow 0, \forall u \in V, (z,u) \in E : f(u,v)\leftarrow c(z,u)$.\r
+\:Dokud $\exists u \in V, u \ne z, u \ne s, f^{\Delta}(u)>0$: \r
+\:Pokud $\exists (u,v) \in E, r(u,v)>0 \wedge h(u)>h(v)$, tak prevedeme pøebytek po (u,v).\r
+\:Jinak zvedneme $u$.\r
+\:Vrátíme tok $f$ jako výsledek.\r
+\endalgo\r
+\r
+\s{Poznámka:} Pokud v síti neexistují nìkteré zpìtné hrany, tak je tam pøidáme s nulovou kapacitou\r
+\r
+\noindent\r
+Následovat bude nìkolik lemmat a invariantù, jimi¾ se doká¾e správnost a èasová slo¾itost vý¹e popsaného\r
+agoritmu.\r
+\r
+\s{Invariant A:} Funkce $f:E \rightarrow \bb{R}$ vrácená algoritmem je vlna. Pro $\forall v \in V, h(v)$ neklesá a\r
+$h(z)=N, h(s)=0$.\r
+\r
+\proof\r
+Pro první èást invariantu si staèí rozmyslet, ¾e v~¾ádném kroku algoritmu nepøekroèíme kapacity hran a~nevytvoøíme\r
+záporný pøebytek. Pro $\forall v \in V, v \ne z, v \ne$ skuteènì vý¹ku pouze zvy¹ujeme a z podmínky v tøetím kroku\r
+algoritmu vyplývá, ¾e nás pøebytky v $z$ a $s$ v podstatì nezajímají, tudí¾ ani nemìníme jejich vý¹ku.   \r
+\qed\r
+\r
+\s{Invariant S(o spádu):} Pro $\forall (u,v) \in E, r(u,v)>0 : h(u) \leq h(v)+1$. Tedy neexistuje hrana se spádem vìt¹ím ne¾ jedna a nenulovou rezervou.\r
+\r
+\proof\r
+Podívejme se, kdy by mohla vzniknout nenasycená hrana se spádem vìt¹ím ne¾ 1. V druhé fázi algoritmu k tomu nedojde. Pokud ji¾ existuje vrchol $v$ s pøebytkem a nenasycená hrana $(v,u)$ a platí $h(v)=h(u)+1$ vrchol $v$ algoritmu nezvedá a rovnou pøebytek posílá po této hranì. Uva¾me tedy je¹tì druhý pøípad, kdy existuje nasycená hrana $(u,v)$ se spádem vìt¹ím ne¾ jedna a tuto hranu se pokusíme odsytit. Jen¾e to také nejde, proto¾e kdybychom cokoli poslali proti smìru této hrany, bude to proti smìru funkce $h()$, ale to nejde.\r
+\qed \r
+\r
+\s{Lemma K (o korektnosti)} Kdy¾ se algorimus zastaví, vydá maxinální tok.\r
+\r
+\proof\r
+Vyjdìme z toho, ¾e $f$ je vlna a algorimus se mù¾e zastavit v tìchto pøípadech:\r
+\itemize\ibull\r
+\:ve vrcholech grafu nejsou ¾ádné pøebytky. Potom, ale $f$ je zároveò tok.\r
+\:pokud existuje nenasycená cesta $P$ ze zdroje do stoku. O té víme, ¾e má maximálnì $n-1$ hran. Zároveò v¹ak musí mít spád $N$, ale to znamená, ¾e existuje hrana $(u,v)$, pro kterou platí $h(u,v)>=2$, ale to je spor s Invariantem S.\r
+\endlist\r
+\qed\r
+\r
+\s{Invarinat C (cesta domù, do zdroje)} Je-li $v \in V(G), v \neq z,s,  f^{\Delta}(v) > 0$, pak existuje nenasycená cesta z $v$ do $z$.\r
+\r
+\proof\r
+Mìjme nìjaký vrchol $v \in V(G)$ takový, ¾e  $f^{\Delta}(v) > 0$.\r
+Potom definujme mno¾inu $A := \{ u \in V(G) : \exists$ nenasycená cesta z $v$ do $u \}$.\r
+Mìjme vrcholy $a \in A$ a $b \in V(G) - A$ takové, ¾e $(b,a)\in E$. O nich víme, ¾e $f(b, a)=0$, proto¾e pokud by tomu tak nebylo, muselo by platit $r(a, b)>0$, a tedy $b$ patøí do mno¾iny $A$.\r
+\r
+\noindent Seètìme pøebytky ve v¹ech vrcholech $A$, Proto¾e pøebytek ka¾dého vrcholu se spoèítá jako souèet tokù do nìj vstupujících minus souèet tokù z nìj vystupujících a v¹echny hrany, jejich¾ oba vrcholy le¾í v $A$ se tedy jedenkrát pøiètou a jedenkrát odeètou, platí:\r
+$$\sum_{u \in A}f^{\Delta}(u)=\sum_{(a,b)\in E \cap (\bar{A}\times A)}f(a,b)-\sum_{(b,a)\in E \cap (A\times \bar{A})}f(b,a)$$\r
+Proto¾e v¹ak do $A$ nic neteèe, nebo\9d obsahuje zdroj (pokud není izolovaný, existují nenasycené zpìtné hrany), tento výraz musí být men¹í, roven nule. Odtud vyplývá, ¾e pokud nìco odtéká ven z $A$ nebo $A$ obsahuje $s$, pak $\exists u \in A, f^{\Delta}(u)<0$. Toto $u$ musí být zdroj, proto¾e v¹echny ostatní vrcholy mají kladný pøebytek.\r
+\qed\r
+\s{Invariant V (vý¹ka)} Pro $\forall v \in V$ platí $h(v)<=2N$.\r
+\r
+\proof\r
+Víme, ¾e poèet hran v cestì ze $z$ do $\forall v \in V$ je maximálnì $N-1$.\r
+Pokud by existoval vrchol $v$ s vý¹kou $h(v)>2N$, musel by být zvednut alespoò 2N-krát. To ale znamená, ¾e by po $2N-1$ zvednutích musel mít stále pøebytek. Pokud tento pøebytek nelze pøevést do ¾ádného jiného vrcholu $\acute{v}$, musí platit $h(v)<=h(\acute{v})$ a tedy $v$ bude zvednut po 2N. To ale znamená, ¾e by platilo $h(v)-h(z)=N$. Dále víme z Invariantu C, ¾e existuje nenasycená cesta z $v$ do $z$. Potom, ale v cestì ze $z$ do $v$ existuje hrana se spádem vìt¹ím ne¾ 1 a to je spor s Invariantem S.\r
+\qed\r
+\r
+\s{Lemma Z (poèet zvednutí)} Poèet v¹ech zvednutí je maximálnì $2N^{2}$.\r
+\r
+\proof\r
+Staèí si uvìdomit, ¾e ka¾dý vrchol zvednut maximálnì 2N-krát a vrcholù je N.\r
+\qed\r
+%\r
+%\s{Definice:} Nasycené pøevedení je pøevedení pøebytku z vrcholu hranou takové, ¾e tato hrana bude nasycena.\r
+%\r
+%\s{Definice:} Nenasycené pøevedení je takové pøevedení, které není syté a pøi nìm¾ dojde k odstranìní pøebytku z vrcholu.\r
+\r
+\s{Lemma SY (sytá pøevedení)} Poìet v¹ech sytých pøevedení je maximálnì $NM$.\r
+\r
+\proof\r
+Mìjme hranu $(u,v) \in E$, kterou jsme právì nasytili. Tedy platí $h(v)<h(u)$ a zároveò $r(u, v)=0$. Aby se rezerva této hrany zmìnila, musel by ji nìkdo odsytit. Ale nutná podmínka pro odsycení hrany je, ¾e se otoèí nerovnost mezi vý¹kami koncových vrcholù. Tedy $h(v)>h(u)$. Proto, abychom tuto hranu opìt nasytili, musíme opìt zmìnit nerovnost vý¹ek na $h(v)<h(u)$.  Mezi dvìma nasyceními hrany $(u,v)$ probìhly minimálnì dvì zvednutí vrcholu $u$. Algoritmus nikdy vý¹ku vrcholu nesni¾uje, a tedy poèet v¹ech sytých pøevedení je skuteènì $NM$.\r
+\qed\r
+\r
+\r
+\r
+\end\r
diff --git a/4-goldberg/Makefile b/4-goldberg/Makefile
new file mode 100644 (file)
index 0000000..a7a85b6
--- /dev/null
@@ -0,0 +1,3 @@
+P=4-goldberg
+
+include ../Makerules
index 4a84909d655f2c9149e7a063a4a35378158f4099..881976e1cf671668ee2dcb7c6a97c01bc65995e8 100644 (file)
@@ -1,5 +1,5 @@
 P=ads2
-X:=$(shell for a in 1 2 3 ; do echo ../$$a-*/$$a-*.tex ; done)
+X:=$(shell for a in 1 2 3 ; do echo ../$$a-*/$$a-*.tex ; done)
 
 %universe: all ChangeLog