Prerekvizity: [L2.4] Dijkstrův algoritmus (běh). Minulá lekce [L2.6] učila Dijkstru pracovat s cenami na vrcholech; dnes ho naučíme pracovat s úlohou, kde se po cestě vůbec nesčítá, ale násobí.
Slide 28 přednášky zavádí Maximum Reliability Path Problem (úloha nejspolehlivější cesty): v komunikační síti má každá hrana $(i,j)$ spolehlivost (reliability) $p(i,j)$ — pravděpodobnost, že spoj neselže. Výpadky spojů jsou na sobě nezávislé (unrelated), takže spolehlivost orientované cesty $Q$ z $s$ do $t$ je součin spolehlivostí jejích hran:
$$p(Q) = \prod_{(i,j) \in Q} p(i,j).$$
Najdi nejspolehlivější spojení z $s$ do $t$, tj. cestu maximalizující $p(Q)$.
Tři kandidáti: přímý spoj $s \to t$ má $p = 0{,}125$; cesta přes $a$ má $0{,}5 \cdot 0{,}5 = \mathbf{0{,}25}$; cesta přes $b$ má $0{,}125 \cdot 0{,}5 = 0{,}0625$. Vítězí cesta přes $a$ — dvě hrany porazí jednu, protože dvě docela spolehlivé hrany dají větší součin než jedna nespolehlivá. Počet hran o ničem nerozhoduje.
Shortest path minimalizuje součet vah hran. Tady ale:
A až oba rozdíly odstraníme, číhá ještě třetí podmínka: Dijkstra vyžaduje nezáporné váhy [L2.4]. Potřebujeme tedy převod, který vyřeší všechny tři věci najednou.
Logaritmus: $\log(ab) = \log a + \log b$. Na základu nezáleží — vlastnost má každý logaritmus se základem $b > 1$. Aplikujeme-li ho na spolehlivost cesty:
$$\log p(Q) = \log \prod_{(i,j) \in Q} p(i,j) = \sum_{(i,j) \in Q} \log p(i,j)$$
— ze součinu přes hrany je rázem součet přes hrany, přesně tvar, kterému rozumí algoritmy na nejkratší cesty.
Logaritmus je rostoucí funkce: $x > y \iff \log x > \log y$. Pořadí cest podle $p(Q)$ a podle $\log p(Q)$ je tedy stejné, speciálně
$$\arg\max_Q\, p(Q) = \arg\max_Q\, \log p(Q).$$
Zbývá rozdíl max vs. min: vynásobíme $-1$ — maximalizace výrazu je minimalizace jeho minus-verze:
$$\max_Q\, \prod_{(i,j)\in Q} p(i,j) \iff \min_Q\, \sum_{(i,j)\in Q} \bigl(-\log p(i,j)\bigr).$$
Stačí tedy položit váhu hrany $c(i,j) := -\log p(i,j)$ a hledat obyčejnou nejkratší cestu.
Zbývá třetí podmínka z úvodu: smí na nové váhy $c(i,j) = -\log p(i,j)$ Dijkstra? Podívej se na průběh funkce:
$-\log p \ge 0 \iff \log p \le 0 \iff p \le 1$. Pravděpodobnosti splňují $p \in (0,1]$ vždy, takže všechny nové váhy jsou nezáporné — třetí podmínku dostáváme zadarmo a Dijkstra [L2.4] smí nastoupit.
Krajní případy dávají smysl i „fyzikálně“: dokonale spolehlivá hrana $p = 1$ má váhu $-\log 1 = 0$ (projdeš zdarma, spolehlivost nezhorší); čím nespolehlivější hrana, tím větší váha, a pro $p \to 0$ váha roste nade všechny meze. Hranu s $p = 0$ (jistý výpadek) z grafu rovnou odstraň, případně jí dej váhu $+\infty$.
Na základu logaritmu nezáleží: $\log_b x = \ln x / \ln b$, takže změna základu jen přenásobí všechny váhy stejnou kladnou konstantou — a to pořadí cest podle délky nezmění (ke škálování vah se vrátíme v lekci [L2.15] Škálování vah a zachování nejkratší cesty). V ručních příkladech se hodí základ 2, když jsou spolehlivosti mocniny $\tfrac12$; obecně se píše $\ln$ nebo prostě $\log$.
Síť z úvodu po transformaci $c(i,j) = -\log_2 p(i,j)$ (např. $-\log_2 0{,}5 = 1$, $-\log_2 0{,}125 = 3$):
Přímo: $3$; přes $a$: $1 + 1 = \mathbf{2}$; přes $b$: $3 + 1 = 4$. Pořadí $a \prec$ přímo $\prec b$ přesně odpovídá spolehlivostem $0{,}25 > 0{,}125 > 0{,}0625$ — a nejde o náhodu: délka každé cesty je $-\log_2$ její spolehlivosti ($-\log_2 0{,}25 = 2$, $-\log_2 0{,}125 = 3$, $-\log_2 0{,}0625 = 4$). Transformace zachovává hodnotu, ne jen vítěze.
Běh Dijkstry [L2.4] na transformovaném grafu (včetně závěrečného převodu výsledku zpět):
Poslední krok nezapomenout: zkoušková otázka většinou chce spolehlivost (pravděpodobnost), ne záhadné číslo $l(t)$. Převod zpět je
$$p(Q^*) = b^{-l(t)} \qquad (\text{základ } b \text{ = ten, kterým jsi logaritmoval}),$$
tady $p(Q^*) = 2^{-2} = 0{,}25$ — souhlasí s ručním výpočtem z úvodu.
Tohle je druhá půlka výzbroje na zkouškovou úlohu Dangerous adventure [L2.8]: tam sedí pravděpodobnosti (přežití) na hranách i vrcholech, takže se $-\log$ z téhle lekce kombinuje se split trikem z [L2.6] (nebo se složením ceny vrcholu do vstupních hran). Důkaz, proč Dijkstra na nezáporných vahách opravdu funguje, patří do kapitoly K3 — tady stačí, že transformace jeho předpoklad splní.
In the communication network we associate a reliability $p(i, j)$ with every arc from $i$ to $j$. We assume the failures of links to be unrelated. The reliability of a directed path $Q$ from $s$ to $t$ is the product of the reliability of the arcs in the path. Find the most reliable connection from $s$ to $t$.
(a) Show that we can reduce the maximum reliability path problem to a shortest path problem.
(b) Suppose you are not allowed to make reduction. Specify $O(n^2)$ algorithm for solving the maximum reliability path problem.
(c) Will your algorithms in parts a) and b) work if some of the $p(i, j)$ coefficients are strictly greater than 1?
Přesně úloha z výkladu: maximalizace součinu spolehlivostí hran po cestě. Tři podotázky: (a) redukce na shortest path (= obsah této lekce), (b) přímý algoritmus v $O(n^2)$ bez redukce — tj. úprava Dijkstry, aby pracoval rovnou se součiny a maximalizací, (c) rozbor, co se stane, když některé koeficienty přerostou 1 (a přestanou tak být pravděpodobnostmi).
Část (a) je doslova výklad — předveď převod včetně tří bodů: součin→součet (log), max→min (minus), nezápornost ($p \le 1$). Pro (b) si vezmi pseudokód Dijkstry z [L2.4] a projdi ho řádek po řádku s otázkou „co tu dělá sčítání/minimum a čím to nahradím, když chci přímo maximalizovat součin?“ — změní se inicializace, výběr vrcholu i relaxační podmínka, struktura (a tedy složitost) zůstane. Pro (c) projdi předpoklady obou variant: kde přesně jsme použili $p \le 1$? Zkus malý protipříklad se třemi vrcholy a jednou hranou s $p > 1$.
(a) Redukce. Polož $c(i,j) := -\log p(i,j)$. Pro každou cestu $Q$ platí
$$\sum_{(i,j) \in Q} c(i,j) = -\log \prod_{(i,j) \in Q} p(i,j) = -\log p(Q),$$
a protože $-\log$ je klesající funkce, je cesta s minimálním součtem $c$ přesně cesta s maximální spolehlivostí $p(Q)$. Z $p(i,j) \in (0,1]$ plyne $c(i,j) \ge 0$ (hrany s $p = 0$ odstraníme), takže výslednou instanci shortest path vyřeší Dijkstra; spolehlivost optimální cesty $Q^*$ získáme zpětně jako $p(Q^*) = b^{-l(t)}$.
(b) Přímá modifikace Dijkstry (bez redukce). Značka $l(v)$ = spolehlivost zatím nejlepší nalezené $s$–$v$ cesty:
Pozor na značení: $p(w)$ je vektor předchůdců podle konvence z [L2.4] (předchozí vrchol na cestě) — nezaměnit se spolehlivostí hrany $p(v,w)$, která má dva argumenty.
Struktura algoritmu je shodná s Dijkstrou: $n$ iterací, v každé výběr extrému přes $O(n)$ vrcholů a relaxace $O(n)$ hran — celkem $O(n^2)$. Funguje ze stejného důvodu jako Dijkstra: násobení koeficientem $p \in (0,1]$ značku nikdy nezvětší (zrcadlo přičítání nezáporné váhy), takže vrchol s maximální značkou už si nemůže polepšit přes jiný neuzavřený vrchol a jeho uzavření je definitivní. (Formální důkaz = zrcadlový důkaz korektnosti Dijkstry, patří do kapitoly K3.)
(c) Obecně NE. Oba algoritmy se opírají o $p(i,j) \le 1$:
Společný protipříklad je na grafu níže: nejspolehlivější je cesta $s \to a \to t$ s $0{,}1 \cdot 10 = 1$, ale obě varianty uzavřou $t$ hned po $s$ (transformovaná váha $-\log_2 0{,}9 \approx 0{,}152$ je menší než $-\log_2 0{,}1 \approx 3{,}32$, resp. značka $0{,}9 > 0{,}1$) a vrátí přímou hranu s $p = 0{,}9$. Odpověď: ne — s koeficienty $> 1$ není korektnost zaručena.
Nejspolehlivejsi spojeni, vektor spolehlivosti $p$ rozsah $(0,1)$, vysledne spojeni je produkt vsech spolehlivosti po ceste a) prevod ulohy nejspolehlivejsiho spojeni, aby sel resit Dijkstrou b) Modifikace Dijkstry aby resil tuhle ulohu c) bude a) a b) fungovat, kdyz bude $p$ v rozsahu $(0, \infty)$
Tatáž úloha jako T01, jak ji po zkoušce zapsal student (proto česky a telegraficky — u písemky čekej anglické znění ve stylu T01). Drobné rozdíly v parametrech: spolehlivosti jsou z otevřeného intervalu $(0,1)$ a část (c) se ptá na rozsah $(0,\infty)$ místo „some coefficients $> 1$“.
Ujasni si, co změna rozsahů mění a co ne: ovlivní $p \in (0,1)$ místo $(0,1]$ nezápornost vah? A je rozsah $(0,\infty)$ něco jiného než „některé koeficienty $> 1$“ z T01(c)?
(a), (b) beze změny jako v T01: převod $c(i,j) = -\log p(i,j)$ + Dijkstra + zpětný převod $b^{-l(t)}$; modifikovaný Dijkstra s $l(s)=1$, výběrem maxima a relaxací $l(w) < l(v)\cdot p(v,w)$. Otevřený interval $(0,1)$ situaci jen zpříjemní: $p < 1$ dává váhy ostře kladné (žádné nulové hrany), nezápornost tím spíš platí.
(c) Rozsah $(0,\infty)$ připouští koeficienty $> 1$, takže odpověď je tatáž jako v T01(c): obecně ne — transformace vyrobí záporné váhy (a z cyklů se součinem $> 1$ záporné cykly [L2.1]), modifikovaná Dijkstra ztratí korektnost hladového výběru; protipříklad u T01 funguje beze změny. Za zmínku u zkoušky stojí, že pro $p \in (0,1]$ — tedy dokud váhy po transformaci zůstávají nezáporné — funguje obojí.