]> mj.ucw.cz Git - ga.git/blob - 13-dijkstra/13-dijkstra.tex
Dijkstra: Oprava preklepu v HOT queues
[ga.git] / 13-dijkstra / 13-dijkstra.tex
1 \input ../sgr.tex
2
3 \prednaska{13}{Nejkrat¹í cesty}{}
4
5 \def\ppsp{1-1}
6 \def\sssp{1-$n$}
7 \def\apsp{$n$-$n$}
8 \def\astar{A\kern-0.15em *}
9
10 Problém hledání nejkrat¹í cesty v~(obvykle ohodnoceném orientovaném) grafu
11 provází teorii grafových algoritmù od~samých poèátkù. Základní algoritmy
12 pro hledání cest jsou nedílnou souèástí základních kursù programování
13 a algoritmù, my se budeme vìnovat zejména rùzným jejich vylep¹ením.
14
15 Uva¾ujme tedy nìjaký orientovaný graf, jeho¾ ka¾dá hrana~$e$ je opatøena
16 {\I délkou} $\ell(e)\in{\bb R}$. Mno¾inì hran (tøeba sledu nebo cestì)
17 pak pøiøadíme délku rovnou souètu délek jednotlivých hran.
18
19 Pro vrcholy $u,v$ definujeme jejich {\I vzdálenost} $d(u,v)$ jako nejmen¹í
20 mo¾nou délku cesty z~$u$ do~$v$ (jeliko¾ cest je v~grafu koneènì mnoho,
21 minimum v¾dy existuje). Pokud z~$u$ do~$v$ ¾ádná cesta nevede, polo¾íme
22 $d(u,v) := \infty$.
23
24 Obvykle se studují následující tøi problémy:
25
26 \itemize\ibull
27 \:{\bo 1-1} neboli {\bo P2PSP} (Point to Point Shortest Path) -- chceme nalézt nejkrat¹í
28   cestu z~daného vrcholu~$u$ do~daného vrcholu~$v$. (Pokud je nejkrat¹ích cest
29   více, tak libovolnou z~nich.)
30 \:{\bo 1-n} neboli {\bo SSSP} (Single Source Shortest Paths) -- pro daný vrchol~$u$ chceme
31   nalézt nejkrat¹í cesty do~v¹ech ostatních vrcholù.
32 \:{\bo n-n} neboli {\bo APSP} (All Pairs Shortest Paths) -- zajímají nás nejkrat¹í cesty
33   mezi v¹emi dvojicemi vrcholù.
34 \endlist
35
36 Pøekvapivì, tak obecnì, jak jsme si uvedené problémy definovali, je neumíme
37 øe¹it v~polynomiálním èase: pro grafy, které mohou obsahovat hrany záporných
38 délek bez jakýchkoliv omezení, je toti¾ hledání nejkrat¹í cesty NP-tì¾ké
39 (lze na~nìj snadno pøevést existenci hamiltonovské cesty). V¹echny známé
40 polynomiální algoritmy toti¾ místo nejkrat¹í cesty hledají nejkrat¹í sled
41 -- nijak nekontrolují, zda cesta neprojde jedním vrcholem vícekrát.
42
43 Na¹tìstí pro nás je to v~grafech bez cyklù záporné délky toté¾: pokud se
44 v~nalezeném sledu vyskytne cyklus, mù¾eme jej \uv{vystøihnout} a tím získat
45 sled, který není del¹í a~který má ménì hran. Ka¾dý nejkrat¹í sled tak
46 mù¾eme upravit na~stejnì dlouhou cestu.
47 V~grafech bez záporných cyklù je tedy jedno, zda hledáme sled nebo cestu;
48 naopak vyskytne-li se záporný cyklus dosa¾itelný z~poèáteèního vrcholu,
49 nejkrat¹í sled ani neexistuje.
50
51 Navíc se nám bude hodit, ¾e ka¾dý prefix nejkrat¹í cesty je opìt nejkrat¹í
52 cesta. Jinými slovy pokud nìkterá z~nejkrat¹ích cest z~$u$ do~$v$ vede
53 pøes nìjaký vrchol~$w$, pak její èást z~$u$ do~$w$ je jednou z~nejkrat¹ích
54 cest z~$u$ do~$w$. (V~opaèném pøípadì bychom mohli úsek $u\ldots w$ vymìnit za~krat¹í.)
55
56 Díky této {\I prefixové vlastnosti} mù¾eme pro ka¾dý vrchol~$u$ sestrojit jeho {\I strom
57 nejkrat¹ích cest}~${\cal T}(u)$. To je nìjaký podgraf grafu~$G$, který má tvar
58 stromu zakoøenìného v~$u$ a orientovaného smìrem od~koøene, a~platí pro nìj, ¾e
59 pro ka¾dý vrchol~$v$ je (jediná) cesta z~$u$ do~$v$ v~tomto stromu jednou
60 z~nejkrat¹ích cest z~$u$ do~$v$ v~pùvodním grafu.
61
62 \s{Pozorování:} Strom nejkrat¹ích cest v¾dy existuje.
63
64 \proof
65 Nech» $u=v_1,\ldots,v_n$ jsou v¹echny vrcholy grafu~$G$. Indukcí budeme
66 dokazovat, ¾e pro ka¾dé~$i$ existuje strom~${\cal T}_i$, v~nìm¾ se nacházejí nejkrat¹í
67 cesty z~vrcholu~$u$ do vrcholù $v_1,\ldots,v_i$. Pro $i=1$ staèí uvá¾it
68 strom obsahující jediný vrchol~$u$. Ze~stromu ${\cal T}_{i-1}$ pak vyrobíme
69 strom ${\cal T}_i$ takto: Nalezneme v~$G$ nejkrat¹í cestu z~$u$ do~$v_i$
70 a oznaèíme~$z$ poslední vrchol na~této cestì, který se je¹tì vyskytuje v~${\cal T}_{i-1}$.
71 Úsek nejkrat¹í cesty od~$z$ do~$v_i$ pak pøidáme do~${\cal T}_{i-1}$
72 a díky prefixové vlastnosti bude i cesta z~$u$ do~$v_i$ v~novém stromu
73 nejkrat¹í.
74 \qed
75
76 Zbývá se dohodnout, v~jakém tvaru mají na¹e algoritmy vydávat výsledek.
77 U~problémù typu \ppsp{} je nejjednodu¹¹í vypsat celou cestu, u~\sssp{} mù¾eme jako výstup
78 vydat strom nejkrat¹ích cest z~daného poèátku (v¹imnìte si, ¾e staèí
79 uvést pøedchùdce ka¾dého vrcholu), u~\apsp{} vydáme strom nejkrat¹ích cest
80 pro ka¾dý ze~zdrojových vrcholù.
81
82 Èasto se ov¹em uká¾e, ¾e podstatná èást problému se skrývá v~samotném
83 výpoètu vzdáleností a sestrojení pøedchùdcù je triviálním roz¹íøením algoritmu.
84 Budeme tedy obvykle jen poèítat vzdálenosti a samotnou rekonstrukci cest
85 ponecháme ètenáøi jako snadné cvièení.
86
87 \h{Relaxaèní algoritmus}
88
89 Zaènìme problémem \sssp{} a oznaème~$u$ výchozí vrchol. Vìt¹ina známých
90 algoritmù funguje tak, ¾e pro ka¾dý vrchol~$v$ udr¾ují ohodnocení $h(v)$,
91 které v~ka¾dém okam¾iku odpovídá délce nìjakého sledu z~$u$ do~$v$. Postupnì
92 toto ohodnocení upravují, a¾ se z~nìj stane vzdálenost $d(u,v)$ a algoritmus
93 se mù¾e zastavit.
94
95 Vhodnou operací pro vylep¹ování ohodnocení je takzvaná {\I relaxace.}
96 Vybereme si nìjaký vrchol~$v$ a pro v¹echny jeho sousedy~$w$ spoèítáme
97 $h(v) + \ell(v,w)$, tedy délku sledu, který vznikne roz¹íøením aktuálního
98 sledu do~$v$ o~hranu $(v,w)$. Pokud je tato hodnota men¹í ne¾~$h(w)$,
99 tak jí $h(w)$ pøepí¹eme.
100
101 Abychom zabránili opakovaným relaxacím tého¾ vrcholu, které nic nezmìní,
102 budeme rozli¹ovat tøi stavy vrcholù: {\I nevidìn} (je¹tì jsme ho nenav¹tívili),
103 {\I otevøen} (zmìnilo se ohodnocení, èasem chceme relaxovat) a {\I uzavøen}
104 (u¾ jsme relaxovali a není potøeba znovu).
105
106 Ná¹ algoritmus bude fungovat následovnì:
107
108 \algo
109 \:$h(*)\leftarrow \infty$, $h(u)\leftarrow 0$.
110 \:$\<stav>(*)\leftarrow\<nevidìn>$, $\<stav>(u)\leftarrow\<otevøen>$.
111 \:Dokud existují otevøené vrcholy, opakujeme:
112 \::$v\leftarrow\hbox{libovolný otevøený vrchol}$.
113 \::$\<stav>(v)\leftarrow\<uzavøen>$.
114 \::Relaxujeme~$v$:
115 \:::Pro v¹echny hrany $vw$ opakujeme:
116 \::::Je-li $h(w) > h(v) + \ell(v,w)$:
117 \:::::$h(w)\leftarrow h(v) + \ell(v,w)$.
118 \:::::$\<stav>(w)\leftarrow\<otevøen>$.
119 \:Vrátíme výsledek $d(u,v)=h(v)$ pro v¹echna~$v$.
120 \endalgo
121
122 Podobnì jako u~minimálních koster, i zde se jedná o~meta-algoritmus, proto¾e
123 v~kroku~4 nespecifikuje, který z~otevøených vrcholù vybírá. Pøesto
124 ale mù¾eme dokázat nìkolik zajímavých tvrzení, která na~konkrétním zpùsobu
125 výbìru nezávisejí.
126
127 \s{Vìta:} Spustíme-li meta-algoritmus na graf bez záporných cyklù, pak:
128
129 \numlist\nparen
130 \:Ohodnocení $h(v)$ v¾dy odpovídá délce nìjakého sledu z~$u$ do~$v$.
131 \:$h(v)$ dokonce odpovídá délce nìjaké cesty z~$u$ do~$v$.
132 \:Algoritmus se v¾dy zastaví.
133 \:Po zastavení jsou oznaèeny jako uzavøené právì ty vrcholy, které jsou dosa¾itelné z~$u$.
134 \:Po zastavení mají koneèné~$h(v)$ právì v¹echny uzavøené vrcholy.
135 \:Pro ka¾dý dosa¾itelný vrchol je na~konci $h(v)$ rovno $d(u,v)$.
136 \endlist
137
138 \proof
139
140 \numlist\nparen
141 \:Doká¾eme indukcí podle poètu krokù algoritmu.
142 \:Staèí rozmyslet, v~jaké situaci by vytvoøený sled mohl obsahovat cyklus.
143 \:Cest, a~tím pádem i mo¾ných hodnot~$h(v)$ pro ka¾dý~$v$, je koneènì mnoho.
144 \:Implikace $\Rightarrow$ je triviální, pro $\Leftarrow$ staèí uvá¾it neuzavøený vrchol,
145   který je dosa¾itelný z~$u$ cestou o~co nejmen¹ím poètu hran.
146 \:$h(v)$ nastavujeme na~koneènou hodnotu právì v~okam¾icích, kdy se vrchol stává otevøeným.
147   Ka¾dý otevøený vrchol je èasem uzavøen.
148 \:Kdyby tomu tak nebylo,
149   vyberme si ze~\uv{¹patných} vrcholù~$v$ takový, pro nìj¾ obsahuje nejkrat¹í cesta z~$u$ do~$v$
150   nejmen¹í mo¾ný poèet hran. Vrchol~$v$ je zajisté rùzný od~$u$, tak¾e má na~této cestì nìjakého
151   pøedchùdce~$w$. Pøitom~$w$ u¾ musí být ohodnocen správnì a relaxace, která mu toto ohodnocení
152   nastavila, ho musela prohlásit za~otevøený. Jen¾e ka¾dý otevøený vrchol je pozdìji uzavøen,
153   tak¾e~$w$ poté musel být je¹tì alespoò jednou relaxován, co¾ muselo sní¾it~$h(v)$ na správnou
154   vzdálenost.
155 \qeditem
156 \endlist
157
158 \>Dokázali jsme tedy, ¾e meta-algoritmus pro libovolnou implementaci kroku~4
159 spoèítá správné vzdálenosti.
160
161 \medskip
162
163 \s{Cvièení:}
164 \itemize\ibull
165 \:Nech» do algoritmu doplníme udr¾ování pøedchùdcù tak, ¾e v~kroku~9
166   pøenastavíme pøedchùdce vrcholu~$w$ na vrchol~$v$. Doka¾te, ¾e pøedchùdci
167   dosa¾itelných vrcholù budou tvoøit strom a ¾e tento strom bude stromem
168   nejkrat¹ích cest z~vrcholu~$u$.
169 \:Doka¾te, ¾e pro graf, v~nìm¾ je alespoò jeden záporný cyklus dosa¾itelný
170   z~poèáteèního vrcholu, se algoritmus nezastaví a ohodnocení v¹ech vrcholù
171   na cyklu postupnì klesnou libovolnì hluboko. Nedosa¾itelné záporné cykly
172   chod algoritmu samozøejmì nijak neovlivní.
173 \endlist
174
175 \h{Bellmanùv-Fordùv-Mooreùv algoritmus}
176
177 Bellman \cite{bellman:bfm}, Ford \cite{ford:bfm} a Moore objevili nezávisle na sobì algoritmus (øíkejme mu BFM),
178 který lze v~øeèi na¹eho meta-algoritmu formulovat takto: Otevøené vrcholy
179 udr¾ujeme ve~frontì (v¾dy relaxujeme vrchol na poèátku fronty, novì otevírané
180 zaøazujeme na~konec). Co toto pravidlo zpùsobí?
181
182 \s{Vìta:} Èasová slo¾itost algoritmu~BFM èiní $\O(nm)$.
183
184 \proof
185 Bìh algoritmu rozdìlíme na~fáze. Nultá fáze sestává z~vlo¾ení vrcholu~$u$
186 do~fronty. V~$(i+1)$-ní fázi relaxujeme ty vrcholy, které byly do~fronty
187 ulo¾eny bìhem $i$-té fáze.
188
189 Jeliko¾ relaxace vrcholu trvá lineárnì se stupnìm vrcholu a ka¾dý vrchol
190 se dané fáze úèastní nejvý¹e jednou, trvá jedna fáze $\O(m)$. Zbývá ukázat,
191 ¾e fází provedeme nejvý¹e~$n$.
192
193 Indukcí doká¾eme, ¾e na konci $i$-té fáze je ka¾dé ohodnocení $h(v)$ shora omezeno
194 délkou nejkrat¹ího z~$uv$-sledù o~nejvý¹e~$i$ hranách. Pro $i=0$ to triviálnì
195 platí. Uva¾ujme nyní vrchol~$v$ na konci $(i+1)$-ní fáze a nìjaký nejkrat¹í $uv$-sled~$P$
196 o~$i+1$ hranách. Oznaème $wv$ poslední hranu tohoto sledu a $P'$ sled bez této hrany,
197 který tedy má délku~$i$. Podle indukèního pøedpokladu je na konci $i$-té fáze
198 $h(w)\le \ell(P')$. Tuto hodnotu získalo $h(w)$ nejpozdìji v~$i$-té fázi, pøi tom jsme
199 vrchol~$w$ otevøeli, tak¾e jsme ho nejpozdìji v~$(i+1)$-ní fázi zavøeli a relaxovali.
200 Po této relaxaci je ov¹em $h(v)\le h(w)+\ell(w,v)\le \ell(P') + \ell(w,v) = \ell(P)$.
201 \qed
202
203 \s{Cvièení:}
204 \itemize\ibull
205 \:Uka¾te, ¾e asymptoticky stejné èasové slo¾itosti by dosáhl algoritmus,
206   který by vrcholy oèísloval $v_1,\ldots,v_n$ a opakovanì by je v~tomto
207   poøadí relaxoval tak dlouho, dokud by se ohodnocení mìnila.
208 \:Jak algoritmus upravit, aby v~$i$-té fázi spoèítal minimální délky sledù
209   o~právì~$i$ hranách?
210 \:Jak lze algoritmus BFM vyu¾ít k~nalezení záporného cyklu?
211 \endlist
212
213 \h{Dijkstrùv algoritmus}
214
215 Pokud jsou v¹echny délky hran nezáporné, mù¾eme pou¾ít efektivnìj¹í pravidlo
216 pro výbìr vrcholu navr¾ené Dijkstrou \cite{dijkstra:mstandpath}. To øíká, ¾e v¾dy relaxujeme ten z~otevøených
217 vrcholù, jeho¾ ohodnocení je nejmen¹í.
218
219 \s{Vìta:} Dijkstrùv algoritmus uzavírá vrcholy v~poøadí podle neklesající
220 vzdálenosti od~$u$ a ka¾dý dosa¾itelný vrchol uzavøe právì jednou.
221
222 \proof
223 Indukcí doká¾eme, ¾e v~ka¾dém okam¾iku mají v¹echny uzavøené vrcholy ohodnocení
224 men¹í nebo rovné ohodnocením v¹ech otevøených vrcholù. Na~poèátku to jistì platí.
225 Nech» nyní uzavíráme vrchol~$v$ s~minimálním $h(v)$ mezi otevøenými. Bìhem jeho
226 relaxace nemù¾eme ¾ádnou hodnotu sní¾it pod~$h(v)$, jeliko¾ v~grafu s~nezápornými
227 hranami je $h(v) + \ell(v,w) \ge h(v)$. Hodnota zbývajících otevøených vrcholù
228 tedy neklesne pod hodnotu tohoto novì uzavøeného. Hodnoty døíve uzavøených vrcholù
229 se nemohou nijak zmìnit.
230 \qed
231
232 Pøímoèará implementace Dijkstrova algoritmu by tedy poka¾dé v~èase $\O(n)$
233 vybrala otevøený vrchol s~nejmen¹ím ohodnocením, v~èase $\O(n)$ ho relaxovala
234 a toto by se opakovalo nejvý¹e $n$-krát. Algoritmus by tudí¾ dobìhl v~èase $\O(n^2)$,
235 co¾ je pro husté grafy zajisté optimální. Zkusíme nyní zrychlit výpoèet
236 na~øídkých grafech.
237
238 V¹echny relaxace trvají dohromady $\O(\sum_v \deg(v)) = \O(m)$, tak¾e úzkým hrdlem je
239 vybírání minima. Pou¾ijeme pro nìj vhodnou datovou strukturu, v~ní¾ budeme udr¾ovat
240 mno¾inu v¹ech otevøených vrcholù spolu s~jejich ohodnoceními. Od~datové struktury
241 potøebujeme, aby umìla operace \<Insert> (vlo¾ení vrcholu), \<ExtractMin> (nalezení
242 a smazání minima) a \<Decrease> (sní¾ení hodnoty vrcholu). První dvì operace pøitom
243 voláme nejvý¹e $n$-krát a operaci \<Decrease> nejvý¹e $m$-krát. Celý algoritmus
244 tedy dobìhne v~èase
245 $$\O(nT_I(n) + nT_E(n) + mT_D(n)),$$
246 kde $T_I(n)$, $T_E(n)$ a $T_D(n)$ jsou èasové slo¾itosti jednotlivých operací
247 na~struktuøe o~nejvý¹e~$n$ prvcích (staèí amortizovanì).
248
249 \>Jaké mo¾nosti máme pro volbu struktury?
250
251 \itemize\ibull
252 \:{\I pole} -- \<Insert> a \<Decrease> stojí konstantu, \<ExtractMin> trvá $\O(n)$,
253   celkem tedy $\O(n^2)$.
254 \:{\I (binární) halda} -- v¹echny tøi operace umíme provést v~èase $\O(\log n)$, tak¾e celkem
255   $\O(m\log n)$. To je pro husté grafy hor¹í, pro øídké lep¹í.
256 \:{\I $k$-regulární halda} -- pokud haldu upravíme tak, ¾e ka¾dý prvek bude mít a¾ $k$ synù,
257   hloubka haldy klesne na~$\O(\log_k n)$. Operace \uv{vybublávající} prvky smìrem nahoru,
258   co¾ je \<Insert> a \<Decrease>, se zrychlí na~$\O(\log_k n)$. Ov¹em \<ExtractMin> potøebuje
259   zkoumat v¹echny syny ka¾dého nav¹tíveného prvku, tak¾e se zpomalí na $\O(k\log_k n)$.
260
261   Celková slo¾itost tedy vyjde $\O(nk\log_k n + m\log_k n)$. Oba èleny se vyrovnají
262   pro $k=m/n$, èím¾ získáme $\O(m\log_{m/n} n)$. Èlen $\log_{m/n} n$ je pøitom $\O(1)$,
263   kdykoliv je $m\ge n^{1+\varepsilon}$ pro nìjaké~$\varepsilon>0$, tak¾e pro dostateènì
264   husté grafy jsme získali lineární algoritmus.
265
266   (V¹imnìte si, ¾e pro $m\approx n^2$ algoritmus zvolí $k\approx n$, tak¾e halda degeneruje
267   na jediné patro, tedy na pole, které se opravdu ukázalo být optimální volbou pro husté grafy.)
268 \:{\I Fibonacciho halda} \cite{ft:fibonacci} -- \<Insert> a \<Decrease> stojí $\O(1)$, \<ExtractMin> má slo¾itost
269   $\O(\log n)$ [v¹e amortizovanì]. Dijkstrùv algoritmus proto dobìhne v~èase $\O(m + n\log n)$.
270   To je lineární pro grafy s~hustotou $\Omega(\log n)$. Té¾e slo¾itosti operací dosahují
271   i jiné, ménì známé haldy \cite{haeupler:rankph,elmasry:violheap}, které mohou být v~praxi
272   výraznì rychlej¹í.
273 \:{\I Monotónní haldy} -- mù¾eme pou¾ít nìjakou jinou haldu, která vyu¾ívá toho,
274   ¾e posloupnost odebíraných prvkù je neklesající. Pro celá èísla na~\hbox{RAMu} to mù¾e
275   být napøíklad Thorupova halda \cite{thorup:queue} se slo¾itostí $\O(\log\log n)$ u~operace \<ExtractMin>
276   a $\O(1)$ u~ostatních operací. Dijkstra tedy bì¾í v~$\O(m + n\log\log n)$.
277 \:{\I Datové struktury pro omezené universum} -- prozkoumáme vzápìtí.
278 \endlist
279
280 \s{Cvièení:}
281
282 \itemize\ibull
283 \:Najdìte pøíklad grafu se zápornými hranami (ale bez záporných cyklù),
284   na~kterém Dijkstrùv algoritmus sel¾e.
285 \:Rozmyslete si, ¾e pokud nevyu¾ijeme nìjaké speciální vlastnosti èísel (celoèíselnost,
286   omezený rozsah), je mez $\O(m+n\log n)$ nejlep¹í mo¾ná, proto¾e Dijkstrovým algoritmem
287   mù¾eme tøídit $n$-tici èísel. Thorup dokonce dokázal \cite{thorup:equiv}, ¾e z~ka¾dého tøídícího algoritmu
288   se slo¾itostí $\O(nT(n))$ mù¾eme odvodit haldu se slo¾itostí mazání $\O(T(n))$.
289 \:Jsou-li délky hran celoèíselné, mù¾eme se na Dijkstrùv algoritmus dívat i takto:
290   Pøedstavme si, ¾e ka¾dou hranu nahradíme cestou tvoøenou pøíslu¹ným poètem hran jednotkové délky
291   a na vzniklý neohodnocený graf spustíme prohledávání do~¹íøky. To samozøejmì vydá
292   správný výsledek, ale pomìrnì pomalu, proto¾e bude vìt¹inu èasu trávit posouváním
293   vlny \uv{uvnitø} pùvodních hran. Mù¾eme si tedy pro ka¾dou pùvodní hranu naøídit
294   \uv{budík}, který nám øekne, za~kolik posunutí vlny dospìjeme na~její konec.
295   Doka¾te, ¾e tento algoritmus je ekvivalentní s~Dijkstrovým.
296 \endlist
297
298 \h{Celoèíselné délky}
299
300 Uva¾ujme nyní grafy, v~nich¾ jsou v¹echny délky hran nezáporná celá èísla omezená
301 nìjakou konstantou~$L$. V¹echny vzdálenosti jsou tedy omezeny èíslem~$nL$, tak¾e
302 nám staèí datová struktura schopná uchovávat takto omezená celá èísla.
303
304 Pou¾ijeme jednoduchou pøihrádkovou strukturu: pole indexované hodnotami od~0 do~$nL$,
305 jeho $i$-tý prvek bude obsahovat seznam vrcholù, jejich¾ ohodnocení je rovno~$i$.
306 Operace \<Insert> a \<Decrease> zvládneme v~konstantním èase, budeme-li si u~ka¾dého
307 prvku pamatovat jeho polohu v~seznamu. Operace \<ExtractMin> potøebuje najít první
308 neprázdnou pøihrádku, ale jeliko¾ víme, ¾e posloupnost odebíraných minim je monotónní,
309 staèí hledat od místa, kde se hledání zastavilo minule. V¹echna hledání pøihrádek
310 tedy zaberou dohromady $\O(nL)$ a celý Dijkstrùv algoritmus bude trvat $\O(nL + m)$.
311
312 Prostorová slo¾itost $\O(nL+m)$ je nevalná, ale mù¾eme ji jednoduchým trikem
313 sní¾it: V¹imneme si, ¾e v¹echna koneèná ohodnocení vrcholù nemohou být vìt¹í
314 ne¾ aktuální minimum zvìt¹ené o~$L$. Jinými slovy v¹echny neprázdné pøihrádky
315 se nacházejí v~úseku pole dlouhém~$L+1$, tak¾e staèí indexovat modulo~$L+1$.
316 Pouze si musíme dávat pozor, abychom správnì poznali, kdy se struktura
317 vyprázdnila, co¾ zjistíme napøíklad pomocí poèítadla otevøených vrcholù. Èas si
318 asymptoticky nezhor¹íme, prostor klesne na~$\O(L+m)$.
319
320 Podobný trik mù¾eme pou¾ít i pro libovolnou jinou datovou strukturu: rozsah èísel
321 rozdìlíme na~\uv{okna} velikosti~$L$ (v~$i$-tém oknì jsou èísla $iL,iL+1,\ldots,(i+1)L-1$).
322 V~libovolné chvíli mohou tedy být neprázdná nejvý¹e dvì okna. Staèí nám proto
323 poøídit si dvì struktury pro ukládání èísel v~rozsahu $0,\ldots,L-1$ -- jedna
324 z~nich bude reprezentovat aktuální okno (to, v~nìm¾ le¾elo minulé minimum),
325 druhá okno bezprostøednì následující. Minimum ma¾eme z~první struktury; pokud
326 u¾ je prázdná, obì struktury prohodíme. Operace \<Insert> podle hodnoty urèí,
327 do~které struktury se má vkládat. S~operací \<Decrease> je to slo¾itìj¹í --
328 hodnota z~vy¹¹í struktury mù¾e pøeskoèit do té ni¾¹í, ale v~takovém pøípadì
329 ji ve~vy¹¹í struktuøe vyma¾eme (to je \<Decrease> na $-\infty$ následovaný
330 \<ExtractMin>em) a do~té ni¾¹í vlo¾íme. To se ka¾dému prvku mù¾e pøihodit nejvý¹e
331 jednou, tak¾e stále platí, ¾e se ka¾dý prvek úèastní $\O(1)$ vlo¾ení a $\O(1)$
332 extrakcí minima.
333
334 Ukázali jsme tedy, ¾e pro na¹e potøeby postaèuje struktura schopná uchovávání
335 èísel men¹ích nebo rovných~$L$.
336
337 Nabízí se pou¾ít van Emde-Boasùv strom z~kapitoly o~výpoèetních modelech.
338 Ten dosahuje slo¾itosti $\O(\log\log L)$ pro operace \<Insert> a \<ExtractMin>,
339 operaci \<Decrease> musíme pøekládat na \<Delete> a \<Insert>. Celková
340 slo¾itost Dijkstrova algoritmu vyjde $\O(L+m\log\log L)$, pøièem¾ èas~$L$
341 spotøebujeme na inicializaci struktury (té se lze za jistých podmínek vyhnout,
342 viz zmínìná kapitola).
343
344 Vra»me se ale je¹tì k~vyu¾ití pøihrádek\dots
345
346 \h{Víceúrovòové pøihrádky}
347
348 Podobnì jako u~tøídìní èísel, i~zde se vyplácí stavìt pøihrádkové struktury
349 víceúrovòovì (pùvodnì popsáno Goldbergem a Silversteinem \cite{goldberg:mlb}).
350 Jednotlivé hodnoty budeme zapisovat v~soustavì o~základu~$B$,
351 který zvolíme jako nìjakou mocninu dvojky, abychom mohli s~èíslicemi tohoto
352 zápisu snadno zacházet pomocí bitových operací. Ka¾dé èíslo tedy zabere nejvý¹e
353 $d=1+\lfloor\log_B L\rfloor$ èíslic; pokud bude krat¹í, doplníme ho zleva nulami.
354
355 Nejvy¹¹í patro struktury bude tvoøeno polem $B$~pøihrádek, v~$i$-té z~nich
356 budou ulo¾ena ta èísla, jejich¾ èíslice nejvy¹¹ího øádu je rovna~$i$. Za~{\I aktivní}
357 prohlásíme tu pøihrádku, která obsahuje aktuální minimum. Pøihrádky s~men¹ími
358 indexy jsou prázdné a zùstanou takové a¾ do~konce výpoètu, proto¾e halda
359 je monotónní. Pokud v~pøihrádce obsahující minimum bude více prvkù, budeme
360 ji rozkládat podle druhého nejvy¹¹ího øádu na dal¹ích~$B$ pøihrádek atd.
361 Celkem tak vznikne a¾~$d$ úrovní.
362
363 \>Struktura bude obsahovat následující data:
364
365 \itemize\ibull
366 \:Parametry $L$, $B$ a~$d$.
367 \:Pole úrovní (nejvy¹¹í má èíslo~$d-1$, nejni¾¹í~0), ka¾dá úroveò je buïto prázdná
368   (a pak jsou prázdné i~v¹echny ni¾¹í), nebo obsahuje pole~$U_i$ o~$B$ pøihrádkách
369   a v~ka¾dé z~nich seznam prvkù. Pole úrovní pou¾íváme jako zásobník, udr¾ujeme
370   si èíslo nejni¾¹í neprázdné úrovnì.
371 \:Hodnotu~$\mu$ pøedchozího odebraného minima.
372 \endlist
373
374 Operace \<Insert> vlo¾í hodnotu do~nejhlub¹í mo¾né pøihrádky. Podívá se tedy
375 na~nejvy¹¹í úroveò: pokud hodnota patøí do pøihrádky, která není aktivní, vlo¾í
376 ji pøímo. Jinak pøejde o~úroveò ní¾e a zopakuje stejný postup. To v¹e lze provést
377 v~konstantním èase: staèí se podívat, jaký je nejvy¹¹í jednièkový bit ve~{\sc xor}u
378 nové hodnoty s~èíslem~$\mu$ (opìt viz kapitola o~výpoèetních modelech), a tím zjistit
379 èíslo úrovnì, kam hodnota patøí.
380
381 Pokud chceme provést \<Decrease>, odstraníme hodnotu z~pøihrádky, ve~které se
382 právì nachází (polohu si mù¾eme u~ka¾dé hodnoty pamatovat zvlá¹»), a znovu ji
383 vlo¾íme.
384
385 Vìt¹inu práce samozøejmì pøenecháme funkci \<ExtractMin>. Ta zaène prohledávat
386 nejni¾¹í obsazenou úroveò od~aktivní pøihrádky dál (to, která pøihrádka je na
387 které úrovni aktivní, poznáme z~èíslic hodnoty~$\mu$). Pokud pøihrádky na~této
388 úrovni dojdou, prázdnou úroveò zru¹íme a pokraèujeme o~patro vý¹e.
389
390 Jakmile najdeme neprázdnou pøihrádku, nalezneme v~ní minimum a to se stane novým~$\mu$.
391 Pokud v~pøihrádce nebyly ¾ádné dal¹í prvky, skonèíme. V~opaèném pøípadì zbývající
392 prvky rozprostøeme do~pøihrádek na~bezprostøednì ni¾¹í úrovni, kterou tím zalo¾íme.
393
394 Èas strávený hledáním minima mù¾eme rozdìlit na~nìkolik èástí:
395
396 \itemize\ibull
397 \:$\O(B)$ na inicializaci nové úrovnì -- to naúètujeme prvku, který jsme
398   právì mazali;
399 \:hledání neprázdných pøihrádek -- prozkoumání ka¾dé prázdné pøihrádky
400   naúètujeme jejímu vytvoøení, co¾ se rozpustí v~$\O(B)$ na inicializaci
401   úrovnì;
402 \:zru¹ení úrovnì -- opìt naúètujeme jejímu vzniku;
403 \:rozhazování prvkù do pøihrádek -- jeliko¾ prvky v~hierarchii pøihrádek
404   putují bìhem operací pouze doleva a dolù (jejich hodnoty se nikdy nezvìt¹ují),
405   klesne ka¾dý prvek nejvý¹e~$d$-krát, tak¾e staèí, kdy¾ na v¹echna rozhazování
406   pøispìje èasem $\O(d)$.
407 \endlist
408
409 \>Staèí tedy, aby ka¾dý prvek pøi \<Insert>u zaplatil èas $\O(B+d)$ a jak \<Decrease>,
410 tak \<ExtractMin> budou mít konstantní amortizovanou slo¾itost. Dijkstrùv
411 algoritmus pak pobì¾í v~$\O(m + n(B+d))$.
412
413 Zbývá nastavit parametry tak, abychom minimalizovali výraz $B+d = B + \log L/\log B$.
414 Vhodná volba je $B=\log L/\log\log L$. Pøi ní platí
415 $$
416 {\log L\over\log B} = {\log L \over \log\left(\log L/\log\log L\right) }
417 = {\log L\over \log\log L - \log\log\log L} = \Theta(B).
418 $$
419 Tehdy Dijkstra vydá výsledek v~èase $\O(m + n\cdot{\log L\over\log\log L})$.
420
421 \h{HOT Queue -- kombinace pøihrádek s~haldou}
422
423 Cherkassky, Goldberg a Silverstein \cite{cherkassky:hotq} si v¹imli, ¾e ve~víceúrovòových pøihrádkových strukturách
424 platíme pøíli¹ mnoho za~úrovnì, ve~kterých se za~dobu jejich existence objeví jen malé
425 mno¾ství prvkù. Navrhli tedy ukládat prvky z~\uv{malých} úrovní do~spoleèné haldy.
426 Výsledné struktuøe se øíká HOT (Heap-on-Top) Queue. My si pøedvedeme její upravenou
427 variantu (v~té pùvodní se skrývá nìkolik chyb).
428
429 Poøídíme si haldu, øeknìme Fibonacciho, a~navíc ke~ka¾dé úrovni poèítadlo udávající,
430 kolik prvkù z~této úrovnì jsme ulo¾ili do~haldy. Dokud toto poèítadlo nepøeroste nìjaký
431 parametr~$H$, pøihrádky nebudeme zakládat a prvky poputují do~haldy. Èas $\O(B)$ na
432 zalo¾ení úrovnì a její procházení proto mù¾eme rozpoèítat mezi~$H$ prvkù, které se musely
433 na~dané úrovni objevit, ne¾ byla rozpøihrádkována. (Pov¹imnìte si, ¾e poèítadlo nikdy
434 nesni¾ujeme, pouze ho vynulujeme, kdy¾ je úroveò zru¹ena. Proto vùbec nemusí odpovídat
435 skuteènému poètu prvkù z~pøíslu¹né úrovnì, které jsou právì ulo¾eny v~haldì. To ov¹em
436 vùbec nevadí -- poèítadlo pouze hlídá, aby se úroveò nevytvoøila pøíli¹ brzy, tedy abychom
437 mìli dost prvkù k~rozúètování èasu.)
438
439 Promìnnou~$\mu$ necháme ukazovat na~místo, kde jsme se pøi hledání minima v~pøihrádkách
440 zastavili. Souèasné globální minimum struktury mù¾e být ni¾¹í, nachází-li se minimum
441 zrovna v~haldì. Stále je v¹ak zaruèeno, ¾e pøed~$\mu$ se nenachází ¾ádná
442 neprázdná pøihrádka.
443
444 Operace budou fungovat takto:
445
446 \>\<Insert>:
447 \algo
448 \:Spoèítáme, do~které úrovnì~$i$ má prvek padnout (bitovými operacemi).
449 \:Pokud je poèítadlo této úrovnì men¹í ne¾~$H$, zvý¹íme ho, vlo¾íme prvek do~haldy a skoèíme.
450 \:Nebyly-li je¹tì pro tuto úroveò zalo¾eny pøihrádky, vyrobíme prázdné.
451 \:Vlo¾íme prvek do~pøíslu¹né pøihrádky.
452 \endalgo
453
454 \>\<Decrease>:
455 \algo
456 \:Pokud se prvek nachází v~haldì (to si u~ka¾dého prvku pamatujeme), provedeme
457   \<Decrease> v~haldì a skonèíme.
458 \:Sma¾eme prvek z~jeho pøihrádky a provedeme \<Insert> s~novou hodnotou.
459 \endalgo
460
461 \>\<ExtractMin>:
462 \algo
463 \:Dokud je~$\mu$ men¹í ne¾ aktuální minimum haldy, opakujeme:
464 \::Najdeme pøihrádku odpovídající hodnotì~$\mu$.
465 \::Je-li tato pøihrádka prázdná, pøejdeme na~dal¹í (upravíme~$\mu$). Jsme-li na konci úrovnì,
466    zru¹íme ji, vynulujeme její poèítadlo a pokraèujeme o~úroveò vý¹.
467 \::Není-li prázdná, rozprostøeme ji o~úroveò ní¾ (stejným zpùsobem jako pøi \<Insert>u,
468    tak¾e prvních~$H$ prvkù vlo¾íme do~haldy).
469 \:Sma¾eme minimum z~haldy a vrátíme ho jako výsledek.
470 \endalgo
471
472 \>Pustíme se do~analýzy slo¾itosti. Jako parametry si zvolíme poèet hladin~$d$ (tak¾e
473 poèet pøihrádek~$B$ na jedné úrovni je roven $L^{1/d}$) a \uv{haldovou konstantu}~$H$.
474
475 Nejprve si v¹imneme, ¾e ne¾ poèítadlo nìjaké úrovnì vynulujeme, jsou bezpeènì
476 z~haldy pryè v¹echny prvky patøící do~této úrovnì. Celkem se tedy v~haldì
477 vyskytuje nejvý¹e $\O(dH)$ prvkù. \<ExtractMin> v~haldì proto trvá $\O(\log(dH))$,
478 ostatní haldové operace $\O(1)$.
479
480 Nyní rozúètujeme èas operací mezi jednotlivé prvky (opìt si v¹e pøedplatíme
481 v~\<Insert>u a ostatní operace pobì¾í v~amortizovanì konstantním èase):
482
483 \itemize\ibull
484 \:Ka¾dý prvek mù¾e být nejvý¹e jednou za~dobu svého ¾ivota vlo¾en do~haldy
485   a nejvý¹e jednou z~ní vyjmut. Na~obojí dohromady pøispìje $\O(\log dH)$.
486 \:Prvek se úèastní nejvý¹e~$d$ pøehození do~ni¾¹í úrovnì. Pokud byl pøihozen
487   do~haldy, u¾ tam setrvá, jinak poka¾dé zaplatí $\O(1)$ za~zaøazení do~pøihrádky,
488   celkem tedy $\O(d)$ na prvek.
489 \:Vytvoøení, projití a smazání pøihrádek na~jedné úrovni nastane a¾ tehdy, co bylo
490   $H$~prvkù patøících do~této úrovnì vlo¾eno do~haldy. Staèí tedy, aby ka¾dý
491   prvek pøispìl èasem $\O(B/H) = \O(L^{1/d}/H)$.
492 \endlist
493
494 \>Ka¾dý prvek tedy platí $\O(d + \log dH + L^{1/d}/H) = \O(d + \log H + L^{1/d}/H)$.
495 Pojïme najít nastavení parametrù, které tento výraz minimalizuje.
496 Nejprve zvolme~$H$ tak, aby se~$d$ vyrovnalo s~$L^{1/d}/H$. Tedy $H = L^{1/d}/d$.
497 Celý výraz tím zjednodu¹íme na $\O(d + \log\,(L^{1/d}/d))$ =
498 $\O(d + 1/d\cdot\log L - \log d) = \O(d + 1/d\cdot\log L)$. Oba sèítance volbou
499 $d=\sqrt{\log L}$ vyrovnáme.
500
501 HOT Queue tedy zvládne \<Insert> s~amortizovanou èasovou slo¾itostí $\O(\sqrt{\log L})$
502 a ostatní operace v~èase amortizovanì konstantním. Pou¾ijeme-li tuto strukturu
503 v~Dijkstrovì algoritmu, spoète vzdálenosti v~èase $\O(m + n\sqrt{\log L})$.
504
505 \h{Dinicùv algoritmus}
506
507 Zajímavé vylep¹ení Dijkstrova algoritmu navrhl Dinic. V¹iml si, ¾e pokud
508 je ka¾dá hrana dlouhá alespoò~$\delta$, mù¾eme uzavírat nejen
509 vrchol s~minimálním ohodnocením~$\mu$, ale i v¹echny s~ohodnocením
510 men¹ím ne¾ $\mu+\delta$.
511
512 Pro takto upravený Dijkstrùv algoritmus bude stále platit, ¾e pøi uzavírání
513 vrcholu odpovídá ohodnocení skuteèné vzdálenosti, tak¾e uzavøené vrcholy ji¾
514 nejsou znovu otevírány.
515
516 O~monotonii vzdáleností jsme sice pøi¹li, ale v~pøihrádkové struktuøe nebo
517 haldì mù¾eme klíèe nahradit hodnotami $h'(v) := \lfloor h(v)/\delta \rfloor$.
518 Tyto hodnoty se toti¾ chovají monotónnì a vrcholy se stejným $h'(v)$ mù¾eme
519 libovolnì zamìòovat.
520
521 Kteroukoli z~popsaných pøihrádkových struktur mù¾eme tedy pou¾ít, pouze
522 v~rozboru èasové slo¾itosti nahradíme~$L$ výrazem $L/\delta$. Tento pøístup
523 pøitom funguje i pro neceloèíselné délky hran, pouze potøebujeme mít pøedem
524 k~dispozici netriviální dolní odhad na~v¹echny délky.
525
526 \h{Potenciály}
527
528 Vidìli jsme, ¾e v~grafech s~nezápornými délkami hran se nejkrat¹í cesty
529 hledají snáze. Nabízí se nalézt nìjakou transformaci, která by
530 dovedla délky hran upravit tak, aby byly nejkrat¹í cesty zachovány (samozøejmì
531 ne jejich délky, ale alespoò to, které cesty jsou nejkrat¹í). Nabízí se
532 následující fyzikální inspirace:
533
534 \s{Definice:} {\I Potenciál} budeme øíkat libovolné funkci $\psi: V\rightarrow {\bb R}$.
535 Pro ka¾dý potenciál zavedeme {\I redukované délky hran} $\ell_\psi(u,v) := \ell(u,v) + \psi(u) - \psi(v)$.
536 Potenciál nazveme {\I pøípustný,} pokud ¾ádná hrana nemá zápornou redukovanou délku.
537
538 \s{Pozorování:} Pro redukovanou délku libovolné cesty~$P$ z~$u$ do~$v$ platí: $\ell_\psi(P) = \ell(P) + \psi(u) - \psi(v)$.
539
540 \proof
541 Nech» cesta~$P$ prochází pøes vrcholy $u=w_1,\ldots,w_k=v$. Potom:
542 $$
543 \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).
544 $$
545 Tato suma je ov¹em teleskopická, tak¾e z~ní zbude
546 $$
547 \sum_i\ell(w_i,w_{i+1}) + \psi(w_1) - \psi(w_k) = \ell(P) + \psi(u) - \psi(v).
548 $$
549 \vskip-\baselineskip
550 \qed
551
552 \s{Dùsledek:} Potenciálovou redukcí se délky v¹ech cest mezi~$u$ a~$v$
553 zmìní o~tuté¾ konstantu, tak¾e struktura nejkrat¹ích cest zùstane nezmìnìna.
554
555 Zbývá pøijít na~to, kde si obstarat nìjaký pøípustný potenciál. Pøidejme do~grafu
556 nový vrchol~$z$, pøiveïme z~nìj hrany nulové délky do~v¹ech ostatních vrcholù
557 a~oznaème~$\psi(v)$ vzdálenost ze~$z$ do~$v$ v~tomto grafu. Aby byl tento potenciál
558 pøípustný, musí pro ka¾dou hranu $uv$ platit $\ell_\psi(u,v) = \ell(u,v) + \psi(u) - \psi(v) \ge 0$.
559 Tuto nerovnost mù¾eme upravit na $\ell(u,v) + d(z,u) - d(z,v) \ge 0$, èili
560 $d(z,u) + \ell(u,v) \ge d(z,v)$, co¾ je ale obyèejná trojúhelníková nerovnost
561 pro vzdálenost v~grafu, která jistì platí.
562
563 Jedním výpoètem nejkrat¹ích cest v~grafu se zápornými hranami (tøeba algoritmem BFM)
564 tedy doká¾eme spoèítat potenciál, který nám poslou¾í k~redukci v¹ech hran na~nezáporné
565 délky. To nám samozøejmì nepomù¾e, chceme-li jednorázovì hledat nejkrat¹í cestu,
566 ale mù¾e nám to výraznì zjednodu¹it dal¹í, slo¾itìj¹í práci s~grafem. Jak uvidíme
567 v~pøí¹tí kapitole, mù¾eme tak napøíklad nalézt vzdálenosti mezi v¹emi dvojicemi
568 vrcholù v~èase $\O(nm + n^2\log n)$.
569
570 Na~závìr tohoto oddílu doká¾eme jedno pomocné tvrzení o~potenciálech, které
571 nám pomù¾e v~konstrukci algoritmù typu \ppsp:
572
573 \s{Lemma:} Pokud $f$ a~$g$ jsou pøípustné potenciály, pak jsou jimi i:
574 \numlist\ndotted
575 \:konvexní kombinace $f$ a~$g$, tedy $\alpha f + \beta g$ pro libovolné $\alpha,\beta\ge 0, \alpha+\beta=1$;
576 \:$\min(f,g)$;
577 \:$\max(f,g)$.
578 \endlist
579
580 \proof Buï $uv$ hrana. Potom z~definice pøípustnosti platí $\ell(u,v) \ge f(v) - f(u)$ a $\ell(u,v) \ge g(v) - g(u)$.
581 Jednotlivé èásti tvrzení doká¾eme takto:
582 \numlist\ndotted
583 \:Pokud obì strany nerovnosti pro~$f$ vynásobíme konstantou~$\alpha$, u~nerovnosti pro~$g$
584   konstantou~$\beta$ a obì nerovnosti seèteme, dostaneme:
585   $$
586   (\alpha+\beta) \cdot \ell(u,v) \ge (\alpha f(v) + \beta g(v)) - (\alpha f(u) + \beta g(u)),
587   $$
588   co¾ je pøesnì po¾adovaná nerovnost pro pøípustnost funkce $\alpha f+\beta g$.
589 \:Oznaème $h := \min(f,g)$. Nech» bez újmy na obecnosti $f(u)\le g(u)$. Pokud také platí $f(v)\le g(v)$,
590   shoduje se minimum s~funkcí~$f$ a není co dokazovat. V~opaèném pøípadì je $h(u) = f(u)$, $h(v) = g(v)$.
591   Tehdy si staèí v¹imnout, ¾e $h(v) - h(u) = g(v) - f(u) < f(v) - f(u) \le \ell(u,v)$, tak¾e
592   potenciál~$h$ je pøípustný.
593 \:Doká¾eme analogicky.
594 \qeditem
595 \endlist
596
597 \h{Algoritmy pro problém typu \ppsp}
598
599 Zamìøme se nyní na~pøípad, kdy chceme hledat nejkrat¹í cesty mezi zadanou dvojicí
600 vrcholù $s$,~$t$. Obvykle se i v~této situaci pou¾ívají algoritmy \sssp{} (SSSP) a v~obecném
601 pøípadì ani není efektivnìj¹í øe¹ení známo. Existuje ov¹em velké mno¾ství heuristik, kterými
602 lze obvykle výpoèet zrychlit. Nìkteré z~nich si pøedvedeme na Dijkstrovì algoritmu.
603
604 Dijkstrùv algoritmus ve~své klasické podobì neví vùbec nic o~cílovém vrcholu a
605 prohledá celý graf. Hned se nabízí vyu¾ít toho, ¾e od~okam¾iku uzavøení
606 kteréhokoliv vrcholu se ji¾ jeho ohodnocení nezmìní. Pokud tedy uzavøeme cílový
607 vrchol, mù¾eme se zastavit.
608
609 Jakou èást grafu prohledáváme teï? V~metrice dané vzdálenostmi v~grafu je to nejmen¹í
610 koule se støedem ve~vrcholu~$u$, která obsahuje nejkrat¹í cestu (dobøe se to
611 pøedstavuje na~hledání v~silnièní síti na~rovinné mapì).
612
613 Také mù¾eme spustit prohledávání z~obou koncù zároveò, tedy zkombinovat hledání
614 od~$s$ v~pùvodním grafu s~hledáním od~$t$ v~grafu s~obrácenou orientací hran.
615 Oba postupy mù¾eme libovolnì støídat a zastavíme se v~okam¾iku, kdy jsme jeden
616 vrchol uzavøeli v~obou smìrech. Pozor ov¹em na to, ¾e souèet obou ohodnocení
617 tohoto vrcholu nemusí být roven $d(v,u)$ -- zkuste vymyslet protipøíklad.
618 Nejkrat¹í cesta je¹tì mù¾e vypadat tak, ¾e pøechází po nìjaké hranì mezi vrcholem
619 uzavøeným v~jednom smìru a vrcholem uzavøeným ve~smìru druhém (ponechme bez dùkazu).
620 Staèí tedy bìhem relaxace zjistit, zda je konec hrany uzavøený v~opaèném
621 smìru prohledávání, a~pokud ano, zapoèítat cestu do~prùbì¾ného minima.
622
623 Obousmìrný Dijkstrùv algoritmus projde sjednocení nìjaké koule okolo~$s$ s~nìjakou
624 koulí okolo~$t$, které obsahuje nejkrat¹í cestu. Prùmìry koulí pøitom závisí na tom,
625 jak budeme bìhem výpoètu støídat oba smìry prohledávání. V~nejhor¹ím pøípadì samozøejmì
626 mù¾eme prohledat celý graf.
627
628 \h{Algoritmus \astar}
629
630 V~umìlé inteligenci se èasto pro hledání nejkrat¹í cesty v~rozsáhlých grafech
631 (obvykle stavových prostorech úloh) pou¾ívá algoritmus nazývaný~\astar{} \cite{hart:astar}.
632 Jedná se o~modifikaci Dijkstrova algoritmu, která vyu¾ívá heuristickou funkci
633 pro dolní odhad vzdálenosti do~cíle; oznaème si ji $\psi(v)$. V~ka¾dém kroku pak uzavíra
634 vrchol~$v$ s~nejmen¹ím mo¾ným souètem $h(v)+\psi(v)$ aktuálního ohodnocení s~heuristikou.
635
636 Intuice za tímto algoritmem je jasná: pokud víme, ¾e nìjaký vrchol je blízko
637 od~poèátaèního vrcholu~$s$, ale bude z~nìj urèitì daleko do cíle~$t$, zatím ho
638 odlo¾íme a budeme zkoumat nadìjnìj¹í varianty.
639
640 Heuristika se pøitom volí podle konkrétního problému -- napø. hledáme-li cestu
641 v~mapì, mù¾eme pou¾ít vzdálenost do~cíle vzdu¹nou èarou.
642
643 Je u~tohoto algoritmu zaruèeno, ¾e v¾dy najde nejkrat¹í cestu? Na to nám dá odpovìï
644 teorie potenciálù:
645
646 \s{Vìta:} Bìh algoritmu \astar{} odpovídá prùbìhu Dijkstrova algoritmu
647 na~grafu redukovaném potenciálem~$-\psi$. Pøesnìji,
648 pokud oznaèíme $h^*$ aktuální ohodnocení v~\astar{} a $h$ aktuální ohodnocení
649 v~synchronnì bì¾ícím Dijkstrovi, bude v¾dy platit $h(v) = h^*(v) - \psi(s) + \psi(v)$.
650
651 \proof
652 Indukcí podle doby bìhu obou algoritmù. Na poèátku je $h^*(s)$ i $h(s)$ nulové
653 a v¹echna ostatní $h^*$ a~$h$ jsou nekoneèná, tak¾e tvrzení platí. V~ka¾dém dal¹ím
654 kroku \astar{} vybere vrchol~$v$ s~nejmen¹ím $h^*(v) + \psi(v)$, co¾ je tentý¾ vrchol,
655 který vybere Dijkstra ($\psi(s)$ je stále stejné).
656
657 Uva¾ujme, co se stane bìhem relaxace hrany $vw$: Dijkstra se pokusí sní¾it ohodnocení $h(w)$
658 o~$\delta = h(w) - h(v) - \ell_{-\psi}(v,w)$ a provede to, pokud $\delta>0$. Uká¾eme,
659 ¾e \astar{} udìlá toté¾:
660 $$\eqalign{
661 \delta &= (h^*(w) - \psi(s) + \psi(w)) - (h^*(v) - \psi(s) + \psi(v)) - (\ell(v,w) - \psi(v) + \psi(w)) \cr
662 &= h^*(w) - \psi(s) + \psi(w) - h^*(v) + \psi(s) - \psi(v) - \ell(v,w) + \psi(v) - \psi(w) \cr
663 &= h^*(w) - h^*(v) - \ell(v,w).
664 }$$
665 Oba algoritmy tedy a¾ na~posunutí dané potenciálem poèítají toté¾.
666 \qed
667
668 \s{Dùsledek:} Algoritmus \astar{} funguje jen tehdy, je-li potenciál $-\psi$ pøípustný.
669
670 Napøíklad pro rovinnou mapu to heuristika daná euklidovskou vzdáleností~$\varrho$, tedy $\psi(v) := \varrho(v,t)$, splòuje:
671 Pøípustnost po¾aduje pro ka¾dou hranu $uv$ nerovnost
672 $\ell(u,v) - \psi(v) + \psi(u) \ge 0$,
673 tedy $\ell(u,v) - \varrho(v,t) + \varrho(u,t) \ge 0$.
674 Jeliko¾ $\ell(u,v) \ge \varrho(u,v)$,
675 staèí dokázat, ¾e $\varrho(u,v) - \varrho(v,t) + \varrho(u,t) \ge 0$,
676 co¾ je ov¹em trojúhelníková nerovnost pro metriku~$\varrho$.
677
678 \references
679 \bye