Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
ZveřejnilMatyáš Urban
1
TI 7.1 NEJKRATŠÍ CESTY Nejkratší cesty - kap. 6
2
TI 7.2 Nejkratší cesty z jednoho uzlu Seznámíme se s následujícími pojmy: w-vzdálenost (vzdálenost na ohodnoceném grafu), relaxace, strom nejkratších cest Dijkstrův algoritmus Bellman-Fordův algoritmus Skripta kap. 6, str. 110 – 122 Nejkratší cesty - odst. 6.1
3
TI 7.3 Několik obecných úvah Nejkratší cesty - odst. 6.1 počítání s nekonečny: a + (- ) = (- ) + a = - pro a a + = + a = pro a - ? Které z vlastností 0 až 4 má takováto vzdálenost ? Uvažujeme nejobecnější případ - ohodnocené OG: w-délka spojení h 1, h 2,..., h k = w(h i ) w-vzdálenost d w (u,v) = w-délka nejkratšího spojení nebo < 0 nedostupné uzly - vzdálenost spojení se záporným cyklem – vzdálenost -
4
TI 7.4 Varianty úlohy hledání nejkratších cest: Nejkratší cesty - odst. 6.1 Důležité zjištění: Pro libovolnou hranu (u,v)H a uzel sU platí d w (s,v) d w (s,u) + w(u,v) 1 1 1 nn 1n n s v u ! Platí pro konečné i nekonečné hodnoty w-vzdáleností ! d w (s,v) d w (s,u) w(u,v)
5
TI 7.5Nejkratší cesty - odst. 6.1 Datové struktury: d[u]... délka (dosud nalezené) minimální cesty p[u]... předchůdce na (dosud nalezené) minimální cestě Q... (prioritní) fronta otevřených uzlů (halda?) Společné operace pro základní varianty algoritmů: InitPaths(G,s) - inicializace datových struktur 1for každý uzel uU 2{ d[u] ; p[u] nil } 3d[s] 0 Relax(u,v,w) - (případná) úprava délky nalezené nejkratší cesty 1if d[v] > d[u]+w(u,v) 2 { d[v] d[u]+w(u,v); p[v] u }
6
TI 7.6 V: Předpokládejme, že pro nějaký graf provedeme operaci InitPaths a pak libovolný počet operací Relax. Potom platí d[u] d w (s,u) jakmile d[u] dosáhne hodnoty d w (s,u), už se nemění jakmile se žádné d[u] nemění, máme strom nejkratších cest do všech dosažitelných uzlů z uzlu s Nejkratší cesty - odst. 6.1 ? V jakém pořadí hran máme provádět relaxaci ? ? Jak dlouho máme provádět relaxaci ? 0 121 121 1212444 4 8 12 6 1 245
7
TI 7.7 Dijkstrův algoritmus Základní předpoklad w : H R + (nezáporné délky hran) Jedná se o upravený algoritmus prohledávání do šířky – otevřené uzly se řadí do prioritní fronty (a vybírají) podle hodnoty d[u]... aproximace d w (s,u) Dijkstrův algoritmus - odst. 6.2 0 121 121 1212444 1 4 246457 s
8
TI 7.8 Dijkstra(G,s,w) 1InitPaths(G,s) 2S ; InitQueue(Q) 3for každý uzel uU { Enqueue(Q,u) }O(|U|) 4while not EmptyQueue(Q) { 5u ExtractMin(Q); S S{u}O(|U|. lg |U|) 6for uzel vAdj[u] { 7 Relax(u,v,w) O(|H|. lg |U|) 8 } } Dijkstrův algoritmus - odst. 6.2 Možné ještě O(|U|. lg |U| + |H|) nebo O(|U|**2) (podle způsobu implementace prioritní fronty – Fibonacci/seznam) Co se stane, když existují záporně ohodnocené hrany? Relax se musí doplnit o vracení uzlů do prioritní fronty (?? ukončení algoritmu, časová složitost ??)
9
TI 7.9 Důkaz správnosti Dijkstrova algoritmu Tvrzení: Při uzavření uzlu u (řádka 5... S S{u}) platí d[u] = d(s,u) D: sporem - nechť je d[u] > d(s,u) pro nějaký uzavřený uzel, mějme nejkratší cestu s u, x je poslední uzavřený uzel s x y u uzavřené uzly S 0 d[y] = d(s,y) d(s,u) < d[u] spor s vybráním uzlu u, když byl k dispozici uzel y s menší hodnotou Dijkstrův algoritmus - odst. 6.2
10
TI 7.10 Bellmanův-Fordův algoritmus ? Co dělat v případě záporně ohodnocených hran ? Systematicky relaxovat... Bellman-Ford algoritmus - odst. 6.3 Bellman-Ford(G,s,w) 1InitPaths(G,s) 2for i 1 to |U|-1 { 3 for každou hranu (u,v)H { Relax(u,v,w) } 4} 5for každou hranu (u,v)H { 6 if d[v] > d[u] + w(u,v) { return false } } 7return true Složitost O(|U|. |H|) ?Proč má nyní Relax konstantní časovou složitost?
11
TI 7.11 ? Nelze B-F algoritmus nějak upravit / zrychlit ? Bellman-Ford algoritmus - odst. 6.3 DAG-Paths - nejkratší cesty pro acyklické grafy 1Topologicky uspořádáme uzly grafu G 2InitPaths(G,s) 3for každý uzel u v pořadí podle topologického uspořádání { 4 for každé vAdj[u] {Relax(u,v,w) } 5} Co když zavedeme frontu uzlů s úspěšným Relax a bereme jen hrany vycházející z těchto uzlů? (a máme Dijkstru!) ukončení - při vyprázdnění fronty problém - co když se fronta nevyprázdní? v nejhorším případě zase O(|U|. |H|) ?? Složitost ?? O(|H|+|U|) !!
12
TI 7.12 Kontrolní otázky 1.Která část Dijkstrova algoritmu je podstatně závislá na předpokladu nezáporného ohodnocení hran? Ukažte na jednom příkladu, že pro záporně ohodnocené hrany může Dijkstrův algoritmus dát špatný výsledek, a na jiném příkladu, že může dát správný výsledek. 2.Je možné prohlásit, že Dijkstrův algoritmus bude fungovat správně i při záporném ohodnocení hran, pokud bude zadaný graf acyklický? 3.Je možné prohlásit, že Dijkstrův algoritmus bude fungovat správně i při záporném ohodnocení hran, pokud bude hledat vzdálenost z kořene do ostatních uzlů kořenového stromu? 4.Navrhněte časově efektivní algoritmus pro určení celkového počtu různých orientovaných cest v acyklickém grafu. (Návod: Inspirujte se algoritmem DAG-Paths a za hodnotu d[u] berte počet cest končících v uzlu u.) 5.Navrhněte algoritmus, který určí vzdálenost ze všech uzlů do uzlu s v acyklickém orientovaném grafu. Určete potřebné datové struktury a časovou složitost navrženého algoritmu. 6.Navrhněte algoritmus lineární složitosti pro hledání nejdelších cest z daného uzlu do všech ostatních. 7.Doplňte Dijkstrův a Bellman-Fordův algoritmus o výpočet hodnoty r[u], která představuje počet hran nejkratší cesty z uzlu s do uzlu u. (Návod: Stačí vhodně upravit operace InitPaths a Relax.) Nejkratší cesty - kapitola 6
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.