]> mj.ucw.cz Git - ga.git/blob - 13-dijkstra/13-dijkstra.tex
Haldove operaci pro mazani minima rikejme ExtractMin, ne DeleteMin
[ga.git] / 13-dijkstra / 13-dijkstra.tex
1 \input ../sgr.tex
2
3 \prednaska{13}{Nejkrat¹í cesty: relaxaèní metody}{}
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.
131 \:$h(v)$ dokonce odpovídá délce nìjaké cesty.
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 je $\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 V¹imneme si, ¾e na~konci $i$-té fáze je ka¾dé ohodnocení $h(v)$ shora omezeno
190 délkou nejkrat¹ího ze~sledù z~$u$ do~$v$, které mají nejvý¹e~$i$ hran. Fází je
191 tedy nejvý¹e~$n$.
192
193 Relaxace ka¾dého vrcholu pøitom trvá lineárnì se stupnìm vrcholu, tak¾e celá
194 fáze probìhne v~èase $\O(m)$. V¹echny fáze pak v~$\O(nm)$.
195 \qed
196
197 \s{Cvièení:}
198 \itemize\ibull
199 \:Uka¾te, ¾e asymptoticky stejné èasové slo¾itosti by dosáhl algoritmus,
200   který by vrcholy oèísloval $v_1,\ldots,v_n$ a opakovanì by je v~tomto
201   poøadí relaxoval tak dlouho, dokud by se ohodnocení mìnila.
202 \:Jak algoritmus upravit, aby v~$i$-té fázi spoèítal minimální délky sledù
203   o~právì~$i$ hranách?
204 \:Jak lze algoritmus BFM vyu¾ít k~nalezení záporného cyklu?
205 \endlist
206
207 \h{Dijkstrùv algoritmus}
208
209 Pokud jsou v¹echny délky hran nezáporné, mù¾eme pou¾ít efektivnìj¹í pravidlo
210 pro výbìr vrcholu navr¾ené Dijkstrou \cite{dijkstra:mstandpath}. To øíká, ¾e v¾dy relaxujeme ten z~otevøených
211 vrcholù, jeho¾ ohodnocení je nejmen¹í.
212
213 \s{Vìta:} Dijkstrùv algoritmus uzavírá vrcholy v~poøadí podle neklesající
214 vzdálenosti od~$u$ a ka¾dý dosa¾itelný vrchol uzavøe právì jednou.
215
216 \proof
217 Indukcí doká¾eme, ¾e v~ka¾dém okam¾iku mají v¹echny uzavøené vrcholy ohodnocení
218 men¹í nebo rovné ohodnocením v¹ech otevøených vrcholù. Na~poèátku to jistì platí.
219 Nech» nyní uzavíráme vrchol~$v$ s~minimálním $h(v)$ mezi otevøenými. Bìhem jeho
220 relaxace nemù¾eme ¾ádnou hodnotu sní¾it pod~$h(v)$, jeliko¾ v~grafu s~nezápornými
221 hranami je $h(v) + \ell(v,w) \ge h(v)$. Hodnota zbývajících otevøených vrcholù
222 tedy neklesne pod hodnotu tohoto novì uzavøeného. Hodnoty døíve uzavøených vrcholù
223 se nemohou nijak zmìnit.
224 \qed
225
226 Pøímoèará implementace Dijkstrova algoritmu by tedy poka¾dé v~èase $\O(n)$
227 vybrala otevøený vrchol s~nejmen¹ím ohodnocením, v~èase $\O(n)$ ho relaxovala
228 a toto by se opakovalo nejvý¹e $n$-krát. Algoritmus by tedy dobìhl v~èase $\O(n^2)$,
229 co¾ je pro husté grafy zajisté optimální. Zkusíme tedy algoritmus zrychlit
230 na~øídkých grafech.
231
232 V¹echny relaxace trvají dohromady $\O(\sum_v \deg(v)) = \O(m)$, tak¾e úzkým hrdlem je
233 vybírání minima. Pou¾ijeme tedy vhodnou datovou strukturu, v~ní¾ budeme udr¾ovat
234 mno¾inu v¹ech otevøených vrcholù spolu s~jejich ohodnoceními. Od~datové struktury
235 potøebujeme, aby umìla operace \<Insert> (vlo¾ení vrcholu), \<ExtractMin> (nalezení
236 a smazání minima) a \<Decrease> (sní¾ení hodnoty vrcholu). První dvì operace pøitom
237 voláme nejvý¹e $n$-krát a operaci \<Decrease> nejvý¹e $m$-krát. Celý algoritmus
238 tedy dobìhne v~èase
239 $$\O(nT_I(n) + nT_E(n) + mT_D(n)),$$
240 kde $T_I(n)$, $T_E(n)$ a $T_D(n)$ jsou èasové slo¾itosti jednotlivých operací
241 na~struktuøe o~nejvý¹e~$n$ prvcích (staèí amortizovanì).
242
243 \>Jaké mo¾nosti máme pro volbu struktury?
244
245 \itemize\ibull
246 \:{\I pole} -- \<Insert> a \<Decrease> stojí konstantu, \<ExtractMin> trvá $\O(n)$,
247   celkem tedy $\O(n^2)$.
248 \:{\I (binární) halda} -- v¹echny tøi operace umíme provést v~èase $\O(\log n)$, tak¾e celkem
249   $\O(m\log n)$. To je pro husté grafy hor¹í, pro øídké lep¹í.
250 \:{\I $k$-regulární halda} -- pokud haldu upravíme tak, ¾e ka¾dý vrchol bude mít a¾ $k$ synù,
251   hloubka haldy klesne na~$\O(\log_k n)$. Operace \uv{vybublávající} prvky smìrem nahoru,
252   co¾ je \<Insert> a \<Decrease>, se zrychlí na~$\O(\log_k n)$. Ov¹em \<ExtractMin> potøebuje
253   zkoumat v¹echny syny ka¾dého nav¹tíveného prvku, tak¾e se zpomalí na $\O(k\log_k n)$.
254
255   Celková slo¾itost tedy vyjde $\O(nk\log_k n + m\log_k n)$. Oba èleny se vyrovnají
256   pro $k=m/n$, èím¾ získáme $\O(m\log_{m/n} n)$. Tento logaritmus je pøitom $\O(1)$,
257   kdykoliv je $m\ge n^{1+\varepsilon}$ pro nìjaké~$\varepsilon>0$, tak¾e pro dostateènì
258   husté grafy je algoritmus lineární.
259
260   (V¹imnìte si, ¾e pro $m\approx n^2$ algoritmus zvolí $k\approx n$, tak¾e halda degeneruje
261   na jediné patro, tedy na pole, které se opravdu ukázalo jako optimální volba pro husté grafy.)
262 \:{\I Fibonacciho halda} -- \<Insert> a \<Decrease> stojí $\O(1)$, \<ExtractMin> má slo¾itost
263   $\O(\log n)$ [v¹e amortizovanì]. Dijkstrùv algoritmus tedy dobìhne v~èase $\O(m + n\log n)$.
264   To je lineární pro grafy s~hustotou $\Omega(\log n)$.
265 \:{\I Monotónní haldy} -- mù¾eme pou¾ít nìjakou jinou haldu, která vyu¾ívá toho,
266   ¾e posloupnost odebíraných prvkù neklesající. Pro celá èísla na~\hbox{RAMu} to mù¾e
267   být napøíklad Thorupova halda \cite{thorup:queue} se slo¾itostí $\O(\log\log n)$ u~operace \<ExtractMin>
268   a $\O(1)$ u~ostatních operací. Dijkstra tedy bì¾í v~$\O(m + n\log\log n)$.
269 \:{\I Datové struktury pro omezené universum} -- prozkoumáme vzápìtí.
270 \endlist
271
272 \s{Cvièení:}
273
274 \itemize\ibull
275 \:Najdìte pøíklad nìjakého grafu se zápornými hranami (ale bez záporných cyklù),
276   na~kterém Dijkstrùv algoritmus sel¾e.
277 \:Rozmyslete si, ¾e pokud nevyu¾ijeme nìjaké speciální vlastnosti èísel (celoèíselnost,
278   omezený rozsah), je mez $\O(m+n\log n)$ nejlep¹í mo¾ná, proto¾e Dijkstrovým algoritmem
279   mù¾eme tøídit $n$-tici èísel. Thorup dokonce dokázal \cite{thorup:equiv}, ¾e z~ka¾dého tøídícího algoritmu
280   se slo¾itostí $nT(n)$ mù¾eme odvodit haldu se slo¾itostí mazání $\O(T(n))$.
281 \:Jsou-li délky hran celoèíselné, mù¾eme se na Dijkstrùv algoritmus dívat i takto:
282   Pøedstavme si, ¾e ka¾dou hranu nahradíme cestou tvoøenou hranami jednotkové délky
283   a na vzniklý neohodnocený graf spustíme prohledávání do~¹íøky. To samozøejmì vydá
284   správný výsledek, ale pomìrnì pomalu, proto¾e bude vìt¹inu èasu trávit posouváním
285   vlny \uv{uvnitø} pùvodních hran. Mù¾eme si tedy pro ka¾dou pùvodní hranu naøídit
286   \uv{budík}, který nám øekne, za~kolik posunutí vlny dospìjeme na~její konec.
287   Doka¾te, ¾e tento algoritmus je ekvivalentní s~Dijkstrovým.
288 \endlist
289
290 \h{Celoèíselné délky}
291
292 Uva¾ujme nyní grafy, v~nich¾ jsou v¹echny délky hran nezáporná celá èísla omezená
293 nìjakou konstantou~$L$. V¹echny vzdálenosti jsou tedy omezeny èíslem~$nL$, tak¾e
294 nám staèí datová struktura schopná uchovávat takto omezená celá èísla.
295
296 Pou¾ijeme jednoduchou pøihrádkovou strukturu: pole indexované hodnotami od~0 do~$nL$,
297 jeho $i$-tý prvek bude obsahovat seznam vrcholù, jejich¾ ohodnocení je rovno~$i$.
298 Operace \<Insert> a \<Decrease> zvládneme v~konstantním èase, budeme-li si u~ka¾dého
299 prvku pamatovat jeho polohu v~seznamu. Operace \<ExtractMin> potøebuje najít první
300 neprázdnou pøihrádku, ale jeliko¾ víme, ¾e posloupnost odebíraných minim je monotónní,
301 staèí hledat od místa, kde se hledání zastavilo minule. V¹echna hledání pøihrádek
302 tedy zaberou dohromady $\O(nL)$ a celý Dijkstrùv algoritmus bude trvat $\O(nL + m)$.
303
304 Prostorová slo¾itost $\O(nL+m)$ je nevalná, ale mù¾eme ji jednoduchým trikem
305 sní¾it: V¹imneme si, ¾e v¹echna koneèná ohodnocení vrcholù nemohou být vìt¹í
306 ne¾ aktuální minimum zvìt¹ené o~$L$. Jinými slovy v¹echny neprázdné pøihrádky
307 se nacházejí v~úseku pole dlouhém~$L+1$, tak¾e staèí indexovat modulo~$L+1$.
308 Pouze si musíme dávat pozor, abychom správnì poznali, kdy se struktura
309 vyprázdnila, co¾ zjistíme napøíklad pomocí poèítadla otevøených vrcholù. Èas si
310 asymptoticky nezhor¹íme, prostor klesne na~$\O(L+m)$.
311
312 Podobný trik mù¾eme pou¾ít i pro libovolnou jinou datovou strukturu: rozsah èísel
313 rozdìlíme na~\uv{okna} velikosti~$L$ (v~$i$-tém oknì jsou èísla $Li,\ldots,L(i+1)-1$).
314 V~libovolné chvíli mohou tedy být neprázdná nejvý¹e dvì okna. Staèí nám proto
315 poøídit si dvì struktury pro ukládání èísel v~rozsahu $0,\ldots,L-1$ -- jedna
316 z~nich bude reprezentovat aktuální okno (to, v~nìm¾ le¾elo minulé minimum),
317 druhá okno bezprostøednì následující. Minimum ma¾eme z~první struktury; pokud
318 u¾ je prázdná, obì struktury prohodíme. Operace \<Insert> podle hodnoty urèí,
319 do~které struktury se má vkládat. S~operací \<Decrease> je to slo¾itìj¹í --
320 hodnota z~vy¹¹í struktury mù¾e pøeskoèit do té ni¾¹í, ale v~takovém pøípadì
321 ji ve~vy¹¹í struktuøe vyma¾eme (to je \<Decrease> na $-\infty$ následovaný
322 \<ExtractMin>em) a do~ni¾¹í vlo¾íme. To se ka¾dému prvku mù¾e pøihodit nejvý¹e
323 jednou, tak¾e stále platí, ¾e se ka¾dý prvek úèastní $\O(1)$ vlo¾ení a $\O(1)$
324 extrakcí minima.
325
326 Ukázali jsme tedy, ¾e pro na¹e potøeby postaèuje struktura schopná uchovávání
327 èísel men¹ích nebo rovných~$L$.
328
329 Nabízí se pou¾ít van Emde-Boasùv strom z~kapitoly o~výpoèetních modelech.
330 Ten dosahuje slo¾itosti $\O(\log\log L)$ pro operace \<Insert> a \<ExtractMin>,
331 operaci \<Decrease> musíme pøekládat na \<Delete> a \<Insert>. Celková
332 slo¾itost Dijkstrova algoritmu vyjde $\O(L+m\log\log L)$, pøièem¾ èas~$L$
333 spotøebujeme na inicializaci struktury (té se lze za jistých podmínek vyhnout,
334 viz zmínìná kapitola).
335
336 Vra»me se ale je¹tì k~vyu¾ití pøihrádek\dots
337
338 \h{Víceúrovòové pøihrádky}
339
340 Podobnì jako u~tøídìní èísel, i~zde se vyplácí stavìt pøihrádkové struktury
341 víceúrovòovì. Jednotlivé hodnoty budeme zapisovat v~soustavì o~základu~$B$,
342 který zvolíme jako nìjakou mocnina dvojky, abychom mohli s~èíslicemi tohoto
343 zápisu snadno zacházet pomocí bitových operací. Ka¾dé èíslo tedy zabere nejvý¹e
344 $d=1+\lfloor\log_B L\rfloor$ èíslic; pokud bude krat¹í, doplníme ho zleva nulami.
345
346 Nejvy¹¹í patro struktury bude tvoøeno polem $B$~pøihrádek, v~$i$-té z~nich
347 budou ulo¾ena ta èísla, jejich¾ nejvy¹¹í øád je roven~$i$. Za~{\I aktivní}
348 prohlásíme tu pøihrádku, která obsahuje aktuální minimum. Pøihrádky s~men¹ími
349 indexy jsou prázdné a zùstanou takové a¾ do~konce výpoètu, proto¾e halda
350 je monotónní. Pokud v~pøihrádce obsahující minimum bude více prvkù, budeme
351 ji rozkládat podle druhého nejvy¹¹ího øádu na dal¹ích~$B$ pøihrádek atd.
352 Celkem tak vznikne a¾~$d$ úrovní.
353
354 \>Struktura bude obsahovat následující data:
355
356 \itemize\ibull
357 \:Parametry $L$, $B$ a~$d$.
358 \:Pole úrovní (nejvy¹¹í má èíslo~$d-1$, nejni¾¹í~0), ka¾dá úroveò je buïto prázdná
359   (a pak jsou prázdné i~v¹echny ni¾¹í), nebo obsahuje pole~$U_i$ o~$B$ pøihrádkách,
360   z~nich¾ ka¾dá obsahuje seznam prvkù. Toto pole pou¾íváme jako zásobník, udr¾ujeme
361   si èíslo nejni¾¹í neprázdné úrovnì.
362 \:Hodnotu~$\mu$ pøedchozího odebraného minima.
363 \endlist
364
365 Operace \<Insert> vlo¾í hodnotu do~nejhlub¹í mo¾né pøihrádky. Podívá se tedy
366 na~nejvy¹¹í úroveò: pokud hodnota patøí do pøihrádky, která není aktivní, vlo¾í
367 ji pøímo. Jinak pøejde o~úroveò ní¾e a zopakuje stejný postup. To v¹e lze provést
368 v~konstantním èase: staèí se podívat, jaký je nejvy¹¹í jednièkový bit ve~{\sc xor}u
369 nové hodnoty s~èíslem~$\mu$ (opìt viz kapitola o~výpoèetních modelech).
370
371 Pokud chceme provést \<Decrease>, odstraníme hodnotu z~pøihrádky, ve~které se
372 právì nachází (polohu si mù¾eme u~ka¾dé hodnoty pamatovat zvlá¹»), a znovu ji
373 vlo¾íme.
374
375 Vìt¹inu práce samozøejmì pøenecháme funkci \<ExtractMin>. Ta zaène prohledávat
376 nejni¾¹í obsazenou úroveò od~aktivní pøihrádky dál (to, která pøihrádka je na
377 které úrovni aktivní, poznáme z~èíslic hodnoty~$\mu$). Pokud pøihrádky na~této
378 úrovni dojdou, prázdnou úroveò zru¹í a pokraèuje o~patro vý¹e.
379
380 Jakmile najde neprázdnou pøihrádku, nalezne v~ní minimum a to se stane novým~$\mu$.
381 Pokud v~pøihrádce nebyly ¾ádné dal¹í prvky, skonèí. Jinak zbývající prvky
382 rozprostøe do~pøihrádek na~bezprostøednì ni¾¹í úrovni, kterou tím zalo¾í.
383
384 Èas strávený hledáním minima mù¾eme rozdìlit na~nìkolik èástí:
385
386 \itemize\ibull
387 \:$\O(B)$ na inicializaci nové úrovnì -- to naúètujeme prvku, který jsme
388   právì mazali;
389 \:hledání neprázdných pøihrádek -- prozkoumání ka¾dé prázdné pøihrádky
390   naúètujeme jejímu vytvoøení, co¾ se rozpustí v~$\O(B)$ na inicializaci
391   úrovnì;
392 \:zru¹ení úrovnì -- opìt naúètujeme jejímu vzniku;
393 \:rozhazování prvkù do pøihrádek -- jeliko¾ prvky v~hierarchii pøihrádek
394   putují bìhem operací pouze doleva a dolù (jejich hodnoty se nikdy nezvìt¹ují),
395   klesne ka¾dý prvek nejvý¹e~$d$-krát, tak¾e staèí, kdy¾ na v¹echna rozhazování
396   pøispìje èasem $\O(d)$.
397 \endlist
398
399 \>Staèí tedy, aby ka¾dý prvek pøi \<Insert>u zaplatil èas $\O(B+d)$ a jak \<Decrease>,
400 tak \<ExtractMin> pak budou mít konstantní amortizovanou slo¾itost. Dijkstrùv
401 algoritmus pak pobì¾í v~$\O(m + n(B+d))$.
402
403 Zbývá nastavit parametry tak, abychom minimalizovali výraz $B+d = B + \log L/\log B$.
404 Vhodná volba je $B=\log L/\log\log L$. Pøi ní platí
405 $$
406 {\log L\over\log B} = {\log L \over \log\left(\log L/\log\log L\right) }
407 = {\log L\over \log\log L - \log\log\log L} = \Theta(B).
408 $$
409 Tehdy Dijkstra vydá výsledek v~èase $\O(m + n\cdot{\log L\over\log\log L})$.
410
411 \h{HOT Queue -- kombinace pøihrádek s~haldou}
412
413 Cherkassky, Goldberg a Silverstein \cite{cherkassky:hotq} si v¹imli, ¾e ve~víceúrovòových pøihrádkových strukturách
414 platíme pøíli¹ mnoho za~úrovnì, ve~kterých se za~dobu jejich existence objeví jen malé
415 mno¾ství prvkù. Navrhli tedy ukládat prvky z~\uv{malých} úrovní do~spoleèné haldy.
416 Výsledné struktuøe se øíká HOT (Heap-on-Top) Queue. My si pøedvedeme její upravenou
417 variantu (v~té pùvodní se skrývá nìkolik chyb).
418
419 Poøídíme si haldu, øeknìme Fibonacciho, a~navíc ke~ka¾dé úrovni poèítadlo udávající,
420 kolik prvkù z~této úrovnì jsme ulo¾ili do~haldy. Dokud toto poèítadlo nepøeroste nìjaký
421 parametr~$H$, pøihrádky nebudeme zakládat a prvky poputují do~haldy. Èas $\O(B)$ na
422 zalo¾ení úrovnì a její procházení tedy mù¾eme rozpoèítat mezi~$H$ prvkù, které se musely
423 na~dané úrovni objevit, ne¾ byla rozpøihrádkována. (Pov¹imnìte si, ¾e poèítadlo nikdy
424 nesni¾ujeme, pouze ho vynulujeme, kdy¾ je úroveò zru¹ena, tak¾e vùbec nemusí odpovídat
425 skuteènému poètu prvkù z~pøíslu¹né úrovnì, které jsou právì ulo¾eny v~haldì. To ov¹em
426 vùbec nevadí -- poèítadlo pouze hlídá, aby se úroveò nevytvoøila pøíli¹ brzy a abychom
427 mìli dost prvkù k~rozúètování èasu.)
428
429 Promìnnou~$\mu$ necháme ukazovat na~místo, kde jsme se pøi hledání minima v~pøihrádkách
430 zastavili. Souèasné globální minimum struktury tedy mù¾e být ni¾¹í, kdy¾ se minimum
431 zrovna nachází v~haldì, ale stále je zaruèeno, ¾e pøed~$\mu$ se ji¾ nenachází ¾ádná
432 neprázdná pøihrádka.
433
434 Operace budou fungovat takto:
435
436 \>\<Insert>:
437 \algo
438 \:Spoèítáme, do~které úrovnì~$i$ má prvek padnout.
439 \:Pokud je poèítadlo této úrovnì men¹í ne¾~$K$, zvý¹íme ho, vlo¾íme prvek do~haldy a skoèíme.
440 \:Nebyly-li je¹tì pro tuto úroveò zalo¾eny pøihrádky, vyrobíme je (prázdné).
441 \:Vlo¾íme prvek do~pøíslu¹né pøihrádky.
442 \endalgo
443
444 \>\<Decrease>:
445 \algo
446 \:Pokud se prvek nachází v~haldì (to si u~ka¾dého prvku pamatujeme), provedeme
447   \<Decrease> v~haldì a skonèíme.
448 \:Sma¾eme prvek z~jeho pøihrádky a provedeme \<Insert> s~novou hodnotou.
449 \endalgo
450
451 \>\<ExtractMin>:
452 \algo
453 \:Dokud je~$\mu$ men¹í ne¾ aktuální minimum haldy, opakujeme:
454 \::Najdeme pøihrádku odpovídající hodnotì~$\mu$.
455 \::Je-li tato pøihrádka prázdná, pøejdeme na~dal¹í (upravíme~$\mu$). Jsme-li na konci úrovnì, pak o~úroveò vý¹.
456 \::Rozprostøeme tuto pøihrádku o~úroveò ní¾ (stejným zpùsobem, jako pøi \<Insert>u,
457    tak¾e prvních~$H$ prvkù vlo¾íme do~haldy).
458 \:Sma¾eme minimum z~haldy a vrátíme ho jako výsledek.
459 \endalgo
460
461 \>Pustíme se do~analýzy slo¾itosti. Jako parametry si zvolíme poèet hladin~$d$ (tak¾e
462 poèet pøihrádek~$B$ na jedné úrovni je roven $L^{1/d}$) a \uv{haldovou konstantu}~$H$.
463
464 Nejprve si v¹imneme, ¾e ne¾ poèítadlo nìjaké úrovnì vynulujeme, jsou bezpeènì
465 z~haldy pryè v¹echny prvky patøící do~této úrovnì. Celkem se tedy v~haldì
466 vyskytuje nejvý¹e $\O(dH)$ prvkù. \<ExtractMin> v~haldì tedy trvá $\O(\log(dH))$,
467 ostatní haldové operace $\O(1)$.
468
469 Nyní rozúètujeme èas operací mezi jednotlivé prvky (opìt si v¹e pøedplatíme
470 v~\<Insert>u a ostatní operace pobì¾í v~amortizovanì konstantním èase):
471
472 \itemize\ibull
473 \:Ka¾dý prvek mù¾e být nejvý¹e jednou za~dobu svého ¾ivota vlo¾en do~haldy
474   a nejvý¹e jednou z~ní vyjmut. Na~obojí dohromady pøispìje $\O(\log dH)$.
475 \:Prvek se úèastní nejvý¹e~$d$ pøehození do~ni¾¹í úrovnì. Pokud byl pøihozen
476   do~haldy, u¾ tam setrvá, jinak poka¾dé zaplatí $\O(1)$ za~zaøazení do~pøihrádky,
477   celkem tedy $\O(d)$ na prvek.
478 \:Vytvoøení, projití a smazání pøihrádek na~jedné úrovni nastane a¾ tehdy, co bylo
479   $H$~prvkù patøících do~této úrovnì vlo¾eno do~haldy. Staèí tedy, aby ka¾dý
480   prvek pøispìl èasem $\O(B/H) = \O(L^{1/d}/H)$.
481 \endlist
482
483 \>Ka¾dý prvek tedy platí $\O(d + \log dH + L^{1/d}/H) = \O(d + \log H + L^{1/d}/H)$.
484 Pojïme najít nastavení parametrù, abychom tento výraz minimalizovali.
485 Nejprve zvolme~$H$ tak, aby se~$d$ vyrovnalo s~$L^{1/d}/H$. Tedy $H = L^{1/d}/d$.
486 Celý výraz tím zjednodu¹íme na $\O(d + \log\,(L^{1/d}/d))$ =
487 $\O(d + 1/d\cdot\log L - \log d) = \O(d + 1/d\cdot\log L)$. Dále zvolíme~$d$
488 tak, aby se oba výrazy vyrovnaly, èili $d=\sqrt{\log L}$.
489
490 HOT Queue tedy zvládne \<Insert> amortizovanou èasovou slo¾itostí $\O(\sqrt{\log L})$
491 a ostatní operace v~èase amortizovanì konstantním. Pou¾ijeme-li tuto strukturu
492 v~Dijkstrovì algoritmu, spoète vzdálenosti v~èase $\O(m + n\sqrt{\log L})$.
493
494 \h{Dinicùv algoritmus}
495
496 Zajímavé vylep¹ení Dijkstrova algoritmu navrhl Dinic (REF). V¹iml si, ¾e pokud
497 je ka¾dá hrana dlouhá alespoò~$\delta$, pak platí, ¾e mù¾eme uzavírat nejen
498 vrchol s~minimálním ohodnocením~$\mu$, ale i v¹echny ostatní s~ohodnocením
499 men¹ím ne¾ $\mu+\delta$.
500
501 Pro takto upravený Dijkstrùv algoritmus bude stále platit, ¾e pøi uzavírání
502 vrcholu odpovídá ohodnocení skuteèné vzdálenosti, tak¾e uzavøené vrcholy ji¾
503 nejsou znovu otevírány.
504
505 O~monotonii vzdáleností jsme sice pøi¹li, ale v~pøihrádkové struktuøe nebo
506 haldì mù¾eme klíèe nahradit hodnotami $h'(v) := \lfloor h(v)/\delta \rfloor$.
507 Tyto hodnoty se toti¾ chovají monotónnì a vrcholy se stejným $h'(v)$ mù¾eme
508 libovolnì zamìòovat.
509
510 Libovolnou z~popsaných pøihrádkových struktur tedy mù¾eme pou¾ít, pouze
511 v~rozboru èasové slo¾itosti nahradíme~$L$ výrazem $L/\delta$. Tento pøístup
512 pøitom funguje i pro neceloèíselné kapacity, pouze potøebujeme mít pøedem
513 k~dispozici netriviální dolní odhad na~délky v¹ech hran.
514
515 \s{Cvièení:} Navrhnìte úpravu tohoto algoritmu, která nepotøebuje~$\delta$ znát pøedem.
516
517 \h{Potenciály}
518
519 Vidìli jsme, ¾e v~grafech s~nezápornými délkami hran se nejkrat¹í cesty
520 hledají daleko rychleji. Nabízí se nalézt nìjakou transformaci, která by
521 dovedla délky upravit tak, aby byly nejkrat¹í cesty zachovány (samozøejmì
522 ne jejich délky, ale alespoò to, které cesty jsou nejkrat¹í). Nabízí se
523 následující fyzikální inspirace:
524
525 \s{Definice:} {\I Potenciál} budeme øíkat libovolné funkci $\psi: V\rightarrow {\bb R}$.
526 Pro ka¾dý potenciál zavedeme {\I redukované délky} $\ell_\psi(u,v) := \ell(u,v) + \psi(u) - \psi(v)$.
527 Potenciálu budeme øíkat {\I pøípustný,} pokud ¾ádná hrana nemá zápornou redukovanou délku.
528
529 \s{Pozorování:} Pro redukovanou délku libovolné cesty~$P$ z~$u$ do~$v$ platí: $\ell_\psi(P) = \ell(P) + \psi(u) - \psi(v)$.
530
531 \proof
532 Nech» cesta~$P$ prochází pøes vrcholy $u=w_1,\ldots,w_k=v$. Potom:
533 $$
534 \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).
535 $$
536 Tato suma je ov¹em teleskopická, tak¾e z~ní zbude:
537 $$
538 \sum_i\ell(w_i,w_{i+1}) + \psi(w_1) - \psi(w_k),
539 $$
540 co¾ je rovno $\ell(P) + \psi(u) - \psi(v)$.
541 \qed
542
543 \s{Dùsledek:} Potenciálovou redukcí se tedy délky v¹ech cest mezi~$u$ a~$v$
544 zmìní o~tuté¾ konstantu, tak¾e struktura nejkrat¹ích cest zùstane nezmìnìna.
545
546 Zbývá pøijít na~to, kde si obstarat nìjaký pøípustný potenciál. Pøidejme do~grafu
547 nový vrchol~$z$, pøiveïme z~nìj hranu nulové délky do~v¹ech ostatních vrcholù
548 a~oznaème~$\psi(v)$ vzdálenost ze~$z$ do~$v$ v~tomto grafu. Aby byl tento potenciál
549 pøípustný, musí pro ka¾dou hranu $uv$ platit $\ell_\psi(u,v) = \ell(u,v) + \psi(u) - \psi(v) \ge 0$.
550 Tuto nerovnost mù¾eme upravit na $\ell(u,v) + d(z,u) - d(z,v) \ge 0$, èili
551 $d(z,u) + \ell(u,v) \ge d(z,v)$, co¾ je ale obyèejná trojúhelníková nerovnost
552 pro vzdálenost v~grafu, která jistì platí.
553
554 Jedním výpoètem nejkrat¹ích cest v~grafu se zápornými hranami (tøeba algoritmem BFM)
555 tedy doká¾eme spoèítat potenciál, který nám pomù¾e k~redukci v¹ech hran na~nezáporné
556 délky. To nám samozøejmì nepomù¾e, chceme-li jednorázovì hledat nejkrat¹í cestu,
557 ale mù¾e nám to výraznì zjednodu¹it dal¹í, slo¾itìj¹í práci s~grafem. Jak uvidíme
558 v~pøí¹tí kapitole, mù¾eme tak napøíklad nalézt vzdálenosti mezi v¹emi dvojicemi
559 vrcholù v~èase $\O(nm + n^2\log n)$.
560
561 Na~závìr tohoto oddílu doká¾eme jedno pomocné tvrzení o~potenciálech, které
562 nám pomù¾e v~konstrukci algoritmù typu \ppsp:
563
564 \s{Lemma:} Pokud $f$ a~$g$ jsou pøípustné potenciály, pak jsou jimi i:
565 \numlist\ndotted
566 \:Konvexní kombinace $f$ a~$g$, tedy $\alpha f + \beta g$ pro libovolné $\alpha,\beta\ge 0, \alpha+\beta=1$,
567 \:$\min(f,g)$,
568 \:$\max(f,g)$.
569 \endlist
570
571 \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)$.
572 Jednotlivé èásti tvrzení doká¾eme takto:
573 \numlist\ndotted
574 \:Pokud obì strany nerovnosti pro~$f$ vynásobíme konstantou~$\alpha$, u~nerovnosti pro~$g$
575   konstantou~$\beta$ a obì nerovnosti seèteme, dostaneme:
576   $$
577   (\alpha+\beta) \cdot \ell(u,v) \ge (\alpha f(v) + \beta g(v)) - (\alpha f(u) + \beta g(u)),
578   $$
579   co¾ je pøesnì po¾adovaná nerovnost pro pøípustnost funkce $\alpha f+\beta g$.
580 \:Oznaème $h := \min(f,g)$. Nech» bez újmy na obecnosti $f(u)\le g(u)$. Pokud také platí $f(v)\le g(v)$,
581   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)$.
582   Tehdy si staèí v¹imnout, ¾e $h(v) - h(u) = g(v) - f(u) < f(v) - f(u) \le \ell(u,v)$, tak¾e
583   potenciál~$h$ je pøípustný.
584 \:Doká¾eme analogicky.
585 \qeditem
586 \endlist
587
588 \h{Algoritmy pro problém typu \ppsp}
589
590 Zamìøme se nyní na~pøípad, kdy chceme hledat nejkrat¹í cesty mezi zadanou dvojicí
591 vrcholù $s$,~$t$. Obvykle se to øe¹í pomocí algoritmu typu \sssp{} (SSSP) a v~obecném
592 pøípadì ani není lep¹í øe¹ení známo. Existuje ov¹em velké mno¾ství heuristik, kterými
593 lze ve~vìt¹inì aplikací hledání cest zrychlit. Nìkteré z~nich si pøedvedeme na
594 pøíkladu Dijkstrova algoritmu.
595
596 Dijkstrùv algoritmus ve~své klasické podobì vùbec nic neví o~cílovém vrcholu
597 a prohledá celý graf. První úprava, která se nabízí, je vyu¾ít toho, ¾e
598 od~okam¾iku uzavøení kteréhokoliv vrcholu se ji¾ jeho ohodnocení nezmìní.
599 Pokud tedy uzavøeme cílový vrchol, mù¾eme se zastavit.
600
601 Jakou èást grafu prohledáváme teï? V~metrice dané vzdálenostmi v~grafu je to nejmen¹í
602 koule se støedem ve~vrcholu~$u$, která obsahuje nejkrat¹í cestu (dobøe se to
603 pøedstavuje na~hledání v~silnièní síti na~rovinné mapì).
604
605 Také mù¾eme spustit prohledávání z~obou koncù zároveò, tedy zkombinovat hledání
606 od~$s$ v~pùvodním grafu s~hledáním od~$t$ v~grafu s~obrácenou orientací hran.
607 Oba postupy mù¾eme libovolnì støídat, zastavíme se v~okam¾iku, kdy jsme jeden
608 vrchol uzavøeli v~obou smìrech. Pozor ov¹em na to, ¾e souèet obou ohodnocení
609 tohoto vrcholu nemusí být roven vzdálenosti $v$ od~$u$ (zkuste vymyslet protipøíklad).
610 Nejkrat¹í cesta je¹tì mù¾e vypadat tak, ¾e pøechází po nìjaké hranì mezi vrcholem
611 uzavøeným v~jednom smìru a vrcholem uzavøeným ve~smìru druhém (ponechme bez dùkazu).
612 Staèí tedy bìhem procházení hran otestovat, zda je koncový vrchol uzavøený v~opaèném
613 smìru prohledávání, a~pokud ano, zapoèítat cestu do~prùbì¾ného minima.
614
615 Obousmìrný Dijkstrùv algoritmus projde sjednocení nìjaké koule okolo~$s$ s~nìjakou
616 koulí okolo~$t$, které obsahuje nejkrat¹í cestu. Prùmìry koulí pøitom závisí na tom,
617 jak budeme bìhem výpoètu støídat oba smìry prohledávání. V~nejhor¹ím pøípadì samozøejmì
618 mù¾eme prohledat a¾ celý graf.
619
620 \h{Algoritmus \astar}
621
622 V~umìlé inteligenci se èasto pro hledání nejkrat¹í cesty v~rozsáhlých grafech
623 (obvykle stavových prostorech nìjaké úlohy) pou¾ívá algoritmus nazývaný~\astar.
624 Jedná se o~modifikaci Dijkstrova algoritmu, která vyu¾ívá heuristickou funkci
625 pro dolní odhad vzdálenosti do~cíle; oznaème si ji $\psi(v)$. V~ka¾dém kroku pak uzavíra
626 vrchol~$v$ s~nejmen¹ím mo¾ným souètem $h(v)+\psi(v)$ aktuálního ohodnocení s~heuristikou.
627
628 Intuice za tímto algoritmem je jasná: pokud víme, ¾e nìjaký vrchol je blízko
629 od~poèátaèního vrcholu~$s$, ale bude z~nìj urèitì daleko do cíle~$t$, zatím ho
630 odlo¾íme a budeme zkoumat nadìjnìj¹í varianty.
631
632 Heuristika se pøitom volí podle konkrétního problému -- napø. hledáme-li cestu
633 v~mapì, mù¾eme pou¾ít vzdálenost do~cíle vzdu¹nou èarou.
634
635 Je u~tohoto algoritmu zaruèeno, ¾e v¾dy najde nejkrat¹í cestu? Na to nám dá odpovìï
636 teorie potenciálù.
637
638 \s{Vìta:} Bìh algoritmu \astar{} odpovídá prùbìhu Dijkstrova algoritmu
639 na~grafu redukovaném potenciálem daným heuristickou funkcí~$-\psi$. Pøesnìji,
640 pokud oznaèíme $h^*$ aktuální ohodnocení v~\astar{} a $h$ aktuální ohodnocení
641 v~synchronnì bì¾ícím Dijkstrovi, bude v¾dy platit $h(v) = h^*(v) - \psi(s) + \psi(v)$.
642
643 \proof
644 Indukcí podle doby bìhu obou algoritmù. Na poèátku je $h^*(s)$ i $h(s)$ nulové
645 a v¹echna ostatní $h^*$ a~$h$ jsou nekoneèná, tak¾e tvrzení platí. V~ka¾dém dal¹ím
646 kroku \astar{} vybere vrchol~$v$ s~nejmen¹ím $h^*(v) + \psi(v)$, co¾ je tentý¾ vrchol,
647 který vybere Dijkstra ($\psi(s)$ je stále stejné).
648
649 Uva¾ujme, co se stane bìhem relaxace hrany $vw$: Dijkstra se pokusí sní¾it ohodnocení $h(w)$
650 o~$\delta = h(w) - h(v) - \ell_{-\psi}(v,w)$ a provede to, pokud $\delta>0$. Uká¾eme,
651 ¾e \astar{} udìlá toté¾:
652 $$\eqalign{
653 \delta &= (h^*(w) - \psi(s) + \psi(w)) - (h^*(v) - \psi(s) + \psi(v)) - (\ell(v,w) - \psi(v) + \psi(w)) \cr
654 &= h^*(w) - \psi(s) + \psi(w) - h^*(v) + \psi(s) - \psi(v) - \ell(v,w) + \psi(v) - \psi(w) \cr
655 &= h^*(w) - h^*(v) - \ell(v,w).
656 }$$
657 Oba algoritmy tedy a¾ na~posunutí dané potenciálem poèítají toté¾.
658 \qed
659
660 \s{Dùsledek:} Algoritmus \astar{} funguje jen tehdy, je-li potenciál $-\psi$ pøípustný.
661
662 Napøíklad pro rovinnou mapu to heuristika daná euklidovskou vzdáleností, tedy $\psi(v) := \varrho(v,t)$, splòuje:
663 Pøípustnost po¾aduje pro ka¾dou hranu $uv$ nerovnost
664 $\ell(u,v) - \psi(v) + \psi(u) \ge 0$,
665 tedy $\ell(u,v) - \varrho(v,t) + \varrho(u,t) \ge 0$.
666 Jeliko¾ $\ell(u,v) \ge \varrho(u,v)$,
667 staèí dokázat, ¾e $\varrho(u,v) - \varrho(v,t) + \varrho(u,t) \ge 0$,
668 co¾ je ov¹em trojúhelníková nerovnost pro metriku~$\varrho$.
669
670 \references
671 \bye