Wykład 9 Znajdowanie najlepszej drogi 1
Algorytmy znajdowania najkrótszyh śieżek Właśiwośi najkrótszyh śieżek Algorytm Bellmana-Forda Algorytm Dijsktry Literatura Cormen, Leiserson, Rivest, Wprowadzenie do algorytmów, rozdz.
Grafy z wagami - powtórzenie Grafem z wagami nazywamy graf, dla którego każdej krawędzi przypisana jest waga (koszt): w(v i, v j ) > 0. Każdy graf może być traktowany jako graf z wagami jeśli przyjąć wagę 1 dla każdej krawędzi. Dodatkowo jeśli wierzhołki nie są połązone to można przyjąć, że krawędź łąząa je (nieistniejąa) ma wagę. 1 3 4 4 8 1 Koszt śieżki = suma kosztów krawędzi ją tworząyh: k i= 1 ( ) = w( v, v ) w p i 1 i 3
Przykład grafu z wagami a 1 b s 10 3 9 4 d 4
Dwie podstawowe własnośi dla najkrótszyh śieżek Nierówność trójkąta nieh G=(V,E) będzie skierowanym grafem z wagami, w: E R funkją kosztu, a s V wierzhołkiem pozątkowym. Wtedy dla każdej krawędzi e=(u,v) E: δ(s,v) δ(s,u) + w(u,v) Struktura optymalnej śieżki nieh p = <v 1,.. v k > będzie najkrótsząśieżką pomiędzy v 1 i v k. Wtedy jej podśieżka p ij = <v i,.. v j >, dla 1 i,j k, jest najkrótsząśieżka pomiędzy v i i v j.
Krawędzie o ujemnyh wagah W niektóryh zadaniah mogą pojawić się koszty ujemne. Najkrótsze śieżki są dobrze zdefiniowane tylko dla zadań z nieujemnymi kosztami śieżek jeśli dopuśimy koszty ujemne każda droga może być pomniejszona poprzez dodanie yklu o wartośi ujemnej - 10 a b 1 3-1 Można dopuśić ujemne wagi, ale nie można ykli o koszie ujemnym (w przykładzie a->b->->a ma koszt -1)!
Najkrótsze drogi, a ykle Najkrótsza śieżka pomiędzy dwoma dowolnymi węzłami nie zawiera ykli. Reprezentaja najkrótszyh śieżek pomiędzy wybranym węzłem, a wszystkimi pozostałymi jest taka sama jak dla drzewa (podgrafu poprzedników) w BFS (breath-first tree): G π = (V π,e π ) takie, że V π = {v V: π[v] null} {s} i E π = {(π[v],v), v V {s}} Udowodnimy, że drzewo BFS jest drzewem najkrótszyh śieżek z korzeniem w wybranym węźle.
Przykład drzewa najkrótszyh śieżek 1 0 s 3 3 9 a 1 4 3 b d 11 8
Przykład drzewa najkrótszyh śieżek 0 s 3 3 9 a 1 4 3 b d 11 9
Metoda kolejnyh przybliżeń Podobnie, jak dla BFS (dla grafów bez wag) przehowujemy etykietę, która jest kolejnym przybliżeniem kosztu najlepszej drogi z s do v. Pozątkowo, dist[s] = 0 oraz dist[v] = dla wszystkih v s, π[v] = null. Dla kolejnyh iteraji algorytmu: dist[v] δ(s,v). I na konie: dist[v] = δ(s,v) i (π[v],v) E π 10
Relaksaja Proes relaksaji krawędzi (inazej osłabiania ogranizeń) (u,v) polega na sprawdzaniu, zy możemy poprawić najlepsząśieżkę z s do v jeśli droga będzie wiodła przez wierzhołek u. Relax(u,v) if dist[v] > dist[u] + w(u,v) then dist[v] dist[u] + w(u,v) π[v] u 11
Własnośi relaksaji Nierówność trójkąta e = (u,v) E: δ(s,v) δ(s,u) + w(u,v) Własność ogranizenia górnego v V: dist[v] δ(s,v) Własność braku drogi jeżeli nie istnieje droga z s do v, to: dist[v]=δ(s,v) = 1
Własnośi relaksaji Własność zbieżnośi jeżeli s u v jest najkrótsząśieżką w G dla pewnego u i v, oraz dist[u]= δ(s,u) zawsze przed wykonaniem relaksaji krawędzi (u,v), to również dist[v]=δ(s,v) zawsze po relaksaji. Własność relaksaji śieżki nieh p = <v 0,.. v k > będzie najkrótsząśieżką pomiędzy v 0 i v k. Jeżeli relaksaja krawędzi jest przeprowadzana w kolejnośi (v 0, v 1 ), (v 1, v ), (v k-1, v k ), to dist[v k ]=δ(s,v k ).. 13
Algorytmy wyznazania najkrótszyh śieżek 1. Algorytm Bellmanna-Forda. Algorytm Dijkstry uogólnienie BFS 14
Algorytm Bellmana-Forda przegląd Dopuszza ujemne wagi. Jeśli napotkany zostaje ykl o wadze ujemnej zwraane jest negative yle. Idea: Istnieje najlepsza droga od s do każdego innego wierzhołka nie zawierająa ykli dodatnih (ykle muszą zostać wyeliminowane). Maksymalna ilość krawędzi w takiej śieże wynosi V 1, ponieważ w śieże bez ykli może być o najwyżej V wierzhołków. wystarzy sprawdzaćśieżki do V 1 wierzhołków. 1
Algorytm Bellmana-Forda for if ( ) for każdego u, v E doif dist[v] > dist[u] + w u, v dist[ v] dist[ u] + w( u, v) π[ v] u ( ) Bellman- Ford( G, s) Initialize( G, s) fori 1to V 1 ( u, v ) E [ v] > d[ u] + w( u, v ) return"negativeyle" każdego dist 1
Przykład: algorytm Bellmana-Forda (1) 0 s 8 a - -3-4 9 b d (a,b) (a,) (a,d) (b,a) (,b) (,d) (d,s) (d,b) (s,a) (s,b) 1
Przykład: algorytm Bellmana-Forda () 0 s 8 a - b -3-4 9 d (a,b) (a,) (a,d) (b,a) (,b) (,d) (d,s) (d,b) (s,a) (s,) 18
Przykład: algorytm Bellmana-Forda (3) 0 s 8 11 4 a - b -3-4 9 d (a,b) (a,) (a,d) (b,a) (,b) (,d) (d,s) (d,b) (s,a) (s,) 19
Przykład: algorytm Bellmana-Forda (4) 0 s 8 4 a - b -3-4 9 d (a,b) (a,) (a,d) (b,a) (,b) (,d) (d,s) (d,b) (s,a) (s,b) 0
Przykład: algorytm Bellmana-Forda () 0 s 8 4 a - b -3-4 9 d - (a,b) (a,) (a,d) (b,a) (,b) (,d) (d,s) (d,b) (s,a) (s,b) 1
Własnośi algorytmu Bellmana-Forda Przy pierwszym przejśiu krawędzi tylko sąsiedzi s są rozpatrywani (śieżki o długośi 1). Znajdujemy wszystkie najlepsze śieżki do tyh węzłów. Przy drugim przejśiu znajdujemy najlepsze drogi o długośi. Po V -1 przejśiah, sprawdzone zostały wszystkie możliwośi. Cel: staramy się poprawićśieżkę z poprzedniego przebiegu jeśli jest to możliwe, bez tworzenia ujemnego yklu.
Złożoność algorytmu Bellmana-Forda odwiedzenie V 1 wierzhołków O( V ) Przeprowadzanie relaksaji dla wszystkih krawędzi O( E ) Łąznie, O( V. E ) dla zasu i O( V + E ) dla pamięi. 3
Algorytm Bellmana-Forda dla DAG Dla skierowanyh grafów aykliznyh (Direted Ayli Graphs - DAG), wystarzająe jest relaksaji O( V + E ) jeśli wierzhołki są odwiedzane w porządku topologiznym (jeśli graf zawiera krawędź (u,v) to wierzhołek u występuje przed wierzhołkiem v): DAG-Shortest-Path(G) 1. Posortuj topologiznie wierzhołki grafu G. Inijuj G (dist[v] i π(v)) z wierzhołkiem s jako źródłem. 3. for każdego wierzhołka u do 4. for każdego wierzhołka v połązonego z u do. Relax(u,v) 4
Przykład: algorytm Bellmana-Forda dla DAG (1) a 0 s 1 b -1 d - e 3 4 Wierzhołki są posortowane od lewej do prawej
Przykład: algorytm Bellmana-Forda dla DAG () a 0 s 1 b -1 d - e 3 4
Przykład: algorytm Bellmana-Forda dla DAG (3) a 0 s 1 b -1 d - e 3 4
Przykład: algorytm Bellmana-Forda dla DAG(4) a 0 s 1 b -1 d - 4 e 3 4 8
Przykład: algorytm Bellmana-Forda dla DAG () a 0 s 1 b -1 d - 4 e 3 4 9
Przykład: algorytm Bellmana-Forda dla DAG () a 0 s 1 b -1 d - 3 e 3 4 30
Przykład: algorytm Bellmana-Forda dla DAG () a 0 s 1 b -1 d - 3 e 3 4 31
Poprawność algorytmu Bellmana-Forda dla DAG Własność relaksaji śieżki nieh p = <v 0,.. v k > będzie najkrótsząśieżką pomiędzy v 0 i v k. Jeżeli relaksaja śieżek jest przeprowadzana w kolejnośi (v 0, v 1 ), (v 1, v ), (v k-1, v k ), to dist[v k ]=δ(s,v k ). Dla DAG, mamy dobry porządek wierzhołków! Stąd złożoność: O( V + E ). 3
Algorytm Dijkstry - przegląd Idea: robimy to samo o przy BFS dla grafów bez wag, z różniami: Korzystamy z funkji kosztu jako odległośi Korzystamy z kolejki priorytetowej zamiast zwykłej kolejki. 33
Algorytm BFS BFS(G, s) dist[s] = 0; π[s] = null for dla wszystkih wierzhołków u z V {s} do label[u] not_visited; dist[u] = ; π[u] = null EnQueue(Q,s) while Q is not empty do u DeQueue(Q) for każdego v, który jest sąsiadem u do if label[v] = not_visited then dist[v] dist[u] + 1; π[v] u EnQueue(Q,v) label[u] visited 34
Przykład: algorytm BFS a b s d 3
Przykład: algorytm Dijkstry a 1 b 0 s 10 3 9 4 d 3
Algorytm Dijkstry Dijkstra(G, s) dist[s] = 0; π[u] = null for dla wszystkih wierzhołków u w V {s} do label[u] not_visited; dist[u] = ; π[u] = null Q s while Q is not empty do u Extrat-Min(Q) for każdego v, sąsiada of u do if label[v] = not_visited then if d[v] > d[u] + w(u,v) then d[v] d[u] + w(u,v);π[v] = u Insert-Queue(Q,v) label[u] = visited 3
Przykład: algorytm Dijkstry (1) a 1 b 0 s 10 3 9 4 d 38
Przykład: algorytm Dijkstry () 10 a 1 b 0 s 10 3 9 4 d 39
Przykład: algorytm Dijkstry (3) 8 14 a 1 b 0 s 10 3 9 4 d 40
Przykład: algorytm Dijkstry (4) 8 13 a 1 b 0 s 10 3 9 4 d 41
Przykład: algorytm Dijkstry () 8 9 a 1 b 0 s 10 3 9 4 d 4
Przykład: algorytm Dijkstry () 8 9 a 1 b 0 s 10 3 9 4 d 43
Poprawność algorytmu Dijkstry Twierdzenie: po zakońzeniu algorytmu Dijkstry, dla każdego wierzhołka v V, mamy dist[v] = δ(s,v). Definija: śieżkę z s do v będziemy nazywać spejalną jeśli jest to najkrótsza śieżka, dla której wszystkie wierzhołki (być może poza v) należą do S zbiór wierzhołków, dla któryh oblizono już najlepsze śieżki z s. Lemmat: na konie każdej iteraji pętli while, zahodzą dwie własnośi: 1. Dla każdego w S, dist[w] jest długośią najkrótszej śieżki z s do w.. Dla każdego w V S, dist(w) jest długośią najkrótszej spejalnej śieżki z s do w. Twierdzenie zahodzi, gdy S = V. 44
Złożoność algorytmu Dijkstry Algorytm przeprowadza V operaji Get-Min oraz E operaji EnQueue. Jeśli kolejka priorytetowa jest implementowana jako kopie (heap), wstawianie zabiera O(lg V ) a Get-Min O(lg( V ). Całkowity zas: O( V lg V ) + O( E lg V ) = O( E lg V ) Jeśli E = O( V ), nie dostajemy optymalnośi. W tym wypadku, przeprowadzamy wielokrotnie więej operaji wstawiania, niż wyjmowania. Rozwiązanie: implementaja tabliowa! Wstawianie zajmujeo(1) i Get-Min O( V ) O( V ) + O( E ) = O( V ) o jest lepsze niż dla niż dla kopa póki E jest O( V /lg ( V )). 4
Podsumowanie Rozwiązanie problemu najkrótszyh śieżek dla grafu odbywa się za pomoą relaksaji, opartej na nierównośi trójkąta: dla każdej krawędzi e=(u,v) E: δ(s,v) δ(s,u) + w(u,v) Mamy dwa algorytmy rozwiązująe ten problem: Bellmana-Forda: dla każdego wierzhołka, relaksaja po wierzhołkah. Zajmuje to zas O( E. V ). Działa dla grafów bez ykli ujemnyh. Dijkstry: podobny do BFS, działa w zasie O( E lg V ). 4