210 likes | 377 Views
NEJKRATŠÍ CESTY MEZI VŠEMI UZLY. Nejkratší cesty - kap. 7. Nejkratší cesty mezi všemi uzly. Seznámíme se s následujícími pojmy: matice w-délek, matice w-vzdáleností, matice předchůdců Floydův-Warshallův algoritmus Johnsonův algoritmus, přehodnocení hran
E N D
NEJKRATŠÍ CESTYMEZI VŠEMI UZLY Nejkratší cesty - kap. 7
Nejkratší cesty mezi všemi uzly • Seznámíme se s následujícími pojmy: • matice w-délek, matice w-vzdáleností, matice předchůdců • Floydův-Warshallův algoritmus • Johnsonův algoritmus, přehodnocení hran • Skripta kap. 7, str. 123 – 138 Nejkratší cesty – kap. 7
Pro nezáporné ohodnocení hran lze uvažovat • O(n2 . lg n + n . |H|) Fibonacci-ho halda • n x Dijkstra ... O(|H| . n . lg n) binární halda • O(n3)fronta jako sekvenční seznam Jak zjistíme nejkratší cesty mezi všemi páry uzlů ? • Označme |U| = n • A pro záporné ohodnocení hran • n x Bellman-Ford ... O(n2. |H|) ~ O(n4) !? • ? Jde to lépe ?ANO ! Nejkratší cesty - kap. 7
Doplňující informace o samotných cestách ukládáme do • matice předchůdcůP = [ pij ] • pij =nil... i=j nebo neexistuje cesta ui uj, • uk... uk je předchůdce uj na cestě ui uj • Graf G reprezentujeme maticí w-délekW (vychází z matice • sousednosti V a zahrnuje současně délky hran w): • 0 pro i = j • wij= w(ui, uj), ij, (ui,uj)H • + jinak • Výsledky získáme ve formě • matice w-vzdálenostíD = [ dij ] : dij = dw(ui,uj) Cesty a matice - odst. 7.1
{u1, u2, ..., uk-1} uj ui uk Algoritmus Floyda-Warshalla • Základní myšlenka: • postupně rozšiřujeme povolené vnitřní uzly minimálních cest: • , {u1}, {u1, u2},..., {u1, u2, ..., uk},..., {u1, u2, ..., un} • cesta P : ui uj s vnitřními uzly z {u1, u2, ..., uk} • dij(k) - délka minimální cesty P • dij(0) = wij • dij(k) = min (dij(k-1) , dik(k-1) + dkj(k-1)) • dij(n) = dij Floyd-Warshall - odst. 7.2
Algoritmus Floyda-Warshalla • 1 D(0)W • 2 for k 1 to n { • 3 for i 1 to n { • 4 for j 1 to n { • 5 dij(k) min (dij(k-1) , dik(k-1) + dkj(k-1)) • 6 } } } • 7 returnD(n) • !!! Časová složitost :O(n3) !!! • ? A co paměťová složitost ? • ?A co, když chceme znát cesty, ne jen vzdálenosti ? Floyd-Warshall - odst. 7.2
Výpočet matice předchůdců: • pij(0) = nilpro i=j nebo wij= • ijinak (tedy pro (ui,uj) H) • pij(k) = pij(k-1)pro dij(k-1) dik(k-1) +dkj(k-1) • pkj(k-1)pro dij(k-1) > dik(k-1) +dkj(k-1) • Reflexivně-tranzitivní uzávěr grafu (relace) • W = V + E • dij(k) = dij(k-1) (dik(k-1) dkj(k-1)) Floyd-Warshall - odst. 7.2
Kontrolní otázky • Podobně jako je při provádění Floyd-Warshallova algoritmu možné počítat matici P předchůdců uzlů na nejkratších cestách, je možné také počítat matici Q následníků uzlů na nejkratších cestách. Určete pravidlo, podle něhož se nastaví počáteční hodnoty prvků qij(0) této matice, a pravidlo pro přechod od (k-1)-ní ke k-té iteraci hodnot qij. • Dalším rozšířením Floyd-Warshallova algoritmu zajistěte, aby po ukončení výpočtu byl znám počet hran na nejkratších cestách mezi všemi uzly (opět ve formě matice označené např. R). (Návod: Inspirujte se řešením obdobného problému pro algoritmus Dikstrův a Bellman-Fordův.) • Zdůvodněte, proč je provádění Floyd-Warshallova algoritmu možné všechny iterace matice D(k) uchovávat v jediném poli. (Návod: Ověřte, že vnitřní dva cykly nemění hodnotu prvků v k-tém řádku a k-tém sloupci, na nichž závisí hodnoty prvků v nové iteraci.) • Jak se při použití Floyd-Warshallova algoritmu zjistí případná existence záporných cyklů v grafu? Nejkratší cesty – kap. 7
Johnsonův aloritmus • Úvaha: (označíme |U|=n) • Pro řídké grafy(|H|<<O(n2)) jeO(|H|.n) lepší než O(n3) • takže O(n.(|H| +n.lg n)) je lepší než O(n3) • Idea: n x Dijkstra (+ Fib. heap), ale co sw(h) < 0 ?? • Přehodnoceníw w' takové, že • pro každé u,v je cesta u v minimální podle w' minimální také podle w • w'(u,v) 0 Johnson - odst. 7.3
? Jak najít přehodnocení w' , které bude zachovávat minimálnost cest? • V:Nechť je pro graf G = H, U s ohodnocením hran • w: H R dána funkce h: U R. Nechť je ohodnocení • w' pro každou hranu (u,v)dané vztahem • w'(u,v) = w(u,v)+h(u)-h(v) • Potom pro cestu L: u v platí, že L je minimální podle w, právě když je minimální podle w'. • D: platí w'(L) = w(L)+h(u)-h(v) • cesta minimální pro w je minimální i pro w' a naopak • Zbývá nalézt vhodné h,aby bylo w'(u,v) 0 !!! Johnson - odst. 7.3
0 s 0 0 0 • položíme h(u)=d(s,u) ... platí h(v) h(u) + w(u,v), tedy • w'(u,v) = w(u,v) + h(u) - h(v) 0 !!! • Úprava G na G': • přidáme uzel s: U' = U {s} • a hrany H = H {(s,u): u U}, w(x) = 0 pro nové hrany x v u Johnson - odst. 7.3
O(n.|H|.lg n) pro binární heap O(n.|H|) • Johnsonův algoritmus • 1 G G' • 2 Bellman-Ford(G',w,s) pokud false STOP • 3 forkaždý uzel uU { h(u) d(s,u) } • 4 forkaždou hranu (u,v)H{ • 5 w'(u,v) w(u,v)+h(u)-h(v) • 6 forkaždý uzel uU { • 7 Dijkstra(G, w', u) • 8 for každý uzel vU { • 9 d(u,v) d'(u,v)-h(u)+h(v) • 10} • 11} O(n2.lg n + n.|H|) (pro Fib. heap) Johnson - odst. 7.3
0 0 0 s 0 0 -2 -2/0 3/1 2/3 3/1 0 3/3 0 4/4 6/7 4/4 1/0 -1/0 0 -1 h(u) = min (0, délka nejkratší cesty s u) w'(u,v) = w(u,v) + h(u) - h(v) Johnson - odst. 7.3
Algebraické souvislosti • Floyd-Warshall: • dij(k) = min (dij(k-1) , dik(k-1) + dkj(k-1)) • dvojoperace min, + • označíme , • efekt složení dvou spojení u v v x • efekt kombinování alternativních spojení u v • ?Jaké vlastnosti musí tyto operace mít, aby to fungovalo? Algebraické souvislosti - odst. 7.4
Polookruh • P= P, , , 0, 1 : • a (b c) = (a b) c P, , 0 • a 0 = 0 a = a je komutativní • a b = b a monoid • a a = a idempotence • a (b c) = (a b) c P, , 1 • a 1 = 1 a = a je monoid • a 0 = 0 a = 0 s nulovým prvkem • a (b c) = (a b) (a c) distributivnost • (b c) a= (b a) (c a) zleva a zprava Teď přijde trochu matematiky, podrobněji viz skripta ... Algebraické souvislosti - odst. 7.4
Uzavřený polookruh: • a1 a2 a3 ... je definováno pro lib. a1, a2, a3, ... a je • asociativní, komutativní, idempotentní a navíc • distributivní vůči • Kdy máme mnoho spojení?Když máme cykly! • Uzávěr c* = 1 c (c c) (c c c) ... • 0* = 1, c c* = c* c, c* = 1 (c* c), ... • Příklady polookruhů • R+ {}, min, +, , 0 a* = min (0, a, a+a, a+a+a, ...) = 0 • R {, -}, min, +, , 0 a* = 0 nebo - (pro a<0) Algebraické souvislosti - odst. 7.4
Řešení obecné úlohy o spojeních • Máme jednoduchý OG G = H,U a ohodnocení • : H P , (h) 0, kde P= P, , , 0, 1 je polookruh. • Doplníme ohodnocení o • (u,v) =0 pro (u,v) H. • Spojení L = u1,u2,...,uk ohodnotíme pomocí jeho hran • (L) = (u1,u2) (u2,u3) ... (uk-1,uk) • takže platí (L1 L2) = (L1) (L2) • (L1 L2 ... Lr) = (L1) (L2) ... (Lr) • Rozšíříme i na množiny spojení {Li}iImezi stejnými uzly • ({Li}iI) = iI (Li) Algebraické souvislosti - odst. 7.4
Ta trocha matematiky pokračuje ... • F-W algoritmus zobecníme, aby pro všechna u,v U počítal • suv = L:uv (L) • Předpokládáme U = {1,2, ...|U|}, L(i,j,k) - všechna spojení z i do j s vnitřními uzly pouze z množiny {1,2,...,k}. • Postupně se počítají • sij(k) = L L(i,j,k)(L) • pomocí rekurence • sij(k) = sij(k-1)(sik(k-1) (skk(k-1))* skj(k-1) ) • a počátečního nastavení • sij(0) = (i,j) pro i j, sij(0) = 1 (i,j) pro i=j Algebraické souvislosti - odst. 7.4
Zobecněný F-W algoritmus • Floyd-Warshall-G(G, ) • 1 for i1 to n { • for j 1 to n {sij(0) (i,j)} • sii(0) 1 (i,i) • 4 } • 5 for k 1 to n { • 6for i 1 to n { • 7for j 1 to n { • 8 sij(k) sij(k-1)(sik(k-1) (skk(k-1))* skj(k-1) ) • 9 } } } • 8 returnS(n) za co je tam ta 1 ??? Algebraické souvislosti - odst. 7.4
A tohle je několik výsledků ... • Pro polookruh • R+ {}, min, +, , 0 a* = min (0, a, a+a, a+a+a, ...) = 0 • uzávěrový činitel (skk(k-1))*odpadá sij(k) = sij(k-1)(sik(k-1) skj(k-1) ) • Pro polokruh • R {, -}, min, +, , 0 a* = 0 nebo - (pro a<0) • hodnota(skk(k-1))* je - pokud spojení z u do v prochází cyklem < 0 • P = 0,1, max, . , 0, 1a*=1 - nejspolehlivější spojení • P = Rk, max, min , rmin, rmax - spojení s maximální propustností • Rk je konečná množina reálných čísel Algebraické souvislosti - odst. 7.4
Kontrolní otázky • Jak je třeba definovat operace a a nosič (tj. množinu P) v odpovídajícím polookruhu, aby zobecněný Floyd-Warshallův algoritmus určil počet různých spojení mezi jednotlivými dvojicemi uzlů. Nejkratší cesty – kap. 7