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