Wykład 6 Najkrótsza ścieżka w grafie z jednym źródłem Najkrótsze ścieżki między wszystkimi parami wierzchołków
Wagi Niech będzie dany ważony graf skierowany G=(V,E) z funkcją wagową w:ER przyporządkowującą krawędziom wagi o wartościach rzeczywistych. Wagą ścieżki s=<v0, v1, …, vk> nazywamy sumę wag tworzących ją krawędzi: Natomiast wagę najkrótszej ścieżki z wierzchołka u do wierzchołka v definiujemy jako:
Warianty najkrótszych ścieżek Najkrótsze ścieżki z jednym źródłem Najkrótsze ścieżki z jednym wierzchołkiem docelowym Najkrótsza ścieżka między parą wierzchołków. Najkrótsze ścieżki miedzy wszystkimi parami wierzchołków.
Krawędzie z ujemnymi wagami Jeśli żaden cykl o ujemnej wadze nie jest osiągalny ze źródła s, to dla każdego wierzchołka vV waga najkrótszej ścieżki (s,v) jest dobrze zdefiniowana, nawet jeśli ma wartość ujemną. Jeżeli jednak cykl o ujemnej wadze jest osiągalny ze źródła s, to wagi najkrótszych ścieżek nie są dobrze zdefiniowane. Jeżeli pewna ścieżka z s do v zawiera cykl o ujemnej wadze, to definiujemy (s,v)=-∞.
Krawędzie z ujemnymi wagami
Reprezentacja najkrótszych ścieżek . Dla danego grafu G=(V,E) dla każdego wierzchołka vV poprzednik zapamiętujemy przez [v], gdzie jest to albo inny wierzchołek albo wartość NIL. Szukając najkrótszej ścieżki zaczynamy od wierzchołka v i czytając w porządku odwrotnym szukamy ciągu poprzedników aż dojdziemy do źródła s.
Reprezentacja najkrótszych ścieżek Zdefiniujemy zbiór wierzchołków V jako zbiór tych wierzchołków grafu G, których poprzedniki są różne od NIL plus wierzchołek s: V={vV:[v]NIL}{s} Zbiorem krawędzi skierowanych E jest zbiór krawędzi indukowany przez wartości dla wierzchołków z V: E={([v], v)E:vV-{s}}
Reprezentacja najkrótszych ścieżek Niech graf G=(V,E) będzie ważonym grafem z funkcją wagową w:ER. Załóżmy, że graf G nie zawiera cykli o ujemnych wagach, które są osiągalne z wierzchołka źródłowego sV. Tak więc najkrótsze ścieżki są dobrze zdefiniowane. Drzewem najkrótszych ścieżek o korzeniu w s nazywamy podgraf skierowany G’=(V’,E’), w którym V’V, E’E, taki, że: V’ jest zbiorem wierzchołków w grafie G osiągalnych z s. G’ jest drzewem z korzeniem; s jest korzeniem drzewa. Dla każdego wierzchołka vV’ jedyna ścieżka z s do v w grafie G’ jest najkrótszą ścieżką z s do v w grafie G.
Optymalna podstruktura najkrótszej ścieżki Każda najkrótsza ścieżka między dwoma parami wierzchołków zawiera w sobie inne najkrótsze ścieżki. Lemat 6.1 (Podścieżki najkrótszych ścieżek są najkrótszymi ścieżkami) Niech będzie dany ważony graf skierowany G=(V,E) z funkcją wagową w:ER i niech najkrótsza ścieżka z wierzchołka v1 do wierzchołka vk będzie p=<v1,v2, …, vk> oraz dla każdych i,j takich, że 1ijk, niech pij=<vi, vi+1, …,vj> będzie podścieżką p z wierzchołka vi do wierzchołka vj. Wtedy pij jest najkrótszą ścieżką z vi do vj.
Optymalna podstruktura najkrótszej ścieżki
Optymalna podstruktura najkrótszej ścieżki Lemat 6.3 Niech G=(V,E) będzie ważonym grafem skierowanym z funkcją wagową w:ER i źródłem s. Wtedy dla każdej krawędzi (u,v)E zachodzi zależność (s,v) (s,u)+w(u,v).
Relaksacja Relaksacja polega na wielokrotnym zmniejszaniu górnego ograniczenia aż się dojdzie do rzeczywistej najkrótszej ścieżki.
Procedura nadająca wartości początkowe atrybutom i d. INITIALIZE-SINGLE-SOURCE(graf G, źródło s) For każdy wierzchołek vV[G] do d[v]=∞ [v] =NIL d[s]=0 Po fazie inicjowania mamy [v]=NIL dla każdego vV, d[v]=0 dla v=s oraz d[v]=∞, dla vV-s.
Relaksacja krawędzi Relaksacja krawędzi (u,v) polega na sprawdzeniu, czy przechodząc przez wierzchołek u, można znaleźć krótszą od dotychczas najkrótszej ścieżki do v, i jeśli taka możliwość istnieje, na zaktualizowaniu d[v] oraz [v]. RELAX(u,v,w) if d[v]>d[u]+w(u,v) then d[v]=d[u]+w(u,v) [v]=u
Własności relaksacji Lemat 6.4 Niech G=(V,E) będzie ważonym grafem skierowanym z funkcją wagową w:ER i niech (u,v)E. Wtedy bezpośrednio po wykonaniu RELAX(u, v, w) zachodzi zależność d[v]d[u]+w(u,v). Lemat 6.5 Niech G=(V,E) będzie ważonym grafem skierowanym z funkcją wagową w:ER. Niech sV będzie wierzchołkiem źródłowym i załóżmy, że została wykonana procedura inicjująca INITIALIZE-SINGLE-SOURCE(G, s). Wtedy dla każdego wierzchołka vV zachodzi zależność d[v](s,v) i warunek ten jest niezmiennikiem dowolnego ciągu relaksacji krawędzi grafu G. Ponadto kiedy tylko d[v] osiągnie swoje dolne ograniczenie (s,v), nigdy więcej nie ulega zmianie.
Własności relaksacji Wniosek 6.6 Załóżmy, że w ważonym grafie skierowanym G=(V,E) z funkcją wagową w:ER nie istnieje ścieżka ze źródła sV do danego wierzchołka vV. Wtedy po fazie inicjowania za pomocą procedury INITIALIZE-SINGLE-SOURCE(G,s) mamy d[v]=(s,v) i równość ta jest niezmiennikiem dowolnego ciągu relaksacji krawędzi grafu G. Lemat 6.7 Niech G=(V,E) będzie ważonym grafem skierowanym z funkcją wagową w:ER, niech sV będzie wierzchołkiem źródłowym i niech s uv będzie najkrótszą ścieżką w grafie G dla pewnych wierzchołków u,vV. Przypuśćmy, że została wykonana procedura inicjująca INITIALIZE-SINGLE-SOURCE(G,s), a następnie został wykonany ciąg kroków relaksacji zawierający wywołanie procedury RELAX(u,v,w). Jeśli w dowolnej chwili przed wywołaniem procedury RELAX (u,v,w) zachodzi d[u]=(s,u), to po wykonaniu tej procedury zawsze zachodzi d[v]=(s,v).
Drzewo najkrótszych ścieżek Lemat 6.8 Niech G=(V,E) będzie ważonym grafem skierowanym z funkcją wagową w:ER i wierzchołkiem źródłowym sV. Załóżmy, że graf G nie ma cykli o ujemnych wagach, które są osiągalne ze źródła s. Wtedy po fazie inicjowania za pomocą procedury INITIALIZE- SIGNLE-SOURCE(G,s) graf poprzedników G jest drzewem z korzeniem w s, a własność ta jest niezmiennikiem każdego ciągu kroków relaksacji wykonywanych na krawędziach grafu G. Lemat 6.9 Niech G=(V,E) będzie ważonym grafem skierowanym z funkcją wagową w:ER i wierzchołkiem źródłowym sV. Załóżmy, że graf G nie zawiera cykli o ujemnych wagach, które są osiągalne ze źródła s. Jeśli po wykonaniu procedury inicjującej INITIALIZE-SINGLE- SOURCE(G,s), a następnie po wykonaniu dowolnego ciągu kroków relaksacji na krawędziach grafu G zachodzi d[v]=(s,v) dla wszystkich vV, to podgraf poprzedników G jest drzewem najkrótszych ścieżek o korzeniu w s.
Algorytm Bellmana-Forda W algorytmie Bellmana-Forda wykorzystuje się metodę relaksacji, zmniejszając stopniowo oszacowanie v.d na wagę najkrótszej ścieżki ze źródła s do każdego wierzchołka vV, aż zostanie osiągnięta rzeczywista waga najkrótszej ścieżki (s,). Algorytm zwraca wartość logiczną TRUE wtedy i tylko wtedy, gdy graf nie zawiera cykli o ujemnych wagach osiągalnych ze źródła. BELLMAN-FORD(graf G, wagi w, źródło s) 1 INITIALIZE-SINGLE-SOURCE(G,s) 2 for i=1 to |G.V|-1 3 for każda krawędź (u,v)G.E 4 RELAX(u,v,w) 5 for każda krawędź (u,v)G.E 6 if v.d>u.d+w(u,v) 7 return FALSE 8 return TRUE
Lemat 6.10 Niech G=(V,E) będzie ważonym grafem skierowanym ze źródłem s i funkcją wagową w:ER. Załóżmy, że G nie ma cykli o ujemnych wagach osiągalnych ze źródła s. Wtedy po wykonaniu |V|-1 przebiegów pętli for w wierszach 2 – 4 procedury BELLMAN-FORD zachodzi równość v.d=(s,v) dla wszystkich wierzchołków v osiągalnych ze źródła s. Wniosek 6.11 Niech G=(V<E) będzie ważonym grafem skierowanym ze źródłem s i funkcją wagową w:ER. Załóżmy, że G nie ma cykli o ujemnych wagach osiągalnych ze źródła s. Wówczas dla każdego wierzchołka vV istnieje ścieżka ze źródła s do v wtedy i tylko wtedy, gdy po zakończeniu wykonywania procedury BELLMAN-FORD dla grafu G zachodzi zależność v.d<∞.
Twierdzenie 6.12 na poprawność algorytmu Bellmana-Forda Niech G=(V,E) będzie ważonym grafem skierowanym ze źródłem s i funkcją wagową w:ER. Załóżmy, że dla grafu G została wykonana procedura BELLMAN-FORD. Jeśli graf G nie ma cykli o ujemnych wagach osiągalnych ze źródła s, to algorytm zwraca wartość TRUE, zachodzi v.d=(s,v) dla każdego wierzchołka vV i graf poprzedników G jest drzewem najkrótszych ścieżek o korzeniu w s. Jeśli natomiast graf G ma cykl o ujemnej wadze osiągalny z s, to algorytm zwraca wartość FALSE.
Algorytm Dijkstry Służy do szukania najkrótszej ścieżki w grafie ważonym i skierowanym G=(V,E) w przypadku gdy wagi wszystkich krawędzi są nieujemne czyli, że w(u,v)0 dla każdej krawędzi (u,v)E. W algorytmie Dijkstry zapamiętujemy zbiór S składający się z wierzchołków dla których wagi najkrótszych ścieżek ze źródła s zostały już obliczone. W każdym kroku powtarzamy operacje: wybór wierzchołka uV-S o najmniejszym oszacowaniu wagi najkrótszej ścieżki, dodanie wierzchołka u do S i wykonanie relaksacji krawędzi wychodzących z wierzchołka u.
Algorytm Dijkstry-pseudokod Wykorzystano tu kolejkę priorytetową Q typu min, w której wierzchołki są zorganizowane według wartości d. DIJKSTRA( graf G, wagi w, źródło s) INITIALIZE-SINGLE-SOURCE(G,s) S= Q=G.V while Q u=EXTRACT-MIN(Q) S=S{u}
s - 1 koniec - 6 wierzch. Nr j d 1 2 ∞ 3 4 8 5 - 6
Twierdzenie 6.13 (Poprawność algorytmu Dijkstry) Algorytm Dijkstry uruchomiony dla ważonego grafu skierowanego G=(V,E) z nieujemną funkcją wagową w i źródłem s kończy swoje działanie z u.d=(s,u) dla każdego wierzchołka uV. Wniosek 6.14 Jeśli wykonamy algorytm Dijkstry dla ważonego grafu skierowanego G=(V,E) z nieujemną funkcją wagową w i źródłem s, to po zakończeniu jego działania graf poprzedników G jest drzewem najkrótszych ścieżek z korzeniem w s.
Najkrótsze ścieżki między wszystkimi parami wierzchołków Mamy dany ważony graf skierowany G=(V,E) z funkcją wagową w:ER, która przypisuje krawędziom wagi o wartościach rzeczywistych. Dla każdej pary wierzchołków u,v V należy znaleźć najkrótszą (o najmniejszej wadze) ścieżkę z wierzchołka u do v, gdzie waga ścieżki jest sumą wag jej składowych krawędzi. Wynik będzie zapisany w macierzy, której element w u-tym wierszu i v-tej kolumnie powinien być wagą najkrótszej ścieżki z wierzchołka u do v. Problem można rozwiązać wykonując |V| razy algorytm dla problemu najkrótszych ścieżek z jednym źródłem dla każdego z wierzchołków. W zależności od tego czy dopuszczamy wagi ujemne czy też nie możemy wykorzystać odpowiednio algorytm Bellmana-Forda lub Dijkstry.
Macierz poprzedników oznaczmy jako =(ij) Macierz poprzedników oznaczmy jako =(ij). Jeśli i=j lub nie istnieje ścieżka z i do j, to ij jest równe NIL. W przeciwnym razie ij jest poprzednikiem j na pewnej najkrótszej ścieżce z i do j. Tak jak graf G jest drzewem najkrótszych ścieżek dla pewnego wierzchołka źródłowego, tak podgraf indukowany przez i-ty wiersz macierzy jest drzewem najkrótszych ścieżek o korzeniu i. Dla każdego wierzchołka iV definiujemy podgraf poprzedników grafu G dla wierzchołka i jako graf G,i=(V,i,E,i) w którym V,i ={jV:ijNIL}{i} oraz E,i ={(ij,, j):jV,i –{i}}.
Procedura wypisywania najkrótszej ścieżki PRINT-ALL-PAIRS-SHORTEST- PATH(,i,j) if i==j wypisz i elseif ij==NIL wypisz „brak ścieżki z i do j” else PRINT-ALL-PAIRS- SHORTEST-PATH(, i, ij) wypisz j
Algorytm Floyda-Warshalla Czas działania tego algorytmu wynosi (V3). Dopuszczamy występowanie krawędzi o ujemnych wagach z tym ,ze zakładamy, że w grafie nie ma cykli o wagach ujemnych.
Struktura najkrótszej ścieżki Wewnętrznym wierzchołkiem ścieżki prostej p=<v1,v2,…,vl> jest każdy wierzchołek ze ścieżki p różny od v1 i vl, tzn. każdy wierzchołek ze zbioru {v2,v3,…,vl-1}. Niech zbiorem wierzchołków grafu G będzie V={1,2,…,n}. Dla pewnego k rozważmy podzbiór {1,2,…,k}, a dla każdej pary wierzchołków i,jV rozważmy wszystkie ścieżki z wierzchołka i do wierzchołka j, których wewnętrzne wierzchołki należą do zbioru {1,2,…,k}. Niech p będzie taką ścieżką p a najkrótszymi ścieżkami z i do j, których wszystkie wewnętrzne wierzchołki należą do zbioru {1,2,…,k-1}.
Rekurencyjne rozwiązanie problemu najkrótszych ścieżek między wszystkimi parami wierzchołków
Obliczanie wag najkrótszych ścieżek metodą wstępującą Dane wejściowe procedury stanowi macierz W wymiaru nxn. W wyniku działania procedury powstaje macierz wag najkrótszych ścieżek D(n). FLOYD-WARSHALL(W) n=W.rows D(0)=W for (int k=1;k<=n;k++) niech D(k)=(dij(k)) będzie nową macierzą nxn for (int i=1; i<=n; i++) for(int j=1;j<=n;j++) dij(k)=min(dij(k-1), dik(k-1)+ dkj(k-1)) return D(n)
Konstruowanie najkrótszej ścieżki Można znaleźć kilka metod konstruowania najkrótszych ścieżek w algorytmie Floyda-Warshall. Jedną z nich jest obliczenie macierzy poprzedników przy wykorzystaniu macierzy D. Wówczas wystarczy użyć procedury PRINT-ALL- PAIRS-SHORTEST-PATH do wypisania wierzchołków żądanej najkrótszej ścieżki. Macierz poprzedników można także obliczać na bieżąco, razem z obliczaniem macierzy D(k). Oznacza to obliczenie ciągu macierzy (0), (1), …, (n), gdzie =(n) i ij(k) jest poprzednikiem wierzchołka j na najkrótszej ścieżce z wierzchołka i, której wszystkie wewnętrzne wierzchołki należą do zbioru {1,2,…,k}. Poprzednik ij(k) można określić rekurencyjnie. Gdy k=0, najkrótsza ścieżka z wierzchołka i do wierzchołka j nie ma w ogóle wewnętrznych wierzchołków.
Przykład (Źródło: Cormen)
Algorytm Johnsona Algorytm Johnsona znajdowania najkrótszych ścieżek między wszystkimi parami wierzchołków działa w czasie O(V2lg V+VE). Algorytm Johnsona albo zwraca macierz wag najkrótszych ścieżek dla wszystkich wierzchołków, albo informuje, że graf wejściowy ma cykl o ujemnej wadze. W algorytmie Johnsona jako podprogramy są używane algorytm Dijkstry i algorytm Bellmana-Forda.
Otrzymywanie nieujemnych wag
Algorytm Johnsona
Bibliografia Cormen Thomas; Leiserson Charles; Rivest Ronald; Stein Clifford, „Wprowadzenie do Algorytmów”, Wydawnictwo Naukowe PWN, Warszawa 2012,