From: Martin Mares Date: Thu, 24 May 2007 06:51:00 +0000 (+0200) Subject: Prvni verze kapitoly o nejkratsich cestach. X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=8c528fb0147cceb9461acecc20e8a185e19ee013;p=ads1.git Prvni verze kapitoly o nejkratsich cestach. --- diff --git a/10-cesty/10-cesty.tex b/10-cesty/10-cesty.tex new file mode 100644 index 0000000..fb5e6e6 --- /dev/null +++ b/10-cesty/10-cesty.tex @@ -0,0 +1,217 @@ +\input ../lecnotes.tex + +\prednaska{10}{Hledání nejkrat¹í cesty}{(zapsali L. Banáková, O. Hoferek, J. Bøeèka)} + +\s{Problém:} Je dán graf G, kde $l(u,v)$~=~délka hrany~$(u,v)$. Dále jsou dány vrcholy +$s,c~\in~V(G)$. Chceme najít cestu $s=v_1, v_2, \dots, v_k=c$ takovou, aby +$$l(v_1, v_2) + l(v_2, v_3) + \dots + l(v_{k-1}, v_k)$$ bylo minimální. Takovéto +cestì budeme øíkat nejkrat¹í cesta z~$s$~do~$c$. + +\noindent +Bez újmy na obecnosti budeme pøedpokládat, ¾e graf G je orientovaný, bez smyèek a +násobných hran. + +\noindent +Nejprve uvá¾íme, ¾e $l=const.$ $1$ : + +\s{Algoritmus:} (Prohledávání do ¹íøky (BFS)) + +\algo +\:$z(*) \leftarrow 0, z(s) \leftarrow 1$ +\:$Q \leftarrow {s}$ +\:while $Q \not= \emptyset$ +\::$v \leftarrow Get(Q)$ +\::for $\forall w: (v,w)\in E$ +\:::if $z(w) = 0$ then +\::::$z(w) \leftarrow 1$ +\::::$Put(Q, w)$ +\endalgo + +\s{Lemma È (èasové):} BFS dobìhne v~èase $\O(m+n)$. + +\proof +Ka¾dý vrchol se do fronty dostane maximálnì jednou a ka¾dou hranu zpracujeme +maximálnì jednou. +\qed + +\s{Lemma D (dosa¾itelnost):} BFS oznaèí právì vrcholy dostupné ze $s$. + +\proof + +\noindent +,,$\Rightarrow$``: Zjevné, indukcí podle bìhu algoritmu. + +\noindent +,,$\Leftarrow$``: Doká¾eme sporem. Uva¾me, ¾e existuje vrchol dostupný, ale algoritmem +neoznaèený. Vezmìme takovýto ,,¹patný`` vrchol $v$, který je $s$ nejblí¾e. Uva¾me +nejkrat¹í cestu $(s,v)$: $s,\dots,u,v$. Pøedchozí vrchol na této cestì $u$ +musí být ,,dobrý``. Vrchol $u$ se dostane do fronty, pak je z~ní vybrán a tím +se zpracuje i vrchol $v$ $\Rightarrow$ spor. + +\s{Definice:} {\I Vzdálenost vrcholù} $d(u,v)$ je délka nejkrat¹í cesty $(u,v)$, +pokud existuje, nebo $+\infty$, pokud taková cesta neexistuje. + +Pøedchozím algoritmem jsme pouze zjistili, které vrcholy jsou z~$s$ dosa¾itelné. +Nyní si tento algoritmus modifikujeme tak, abychom na¹li $d(s,v)$ pro v¹echna +$v~\in~V(G)$. + +\s{Roz¹íøený algoritmus:} (Prohledávání do ¹íøky (BFS)) + +\algo +\:$z(*) \leftarrow 0, z(s) \leftarrow 1$ +\:$D(*) \leftarrow +\infty, D(s) \leftarrow 0$ +\:$Q \leftarrow {s}$ +\:while $Q \not= \emptyset$ +\::$v \leftarrow Get(Q)$ +\::for $\forall w: (v,w)\in E$ +\:::if $z(w) = 0$ then +\::::$z(w) \leftarrow 1$ +\::::$D(w) \leftarrow D(v) + 1$ +\::::$Put(Q, w)$ +\endalgo + +\noindent +Prùbìh tohoto algoritmu si mù¾eme ukázat na následujícím obrázku (,,praseèí graf``): + +\figure{praseci-graf.eps}{Praseèí graf}{75mm} + +\s{Definice:} {\I Vrstva} $ L_i\subseteq V $ : $ L_0 = \{s\} $ , $ L_{i+1} = $ +$ \{ w$ : $ w $ oznaèen pøi procházení vrcholu $ v \in L_i $$ \} $ + +\s{Lemma V (vzdálenosti):} Na konci BSF je $\forall v: D(v) = d(s,v)$. + +\proof + +\noindent +a) pro nedosa¾itelné vrcholy: OK (algoritmus je neoznaèí $\Rightarrow D(v) = \infty$ ) + +\noindent +b) pro dosa¾itelné vrcholy: Víme, ¾e pro vrchol $v \in L_i$ platí $D(v)=i$, +staèí tedy zjistit, zda $\forall i: \forall v \in L_i$ je $d(s,v)=i$. To ovìøíme matematickou indukcí +podle~$i$: + +pro $i=0$: evidentní, + +pro $i>0$: Pøi procházení vrstvy $L_{i-1}$ musí být vrchol $v$ takový, ¾e $d(s,v)=i$, oznaèen a tudí¾ patøí do $L_i$. +\qed + +\noindent +V¹imnìme si, ¾e v~grafu existují pouze tøi typy hran vzhledem k na¹emu algoritmu: +\itemize\ibull +\:dopøedu o jednu vrstvu +\:dozadu o jednu nebo víc vrstev +\:ve vrstvì +\endlist + +Abychom na¹li i samotné cesty, nejen jejich délky, modifikujeme ná¹ algoritmus tak, +abychom si pro ka¾dý vrchol, který oznaèíme, pamatovali jeho pøedchùdce: + +\algo +\:$z(*) \leftarrow 0, z(s) \leftarrow 1$ +\:$D(*) \leftarrow +\infty, D(s) \leftarrow 0$ +\:$p(*) \leftarrow$ ? +\:$Q \leftarrow {s}$ +\:while $Q \not= \emptyset$ +\::$v \leftarrow Get(Q)$ +\::for $\forall w: (v,w)\in E$ +\:::if $z(w) = 0$ then +\::::$z(w) \leftarrow 1$ +\::::$D(w) \leftarrow D(v) + 1$ +\::::$p(w) \leftarrow v$ +\::::$Put(Q, w)$ +\endalgo + +\s{Pozorování:} Pokud $p(v) \not=$ ? $\Rightarrow D(v) = D(p(v)) + 1$. + +\s{Lemma S (stromové):} Graf $(W,F)$, kde $W$ = dosa¾itelná èást $V$, $F = \{(v,p(v))\}$ +je strom orientovaný do~koøene $s$. Navíc ukazuje v¹echny nejkrat¹í cesty. + +\noindent +Nyní uva¾me, ¾e $l \not= const.$ : + +Uká¾eme si trik pro ohodnocené hrany: hranu délky $l$ +podrozdìlíme na $l$ hran délky 1 a pak spustíme BFS. Algoritmus pobì¾í s èasovou +slo¾itostí $O((m+n)l_{max})$. To není zrovna moc výhodné, a proto si uká¾eme tzv. {\I Budíkovou taktiku }: +Èasem $b(v)$ budíku vrcholu~$v$ rozumíme èas, kdy se do tohoto vrcholu vlna dostane, kdy¾ se bude ¹íøit po +dosud známých hranách. Na zaèátku nastavíme $\forall v \in V: b(v) = l(s,v)$ a pokud pøi bìhu +algoritmu objevíme hranu, která nám umo¾ní dostat se do $v$ rychleji, tak hodnotu $b(v)$ zmìníme. + +Tato taktika nás pøivede k Dijkstrovu algoritmu, kde se ze dvoustavového $z(v)$ stane tøístavové +( $z(v)) \in \{N, V, H\}$, kde N znamená nevidìn, V vidìn a H hotov ). Podle hodnoty $z(v)$ se +pak $D(v)$ rovná $+\infty$ pro $z(v) = N$, èasu budíku pro $z(v) = V$ nebo vzdálenosti $d(s,v)$ pro $z(v) = H$. + +\s{Algoritmus:} (Dijkstrùv algoritmus) + +\algo +\:$z(*) \leftarrow N, z(s) \leftarrow V$ +\:$D(*) \leftarrow +\infty , D(s) \leftarrow 0$ +\:$p(*) \leftarrow $? +\:while $\exists v : z(v)=V$ +\::$v \leftarrow $ vrchol, pro nìj¾ $z(v)=V$ a zároveò $D(v)$ je minimální +\::$z(v) \leftarrow H$ +\::for $\forall w : (v,w) \in E$: +\:::if $D(w)>D(v) + l(v,w)$ then +\::::$D(w) \leftarrow D(v) + l(v,w)$ +\::::$z(w) \leftarrow V$ +\::::$p(w) \leftarrow v$ +\endalgo + +\s{Vìta:} Pokud $\forall v,w: l(v,w) \in Z^+ \cup \{\infty\}$, pak Dijkstrùv algoritmus +najde nejkrat¹í cesty v èase $\O(n^2)$. + +\proof +na pøí¹tí pøedná¹ce +\qed + +Nahlédnìme nyní, zda by vedlo k~vylep¹ení èasové slo¾itosti, kdybychom pøi~implementaci +Dijkstrova algoritmu pou¾ili jako datovou strukturu pro ukládání vidìných vrcholù rùzné typy hald. +Provádìli bychom s~nimi operace DeleteMin (maximálnì $n$-krát) a Decrease (maximálnì $m$-krát). Zmínìné +operace mají pro rùzné typy hald následující èasové slo¾itosti: + +\medskip + +\vbox{\halign{# \quad \vrule \quad & # \quad \vrule \quad & # \quad \vrule \quad & #\cr +& halda & $k$-regulární halda & Fibonaciho halda\cr +\noalign{\medskip\hrule\bigskip} +DeleteMin & $\O(\log{n})$ & $\O(k.\log_k{n})$ & $\O(\log{n})$\cr +Decrease & $\O(\log{n})$ & $\O(\log_k{n})$ & $\O(1)$\cr}} + +\medskip + +Pou¾ijeme-li klasickou haldu, dostaneme celkovou èasovou slo¾itost $\O((m~+~n).\log{n})$, co¾ znamená, +¾e jsme si pomohli v pøípadech, kdy je graf ,,øídký``. U $k$-regulární haldy se celková èasová slo¾itost +rovná $\O(n.k.\log_k{n}+m.\log_k{n})$, ideálnì pro $k~=$~${m}\over{n}$~:~$\O(m.\log_{{m}\over{n}}{n})$. Prozkoumejme, +jak se nám v tomto pøípadì bude mìnit èasová slo¾itost pro rùznì ,,husté`` grafy: +\itemize\ibull +\:$m \approx n \rightarrow \O((m+n).\log{n})$ +\:$m \approx n^2 \rightarrow \O(m)$ +\:$m \approx n^{1+\epsilon} \rightarrow \O(m) \dots (k=$~${m}\over{n}$~$= n^\epsilon)$ +\endlist +\noindent +Pøi pou¾ití Fibonaciho haldy je pak celková èasová slo¾itost rovna $\O(n.\log{n}+m)$. + +\medskip + +Nyní si pøedvedeme trochu jiný algoritmus na prohledávání grafu. Mìjme matici sousednosti $A$ +ke grafu $G = (V, E)$: $ A_{ij} = 1 \Leftrightarrow (v_i, v_j) \in E $. Potom +$A^2_{ij} = \sum_{k=1}^n A_{ik}A_{kj} $. Tento souèet je nenulový právì tehdy, kdy¾ +vrcholy $i$,$k$,$j$ tvoøí sled délky 2. Jinými slovy $A_{ij}$ se rovná poètu sledù +délky 2 v $G$ z $i$ do $j$. Obdobnì $A^k_{ij}$ = poèet sledù délky $k$. Pokud +k matici $A$ pøièteme jednotkovou matici $E$ (èím¾ si pøimyslíme smyèky), +dostaneme po umocnìní: + +$ (A+E)^k_{ij} \neq 0 \Leftrightarrow \exists$ $i,j$-sled délky maximálnì $k$ + +Výstupem algoritmu tedy bude matice $(A + E)^n$. Mù¾eme si také v¹imnout, ¾e +pokud matici $(A + E)$ umocníme na èíslo vìt¹í ne¾ $n$, tak výsledek bude poøád +správný, jen bude výpoèet trvat déle. Tak¾e algoritmus mù¾e pracovat +v iteracích umocòováním matice na druhou: $M_0 = A + E$, $M_1 = M^2_0$, $M_{i+1} = M^2_i$, +tak¾e výstupní matice bude: + +$ M_{\lceil \log{n} \rceil (ij)} \neq 0 \Leftrightarrow \exists$ cesta z $i$ do $j$ + +Pokud pou¾ijeme Strassenùv vzorec na násobení matic, dostaneme +ve výsledku algoritmus na dosa¾itelnost v grafu se slo¾itostí +$\O(n^{\log_2{7}}.\log{n})$. + +\bye diff --git a/10-cesty/Makefile b/10-cesty/Makefile new file mode 100644 index 0000000..cc5ae84 --- /dev/null +++ b/10-cesty/Makefile @@ -0,0 +1,3 @@ +P=10-cesty + +include ../Makerules diff --git a/10-cesty/praseci-graf.eps b/10-cesty/praseci-graf.eps new file mode 100644 index 0000000..e30f7e1 Binary files /dev/null and b/10-cesty/praseci-graf.eps differ diff --git a/all/Makefile b/all/Makefile index 610ec08..89aed23 100644 --- a/all/Makefile +++ b/all/Makefile @@ -1,5 +1,5 @@ P=ads -X:=$(shell for a in 1 2 3 4 5 6 8 12 ; do echo ../$$a-*/$$a-*.tex ; done) +X:=$(shell for a in 1 2 3 4 5 6 8 10 12 ; do echo ../$$a-*/$$a-*.tex ; done) %universe: all ChangeLog