From: Martin Mares Date: Mon, 1 Nov 2010 20:36:59 +0000 (+0100) Subject: Cesty: Prvni kolo korektur X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=fc369bfdd42151e4975b848c03c2b3c98dbeee52;p=ga.git Cesty: Prvni kolo korektur --- diff --git a/13-dijkstra/13-dijkstra.tex b/13-dijkstra/13-dijkstra.tex index 35da445..967164f 100644 --- a/13-dijkstra/13-dijkstra.tex +++ b/13-dijkstra/13-dijkstra.tex @@ -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 \ (vlo¾ení vrcholu), \ (nalezení a smazání minima) a \ (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 \ a \, se zrychlí na~$\O(\log_k n)$. Ov¹em \ 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} -- \ a \ stojí $\O(1)$, \ 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} -- \ a \ stojí $\O(1)$, \ 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í \ 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 \ na $-\infty$ následovaný -\em) a do~ni¾¹í vlo¾íme. To se ka¾dému prvku mù¾e pøihodit nejvý¹e +\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 \ 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 \, 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 \. 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 \u zaplatil èas $\O(B+d)$ a jak \, -tak \ pak budou mít konstantní amortizovanou slo¾itost. Dijkstrùv +tak \ 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: \>\: \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 \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 \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ù. \ v~haldì tedy trvá $\O(\log(dH))$, +vyskytuje nejvý¹e $\O(dH)$ prvkù. \ 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~\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 \ amortizovanou èasovou slo¾itostí $\O(\sqrt{\log L})$ +HOT Queue tedy zvládne \ 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 1c11d69..c56121f 100644 --- a/ga.bib +++ b/ga.bib @@ -566,3 +566,22 @@ 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} +}