]> mj.ucw.cz Git - ga.git/commitdiff
Cesty: Prvni kolo korektur
authorMartin Mares <mj@ucw.cz>
Mon, 1 Nov 2010 20:36:59 +0000 (21:36 +0100)
committerMartin Mares <mj@ucw.cz>
Mon, 1 Nov 2010 20:36:59 +0000 (21:36 +0100)
13-dijkstra/13-dijkstra.tex
ga.bib

index 35da4453ba120396f33bb9bb23612be70f1b49f1..967164ff5eba28d548cc7df62fc9fa8875eef19c 100644 (file)
@@ -225,12 +225,12 @@ se nemohou nijak zm
 
 Pøímoèará implementace Dijkstrova algoritmu by tedy poka¾dé v~èase $\O(n)$
 vybrala otevøený vrchol s~nejmen¹ím ohodnocením, v~èase $\O(n)$ ho relaxovala
-a toto by se opakovalo nejvý¹e $n$-krát. Algoritmus by tedy dobìhl v~èase $\O(n^2)$,
-co¾ je pro husté grafy zajisté optimální. Zkusíme tedy algoritmus zrychlit
+a toto by se opakovalo nejvý¹e $n$-krát. Algoritmus by tudí¾ dobìhl v~èase $\O(n^2)$,
+co¾ je pro husté grafy zajisté optimální. Zkusíme nyní zrychlit výpoèet
 na~øídkých grafech.
 
 V¹echny relaxace trvají dohromady $\O(\sum_v \deg(v)) = \O(m)$, tak¾e úzkým hrdlem je
-vybírání minima. Pou¾ijeme tedy vhodnou datovou strukturu, v~ní¾ budeme udr¾ovat
+vybírání minima. Pou¾ijeme pro nìj vhodnou datovou strukturu, v~ní¾ budeme udr¾ovat
 mno¾inu v¹ech otevøených vrcholù spolu s~jejich ohodnoceními. Od~datové struktury
 potøebujeme, aby umìla operace \<Insert> (vlo¾ení vrcholu), \<ExtractMin> (nalezení
 a smazání minima) a \<Decrease> (sní¾ení hodnoty vrcholu). První dvì operace pøitom
@@ -247,20 +247,20 @@ na~struktu
   celkem tedy $\O(n^2)$.
 \:{\I (binární) halda} -- v¹echny tøi operace umíme provést v~èase $\O(\log n)$, tak¾e celkem
   $\O(m\log n)$. To je pro husté grafy hor¹í, pro øídké lep¹í.
-\:{\I $k$-regulární halda} -- pokud haldu upravíme tak, ¾e ka¾dý vrchol bude mít a¾ $k$ synù,
+\:{\I $k$-regulární halda} -- pokud haldu upravíme tak, ¾e ka¾dý prvek bude mít a¾ $k$ synù,
   hloubka haldy klesne na~$\O(\log_k n)$. Operace \uv{vybublávající} prvky smìrem nahoru,
   co¾ je \<Insert> a \<Decrease>, se zrychlí na~$\O(\log_k n)$. Ov¹em \<ExtractMin> potøebuje
   zkoumat v¹echny syny ka¾dého nav¹tíveného prvku, tak¾e se zpomalí na $\O(k\log_k n)$.
 
   Celková slo¾itost tedy vyjde $\O(nk\log_k n + m\log_k n)$. Oba èleny se vyrovnají
-  pro $k=m/n$, èím¾ získáme $\O(m\log_{m/n} n)$. Tento logaritmus je pøitom $\O(1)$,
+  pro $k=m/n$, èím¾ získáme $\O(m\log_{m/n} n)$. Èlen $\log_{m/n} n$ je pøitom $\O(1)$,
   kdykoliv je $m\ge n^{1+\varepsilon}$ pro nìjaké~$\varepsilon>0$, tak¾e pro dostateènì
-  husté grafy je algoritmus lineární.
+  husté grafy jsme získali lineární algoritmus.
 
   (V¹imnìte si, ¾e pro $m\approx n^2$ algoritmus zvolí $k\approx n$, tak¾e halda degeneruje
-  na jediné patro, tedy na pole, které se opravdu ukázalo jako optimální volba pro husté grafy.)
-\:{\I Fibonacciho halda} -- \<Insert> a \<Decrease> stojí $\O(1)$, \<ExtractMin> má slo¾itost
-  $\O(\log n)$ [v¹e amortizovanì]. Dijkstrùv algoritmus tedy dobìhne v~èase $\O(m + n\log n)$.
+  na jediné patro, tedy na pole, které se opravdu ukázalo být optimální volbou pro husté grafy.)
+\:{\I Fibonacciho halda} \cite{ft:fibonacci} -- \<Insert> a \<Decrease> stojí $\O(1)$, \<ExtractMin> má slo¾itost
+  $\O(\log n)$ [v¹e amortizovanì]. Dijkstrùv algoritmus proto dobìhne v~èase $\O(m + n\log n)$.
   To je lineární pro grafy s~hustotou $\Omega(\log n)$.
 \:{\I Monotónní haldy} -- mù¾eme pou¾ít nìjakou jinou haldu, která vyu¾ívá toho,
   ¾e posloupnost odebíraných prvkù neklesající. Pro celá èísla na~\hbox{RAMu} to mù¾e
@@ -272,14 +272,14 @@ na~struktu
 \s{Cvièení:}
 
 \itemize\ibull
-\:Najdìte pøíklad nìjakého grafu se zápornými hranami (ale bez záporných cyklù),
+\:Najdìte pøíklad grafu se zápornými hranami (ale bez záporných cyklù),
   na~kterém Dijkstrùv algoritmus sel¾e.
 \:Rozmyslete si, ¾e pokud nevyu¾ijeme nìjaké speciální vlastnosti èísel (celoèíselnost,
   omezený rozsah), je mez $\O(m+n\log n)$ nejlep¹í mo¾ná, proto¾e Dijkstrovým algoritmem
   mù¾eme tøídit $n$-tici èísel. Thorup dokonce dokázal \cite{thorup:equiv}, ¾e z~ka¾dého tøídícího algoritmu
-  se slo¾itostí $nT(n)$ mù¾eme odvodit haldu se slo¾itostí mazání $\O(T(n))$.
+  se slo¾itostí $\O(nT(n))$ mù¾eme odvodit haldu se slo¾itostí mazání $\O(T(n))$.
 \:Jsou-li délky hran celoèíselné, mù¾eme se na Dijkstrùv algoritmus dívat i takto:
-  Pøedstavme si, ¾e ka¾dou hranu nahradíme cestou tvoøenou hranami jednotkové délky
+  Pøedstavme si, ¾e ka¾dou hranu nahradíme cestou tvoøenou pøíslu¹ným poètem hran jednotkové délky
   a na vzniklý neohodnocený graf spustíme prohledávání do~¹íøky. To samozøejmì vydá
   správný výsledek, ale pomìrnì pomalu, proto¾e bude vìt¹inu èasu trávit posouváním
   vlny \uv{uvnitø} pùvodních hran. Mù¾eme si tedy pro ka¾dou pùvodní hranu naøídit
@@ -310,7 +310,7 @@ vypr
 asymptoticky nezhor¹íme, prostor klesne na~$\O(L+m)$.
 
 Podobný trik mù¾eme pou¾ít i pro libovolnou jinou datovou strukturu: rozsah èísel
-rozdìlíme na~\uv{okna} velikosti~$L$ (v~$i$-tém oknì jsou èísla $Li,\ldots,L(i+1)-1$).
+rozdìlíme na~\uv{okna} velikosti~$L$ (v~$i$-tém oknì jsou èísla $iL,\ldots,(i+1)L-1$).
 V~libovolné chvíli mohou tedy být neprázdná nejvý¹e dvì okna. Staèí nám proto
 poøídit si dvì struktury pro ukládání èísel v~rozsahu $0,\ldots,L-1$ -- jedna
 z~nich bude reprezentovat aktuální okno (to, v~nìm¾ le¾elo minulé minimum),
@@ -319,7 +319,7 @@ u
 do~které struktury se má vkládat. S~operací \<Decrease> je to slo¾itìj¹í --
 hodnota z~vy¹¹í struktury mù¾e pøeskoèit do té ni¾¹í, ale v~takovém pøípadì
 ji ve~vy¹¹í struktuøe vyma¾eme (to je \<Decrease> na $-\infty$ následovaný
-\<ExtractMin>em) a do~ni¾¹í vlo¾íme. To se ka¾dému prvku mù¾e pøihodit nejvý¹e
+\<ExtractMin>em) a do~té ni¾¹í vlo¾íme. To se ka¾dému prvku mù¾e pøihodit nejvý¹e
 jednou, tak¾e stále platí, ¾e se ka¾dý prvek úèastní $\O(1)$ vlo¾ení a $\O(1)$
 extrakcí minima.
 
@@ -338,13 +338,14 @@ Vra
 \h{Víceúrovòové pøihrádky}
 
 Podobnì jako u~tøídìní èísel, i~zde se vyplácí stavìt pøihrádkové struktury
-víceúrovòovì. Jednotlivé hodnoty budeme zapisovat v~soustavì o~základu~$B$,
-který zvolíme jako nìjakou mocnina dvojky, abychom mohli s~èíslicemi tohoto
+víceúrovòovì (pùvodnì popsáno Goldbergem a Silversteinem \cite{goldberg:mlb}).
+Jednotlivé hodnoty budeme zapisovat v~soustavì o~základu~$B$,
+který zvolíme jako nìjakou mocninu dvojky, abychom mohli s~èíslicemi tohoto
 zápisu snadno zacházet pomocí bitových operací. Ka¾dé èíslo tedy zabere nejvý¹e
 $d=1+\lfloor\log_B L\rfloor$ èíslic; pokud bude krat¹í, doplníme ho zleva nulami.
 
 Nejvy¹¹í patro struktury bude tvoøeno polem $B$~pøihrádek, v~$i$-té z~nich
-budou ulo¾ena ta èísla, jejich¾ nejvy¹¹í øád je roven~$i$. Za~{\I aktivní}
+budou ulo¾ena ta èísla, jejich¾ èíslice nejvy¹¹ího øádu je rovna~$i$. Za~{\I aktivní}
 prohlásíme tu pøihrádku, která obsahuje aktuální minimum. Pøihrádky s~men¹ími
 indexy jsou prázdné a zùstanou takové a¾ do~konce výpoètu, proto¾e halda
 je monotónní. Pokud v~pøihrádce obsahující minimum bude více prvkù, budeme
@@ -356,8 +357,8 @@ Celkem tak vznikne a
 \itemize\ibull
 \:Parametry $L$, $B$ a~$d$.
 \:Pole úrovní (nejvy¹¹í má èíslo~$d-1$, nejni¾¹í~0), ka¾dá úroveò je buïto prázdná
-  (a pak jsou prázdné i~v¹echny ni¾¹í), nebo obsahuje pole~$U_i$ o~$B$ pøihrádkách,
-  z~nich¾ ka¾dá obsahuje seznam prvkù. Toto pole pou¾íváme jako zásobník, udr¾ujeme
+  (a pak jsou prázdné i~v¹echny ni¾¹í), nebo obsahuje pole~$U_i$ o~$B$ pøihrádkách
+  a v~ka¾dé z~nich seznam prvkù. Pole úrovní pou¾íváme jako zásobník, udr¾ujeme
   si èíslo nejni¾¹í neprázdné úrovnì.
 \:Hodnotu~$\mu$ pøedchozího odebraného minima.
 \endlist
@@ -366,7 +367,8 @@ Operace \<Insert> vlo
 na~nejvy¹¹í úroveò: pokud hodnota patøí do pøihrádky, která není aktivní, vlo¾í
 ji pøímo. Jinak pøejde o~úroveò ní¾e a zopakuje stejný postup. To v¹e lze provést
 v~konstantním èase: staèí se podívat, jaký je nejvy¹¹í jednièkový bit ve~{\sc xor}u
-nové hodnoty s~èíslem~$\mu$ (opìt viz kapitola o~výpoèetních modelech).
+nové hodnoty s~èíslem~$\mu$ (opìt viz kapitola o~výpoèetních modelech), a tím zjistit
+èíslo úrovnì, kam hodnota patøí.
 
 Pokud chceme provést \<Decrease>, odstraníme hodnotu z~pøihrádky, ve~které se
 právì nachází (polohu si mù¾eme u~ka¾dé hodnoty pamatovat zvlá¹»), a znovu ji
@@ -375,11 +377,11 @@ vlo
 Vìt¹inu práce samozøejmì pøenecháme funkci \<ExtractMin>. Ta zaène prohledávat
 nejni¾¹í obsazenou úroveò od~aktivní pøihrádky dál (to, která pøihrádka je na
 které úrovni aktivní, poznáme z~èíslic hodnoty~$\mu$). Pokud pøihrádky na~této
-úrovni dojdou, prázdnou úroveò zru¹í a pokraèuje o~patro vý¹e.
+úrovni dojdou, prázdnou úroveò zru¹íme a pokraèujeme o~patro vý¹e.
 
-Jakmile najde neprázdnou pøihrádku, nalezne v~ní minimum a to se stane novým~$\mu$.
-Pokud v~pøihrádce nebyly ¾ádné dal¹í prvky, skonèí. Jinak zbývající prvky
-rozprostøe do~pøihrádek na~bezprostøednì ni¾¹í úrovni, kterou tím zalo¾í.
+Jakmile najdeme neprázdnou pøihrádku, nalezneme v~ní minimum a to se stane novým~$\mu$.
+Pokud v~pøihrádce nebyly ¾ádné dal¹í prvky, skonèíme. V~opaèném pøípadì zbývající
+prvky rozprostøeme do~pøihrádek na~bezprostøednì ni¾¹í úrovni, kterou tím zalo¾íme.
 
 Èas strávený hledáním minima mù¾eme rozdìlit na~nìkolik èástí:
 
@@ -397,7 +399,7 @@ rozprost
 \endlist
 
 \>Staèí tedy, aby ka¾dý prvek pøi \<Insert>u zaplatil èas $\O(B+d)$ a jak \<Decrease>,
-tak \<ExtractMin> pak budou mít konstantní amortizovanou slo¾itost. Dijkstrùv
+tak \<ExtractMin> budou mít konstantní amortizovanou slo¾itost. Dijkstrùv
 algoritmus pak pobì¾í v~$\O(m + n(B+d))$.
 
 Zbývá nastavit parametry tak, abychom minimalizovali výraz $B+d = B + \log L/\log B$.
@@ -419,25 +421,25 @@ variantu (v~t
 Poøídíme si haldu, øeknìme Fibonacciho, a~navíc ke~ka¾dé úrovni poèítadlo udávající,
 kolik prvkù z~této úrovnì jsme ulo¾ili do~haldy. Dokud toto poèítadlo nepøeroste nìjaký
 parametr~$H$, pøihrádky nebudeme zakládat a prvky poputují do~haldy. Èas $\O(B)$ na
-zalo¾ení úrovnì a její procházení tedy mù¾eme rozpoèítat mezi~$H$ prvkù, které se musely
+zalo¾ení úrovnì a její procházení proto mù¾eme rozpoèítat mezi~$H$ prvkù, které se musely
 na~dané úrovni objevit, ne¾ byla rozpøihrádkována. (Pov¹imnìte si, ¾e poèítadlo nikdy
-nesni¾ujeme, pouze ho vynulujeme, kdy¾ je úroveò zru¹ena, tak¾e vùbec nemusí odpovídat
+nesni¾ujeme, pouze ho vynulujeme, kdy¾ je úroveò zru¹ena. Proto vùbec nemusí odpovídat
 skuteènému poètu prvkù z~pøíslu¹né úrovnì, které jsou právì ulo¾eny v~haldì. To ov¹em
-vùbec nevadí -- poèítadlo pouze hlídá, aby se úroveò nevytvoøila pøíli¹ brzy a abychom
+vùbec nevadí -- poèítadlo pouze hlídá, aby se úroveò nevytvoøila pøíli¹ brzy, tedy abychom
 mìli dost prvkù k~rozúètování èasu.)
 
 Promìnnou~$\mu$ necháme ukazovat na~místo, kde jsme se pøi hledání minima v~pøihrádkách
-zastavili. Souèasné globální minimum struktury tedy mù¾e být ni¾¹í, kdy¾ se minimum
-zrovna nachází v~haldì, ale stále je zaruèeno, ¾e pøed~$\mu$ se ji¾ nenachází ¾ádná
+zastavili. Souèasné globální minimum struktury mù¾e být ni¾¹í, nachází-li se minimum
+zrovna v~haldì. Stále je v¹ak zaruèeno, ¾e pøed~$\mu$ se nenachází ¾ádná
 neprázdná pøihrádka.
 
 Operace budou fungovat takto:
 
 \>\<Insert>:
 \algo
-\:Spoèítáme, do~které úrovnì~$i$ má prvek padnout.
+\:Spoèítáme, do~které úrovnì~$i$ má prvek padnout (bitovými operacemi).
 \:Pokud je poèítadlo této úrovnì men¹í ne¾~$K$, zvý¹íme ho, vlo¾íme prvek do~haldy a skoèíme.
-\:Nebyly-li je¹tì pro tuto úroveò zalo¾eny pøihrádky, vyrobíme je (prázdné).
+\:Nebyly-li je¹tì pro tuto úroveò zalo¾eny pøihrádky, vyrobíme prázdné.
 \:Vlo¾íme prvek do~pøíslu¹né pøihrádky.
 \endalgo
 
@@ -452,8 +454,9 @@ Operace budou fungovat takto:
 \algo
 \:Dokud je~$\mu$ men¹í ne¾ aktuální minimum haldy, opakujeme:
 \::Najdeme pøihrádku odpovídající hodnotì~$\mu$.
-\::Je-li tato pøihrádka prázdná, pøejdeme na~dal¹í (upravíme~$\mu$). Jsme-li na konci úrovnì, pak o~úroveò vý¹.
-\::Rozprostøeme tuto pøihrádku o~úroveò ní¾ (stejným zpùsobem, jako pøi \<Insert>u,
+\::Je-li tato pøihrádka prázdná, pøejdeme na~dal¹í (upravíme~$\mu$). Jsme-li na konci úrovnì,
+   zru¹íme ji, vynulujeme její poèítadlo a pokraèujeme o~úroveò vý¹.
+\::Není-li prázdná, rozprostøeme ji pøihrádku o~úroveò ní¾ (stejným zpùsobem jako pøi \<Insert>u,
    tak¾e prvních~$H$ prvkù vlo¾íme do~haldy).
 \:Sma¾eme minimum z~haldy a vrátíme ho jako výsledek.
 \endalgo
@@ -463,7 +466,7 @@ po
 
 Nejprve si v¹imneme, ¾e ne¾ poèítadlo nìjaké úrovnì vynulujeme, jsou bezpeènì
 z~haldy pryè v¹echny prvky patøící do~této úrovnì. Celkem se tedy v~haldì
-vyskytuje nejvý¹e $\O(dH)$ prvkù. \<ExtractMin> v~haldì tedy trvá $\O(\log(dH))$,
+vyskytuje nejvý¹e $\O(dH)$ prvkù. \<ExtractMin> v~haldì proto trvá $\O(\log(dH))$,
 ostatní haldové operace $\O(1)$.
 
 Nyní rozúètujeme èas operací mezi jednotlivé prvky (opìt si v¹e pøedplatíme
@@ -481,21 +484,21 @@ v~\<Insert>u a ostatn
 \endlist
 
 \>Ka¾dý prvek tedy platí $\O(d + \log dH + L^{1/d}/H) = \O(d + \log H + L^{1/d}/H)$.
-Pojïme najít nastavení parametrù, abychom tento výraz minimalizovali.
+Pojïme najít nastavení parametrù, které tento výraz minimalizuje.
 Nejprve zvolme~$H$ tak, aby se~$d$ vyrovnalo s~$L^{1/d}/H$. Tedy $H = L^{1/d}/d$.
 Celý výraz tím zjednodu¹íme na $\O(d + \log\,(L^{1/d}/d))$ =
-$\O(d + 1/d\cdot\log L - \log d) = \O(d + 1/d\cdot\log L)$. Dále zvolíme~$d$
-tak, aby se oba výrazy vyrovnaly, èili $d=\sqrt{\log L}$.
+$\O(d + 1/d\cdot\log L - \log d) = \O(d + 1/d\cdot\log L)$. Oba sèítance volbou
+$d=\sqrt{\log L}$ vyrovnáme.
 
-HOT Queue tedy zvládne \<Insert> amortizovanou èasovou slo¾itostí $\O(\sqrt{\log L})$
+HOT Queue tedy zvládne \<Insert> s~amortizovanou èasovou slo¾itostí $\O(\sqrt{\log L})$
 a ostatní operace v~èase amortizovanì konstantním. Pou¾ijeme-li tuto strukturu
 v~Dijkstrovì algoritmu, spoète vzdálenosti v~èase $\O(m + n\sqrt{\log L})$.
 
 \h{Dinicùv algoritmus}
 
-Zajímavé vylep¹ení Dijkstrova algoritmu navrhl Dinic (REF). V¹iml si, ¾e pokud
-je ka¾dá hrana dlouhá alespoò~$\delta$, pak platí, ¾e mù¾eme uzavírat nejen
-vrchol s~minimálním ohodnocením~$\mu$, ale i v¹echny ostatní s~ohodnocením
+Zajímavé vylep¹ení Dijkstrova algoritmu navrhl Dinic. V¹iml si, ¾e pokud
+je ka¾dá hrana dlouhá alespoò~$\delta$, mù¾eme uzavírat nejen
+vrchol s~minimálním ohodnocením~$\mu$, ale i v¹echny s~ohodnocením
 men¹ím ne¾ $\mu+\delta$.
 
 Pro takto upravený Dijkstrùv algoritmus bude stále platit, ¾e pøi uzavírání
@@ -507,24 +510,22 @@ hald
 Tyto hodnoty se toti¾ chovají monotónnì a vrcholy se stejným $h'(v)$ mù¾eme
 libovolnì zamìòovat.
 
-Libovolnou z~popsaných pøihrádkových struktur tedy mù¾eme pou¾ít, pouze
+Kteroukoli z~popsaných pøihrádkových struktur mù¾eme tedy pou¾ít, pouze
 v~rozboru èasové slo¾itosti nahradíme~$L$ výrazem $L/\delta$. Tento pøístup
 pøitom funguje i pro neceloèíselné kapacity, pouze potøebujeme mít pøedem
 k~dispozici netriviální dolní odhad na~délky v¹ech hran.
 
-\s{Cvièení:} Navrhnìte úpravu tohoto algoritmu, která nepotøebuje~$\delta$ znát pøedem.
-
 \h{Potenciály}
 
 Vidìli jsme, ¾e v~grafech s~nezápornými délkami hran se nejkrat¹í cesty
-hledají daleko rychleji. Nabízí se nalézt nìjakou transformaci, která by
-dovedla délky upravit tak, aby byly nejkrat¹í cesty zachovány (samozøejmì
+hledají snáze. Nabízí se nalézt nìjakou transformaci, která by
+dovedla délky hran upravit tak, aby byly nejkrat¹í cesty zachovány (samozøejmì
 ne jejich délky, ale alespoò to, které cesty jsou nejkrat¹í). Nabízí se
 následující fyzikální inspirace:
 
 \s{Definice:} {\I Potenciál} budeme øíkat libovolné funkci $\psi: V\rightarrow {\bb R}$.
-Pro ka¾dý potenciál zavedeme {\I redukované délky} $\ell_\psi(u,v) := \ell(u,v) + \psi(u) - \psi(v)$.
-Potenciálu budeme øíkat {\I pøípustný,} pokud ¾ádná hrana nemá zápornou redukovanou délku.
+Pro ka¾dý potenciál zavedeme {\I redukované délky hran} $\ell_\psi(u,v) := \ell(u,v) + \psi(u) - \psi(v)$.
+Potenciál nazveme {\I pøípustný,} pokud ¾ádná hrana nemá zápornou redukovanou délku.
 
 \s{Pozorování:} Pro redukovanou délku libovolné cesty~$P$ z~$u$ do~$v$ platí: $\ell_\psi(P) = \ell(P) + \psi(u) - \psi(v)$.
 
@@ -533,18 +534,18 @@ Nech
 $$
 \ell_\psi(P) = \sum_i \ell_\psi(w_i,w_{i+1}) = \sum_i \left( \ell(w_i,w_{i+1}) + \psi(w_i) - \psi(w_{i+1}) \right).
 $$
-Tato suma je ov¹em teleskopická, tak¾e z~ní zbude:
+Tato suma je ov¹em teleskopická, tak¾e z~ní zbude
 $$
-\sum_i\ell(w_i,w_{i+1}) + \psi(w_1) - \psi(w_k),
+\sum_i\ell(w_i,w_{i+1}) + \psi(w_1) - \psi(w_k) = \ell(P) + \psi(u) - \psi(v).
 $$
-co¾ je rovno $\ell(P) + \psi(u) - \psi(v)$.
+\vskip-\baselineskip
 \qed
 
-\s{Dùsledek:} Potenciálovou redukcí se tedy délky v¹ech cest mezi~$u$ a~$v$
+\s{Dùsledek:} Potenciálovou redukcí se délky v¹ech cest mezi~$u$ a~$v$
 zmìní o~tuté¾ konstantu, tak¾e struktura nejkrat¹ích cest zùstane nezmìnìna.
 
 Zbývá pøijít na~to, kde si obstarat nìjaký pøípustný potenciál. Pøidejme do~grafu
-nový vrchol~$z$, pøiveïme z~nìj hranu nulové délky do~v¹ech ostatních vrcholù
+nový vrchol~$z$, pøiveïme z~nìj hrany nulové délky do~v¹ech ostatních vrcholù
 a~oznaème~$\psi(v)$ vzdálenost ze~$z$ do~$v$ v~tomto grafu. Aby byl tento potenciál
 pøípustný, musí pro ka¾dou hranu $uv$ platit $\ell_\psi(u,v) = \ell(u,v) + \psi(u) - \psi(v) \ge 0$.
 Tuto nerovnost mù¾eme upravit na $\ell(u,v) + d(z,u) - d(z,v) \ge 0$, èili
@@ -552,7 +553,7 @@ $d(z,u) + \ell(u,v) \ge d(z,v)$, co
 pro vzdálenost v~grafu, která jistì platí.
 
 Jedním výpoètem nejkrat¹ích cest v~grafu se zápornými hranami (tøeba algoritmem BFM)
-tedy doká¾eme spoèítat potenciál, který nám pomù¾e k~redukci v¹ech hran na~nezáporné
+tedy doká¾eme spoèítat potenciál, který nám poslou¾í k~redukci v¹ech hran na~nezáporné
 délky. To nám samozøejmì nepomù¾e, chceme-li jednorázovì hledat nejkrat¹í cestu,
 ale mù¾e nám to výraznì zjednodu¹it dal¹í, slo¾itìj¹í práci s~grafem. Jak uvidíme
 v~pøí¹tí kapitole, mù¾eme tak napøíklad nalézt vzdálenosti mezi v¹emi dvojicemi
@@ -563,8 +564,8 @@ n
 
 \s{Lemma:} Pokud $f$ a~$g$ jsou pøípustné potenciály, pak jsou jimi i:
 \numlist\ndotted
-\:Konvexní kombinace $f$ a~$g$, tedy $\alpha f + \beta g$ pro libovolné $\alpha,\beta\ge 0, \alpha+\beta=1$,
-\:$\min(f,g)$,
+\:konvexní kombinace $f$ a~$g$, tedy $\alpha f + \beta g$ pro libovolné $\alpha,\beta\ge 0, \alpha+\beta=1$;
+\:$\min(f,g)$;
 \:$\max(f,g)$.
 \endlist
 
@@ -588,15 +589,14 @@ Jednotliv
 \h{Algoritmy pro problém typu \ppsp}
 
 Zamìøme se nyní na~pøípad, kdy chceme hledat nejkrat¹í cesty mezi zadanou dvojicí
-vrcholù $s$,~$t$. Obvykle se to øe¹í pomocí algoritmu typu \sssp{} (SSSP) a v~obecném
-pøípadì ani není lep¹í øe¹ení známo. Existuje ov¹em velké mno¾ství heuristik, kterými
-lze ve~vìt¹inì aplikací hledání cest zrychlit. Nìkteré z~nich si pøedvedeme na
-pøíkladu Dijkstrova algoritmu.
+vrcholù $s$,~$t$. Obvykle se i v~této situaci pou¾ívají algoritmy \sssp{} (SSSP) a v~obecném
+pøípadì ani není efektivnìj¹í øe¹ení známo. Existuje ov¹em velké mno¾ství heuristik, kterými
+lze obvykle výpoèet zrychlit. Nìkteré z~nich si pøedvedeme na Dijkstrovì algoritmu.
 
-Dijkstrùv algoritmus ve~své klasické podobì vùbec nic neví o~cílovém vrcholu
-a prohledá celý graf. První úprava, která se nabízí, je vyu¾ít toho, ¾e
-od~okam¾iku uzavøení kteréhokoliv vrcholu se ji¾ jeho ohodnocení nezmìní.
-Pokud tedy uzavøeme cílový vrchol, mù¾eme se zastavit.
+Dijkstrùv algoritmus ve~své klasické podobì neví vùbec nic o~cílovém vrcholu a
+prohledá celý graf. Hned se nabízí vyu¾ít toho, ¾e od~okam¾iku uzavøení
+kteréhokoliv vrcholu se ji¾ jeho ohodnocení nezmìní. Pokud tedy uzavøeme cílový
+vrchol, mù¾eme se zastavit.
 
 Jakou èást grafu prohledáváme teï? V~metrice dané vzdálenostmi v~grafu je to nejmen¹í
 koule se støedem ve~vrcholu~$u$, která obsahuje nejkrat¹í cestu (dobøe se to
@@ -604,23 +604,23 @@ p
 
 Také mù¾eme spustit prohledávání z~obou koncù zároveò, tedy zkombinovat hledání
 od~$s$ v~pùvodním grafu s~hledáním od~$t$ v~grafu s~obrácenou orientací hran.
-Oba postupy mù¾eme libovolnì støídat, zastavíme se v~okam¾iku, kdy jsme jeden
+Oba postupy mù¾eme libovolnì støídat a zastavíme se v~okam¾iku, kdy jsme jeden
 vrchol uzavøeli v~obou smìrech. Pozor ov¹em na to, ¾e souèet obou ohodnocení
-tohoto vrcholu nemusí být roven vzdálenosti $v$ od~$u$ (zkuste vymyslet protipøíklad).
+tohoto vrcholu nemusí být roven $d(v,u)$ -- zkuste vymyslet protipøíklad.
 Nejkrat¹í cesta je¹tì mù¾e vypadat tak, ¾e pøechází po nìjaké hranì mezi vrcholem
 uzavøeným v~jednom smìru a vrcholem uzavøeným ve~smìru druhém (ponechme bez dùkazu).
-Staèí tedy bìhem procházení hran otestovat, zda je koncový vrchol uzavøený v~opaèném
+Staèí tedy bìhem relaxace zjistit, zda je konec hrany uzavøený v~opaèném
 smìru prohledávání, a~pokud ano, zapoèítat cestu do~prùbì¾ného minima.
 
 Obousmìrný Dijkstrùv algoritmus projde sjednocení nìjaké koule okolo~$s$ s~nìjakou
 koulí okolo~$t$, které obsahuje nejkrat¹í cestu. Prùmìry koulí pøitom závisí na tom,
 jak budeme bìhem výpoètu støídat oba smìry prohledávání. V~nejhor¹ím pøípadì samozøejmì
-mù¾eme prohledat a¾ celý graf.
+mù¾eme prohledat celý graf.
 
 \h{Algoritmus \astar}
 
 V~umìlé inteligenci se èasto pro hledání nejkrat¹í cesty v~rozsáhlých grafech
-(obvykle stavových prostorech nìjaké úlohy) pou¾ívá algoritmus nazývaný~\astar.
+(obvykle stavových prostorech úloh) pou¾ívá algoritmus nazývaný~\astar{} \cite{hart:astar}.
 Jedná se o~modifikaci Dijkstrova algoritmu, která vyu¾ívá heuristickou funkci
 pro dolní odhad vzdálenosti do~cíle; oznaème si ji $\psi(v)$. V~ka¾dém kroku pak uzavíra
 vrchol~$v$ s~nejmen¹ím mo¾ným souètem $h(v)+\psi(v)$ aktuálního ohodnocení s~heuristikou.
@@ -633,10 +633,10 @@ Heuristika se p
 v~mapì, mù¾eme pou¾ít vzdálenost do~cíle vzdu¹nou èarou.
 
 Je u~tohoto algoritmu zaruèeno, ¾e v¾dy najde nejkrat¹í cestu? Na to nám dá odpovìï
-teorie potenciálù.
+teorie potenciálù:
 
 \s{Vìta:} Bìh algoritmu \astar{} odpovídá prùbìhu Dijkstrova algoritmu
-na~grafu redukovaném potenciálem daným heuristickou funkcí~$-\psi$. Pøesnìji,
+na~grafu redukovaném potenciálem~$-\psi$. Pøesnìji,
 pokud oznaèíme $h^*$ aktuální ohodnocení v~\astar{} a $h$ aktuální ohodnocení
 v~synchronnì bì¾ícím Dijkstrovi, bude v¾dy platit $h(v) = h^*(v) - \psi(s) + \psi(v)$.
 
@@ -659,7 +659,7 @@ Oba algoritmy tedy a
 
 \s{Dùsledek:} Algoritmus \astar{} funguje jen tehdy, je-li potenciál $-\psi$ pøípustný.
 
-Napøíklad pro rovinnou mapu to heuristika daná euklidovskou vzdáleností, tedy $\psi(v) := \varrho(v,t)$, splòuje:
+Napøíklad pro rovinnou mapu to heuristika daná euklidovskou vzdáleností~$\varrho$, tedy $\psi(v) := \varrho(v,t)$, splòuje:
 Pøípustnost po¾aduje pro ka¾dou hranu $uv$ nerovnost
 $\ell(u,v) - \psi(v) + \psi(u) \ge 0$,
 tedy $\ell(u,v) - \varrho(v,t) + \varrho(u,t) \ge 0$.
diff --git a/ga.bib b/ga.bib
index 1c11d69ad773a9c7ff6a88784f55d19d8c4653f6..c56121fadc94a5bcb431d0f6d61015aed1cc4d4e 100644 (file)
--- a/ga.bib
+++ b/ga.bib
   publisher={Springer Verlag}
 }
 
+@article{ goldberg:mlb,
+  title={{Implementations of Dijkstra's algorithm based on multi-level buckets}},
+  author={Goldberg, A.V. and Silverstein, C.},
+  journal={Network optimization},
+  pages={292--327},
+  year={1997},
+  publisher={Springer Verlag}
+}
+
+@article{ hart:astar,
+  title={{Correction to a formal basis for the heuristic determination of minimum cost paths}},
+  author={Hart, P.E. and Nilsson, N.J. and Raphael, B.},
+  journal={ACM SIGART Bulletin},
+  number={37},
+  pages={28--29},
+  issn={0163-5719},
+  year={1972},
+  publisher={ACM}
+}