html5-img
1 / 46

Wykład 6

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:E  R przyporządkowującą krawędziom wagi o wartościach rzeczywistych .

tracey
Download Presentation

Wykład 6

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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

  2. Wagi • Niech będzie dany ważony graf skierowany G=(V,E) z funkcją wagową w:ER 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:

  3. Warianty najkrótszych ścieżek • Najkrótsze ścieżki z jednym źródłem • Najkrótsze ścieżki z jednym wierzchołkiem docelowymNajkrótsza ścieżka między parą wierzchołków. • Najkrótsze ścieżki miedzy wszystkimi parami wierzchołków.

  4. 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 vV 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)=-∞.

  5. Krawędzie z ujemnymi wagami

  6. Reprezentacja najkrótszych ścieżek • . Dla danego grafu G=(V,E) dla każdego wierzchołka vV 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.

  7. 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={vV:[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:vV-{s}}

  8. Reprezentacja najkrótszych ścieżek • Niech graf G=(V,E) będzie ważonym grafem z funkcją wagową w:ER. Załóżmy, że graf G nie zawiera cykli o ujemnych wagach, które są osiągalne z wierzchołka źródłowego sV. 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 vV’ jedyna ścieżka z s do v w grafie G’ jest najkrótszą ścieżką z s do v w grafie G.

  9. 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:ER 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 1ijk, 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.

  10. Optymalna podstruktura najkrótszej ścieżki

  11. Optymalna podstruktura najkrótszej ścieżki • Lemat 6.3 • Niech G=(V,E) będzie ważonym grafem skierowanym z funkcją wagową w:ER i źródłem s. Wtedy dla każdej krawędzi (u,v)E zachodzi zależność (s,v)(s,u)+w(u,v).

  12. Relaksacja • Relaksacja polega na wielokrotnym zmniejszaniu górnego ograniczenia aż się dojdzie do rzeczywistej najkrótszej ścieżki.

  13. Procedura nadająca wartości początkowe atrybutom  i d. INITIALIZE-SINGLE-SOURCE(graf G, źródło s) For każdy wierzchołek vV[G] do d[v]=∞ [v] =NIL d[s]=0 • Po fazie inicjowania mamy [v]=NIL dla każdego vV, d[v]=0 dla v=s oraz d[v]=∞, dla vV-s.

  14. 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

  15. Własności relaksacji • Lemat 6.4 • Niech G=(V,E) będzie ważonym grafem skierowanym z funkcją wagową w:ER 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:ER. Niech sV 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 vV 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.

  16. Własności relaksacji • Wniosek 6.6 • Załóżmy, że w ważonym grafie skierowanym G=(V,E) z funkcją wagową w:ER nie istnieje ścieżka ze źródła sV do danego wierzchołka vV. 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:ER, niech sV będzie wierzchołkiem źródłowym i niech suv będzie najkrótszą ścieżką w grafie G dla pewnych wierzchołków u,vV. 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).

  17. Drzewo najkrótszych ścieżek • Lemat 6.8 • Niech G=(V,E) będzie ważonym grafem skierowanym z funkcją wagową w:ER i wierzchołkiem źródłowym sV. 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:ER i wierzchołkiem źródłowym sV. 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 vV, to podgraf poprzedników G jest drzewem najkrótszych ścieżek o korzeniu w s.

  18. 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 vV, 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 ifv.d>u.d+w(u,v) 7 return FALSE 8 return TRUE

  19. Lemat 6.10 • Niech G=(V,E) będzie ważonym grafem skierowanym ze źródłem s i funkcją wagową w:ER. 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:ER. Załóżmy, że G nie ma cykli o ujemnych wagach osiągalnych ze źródła s. Wówczas dla każdego wierzchołka vV 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<∞.

  20. 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:ER. 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 vV 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.

  21. 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 uV-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.

  22. 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}

  23. s - 1 koniec - 6

  24. 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 uV. • 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.

  25. Najkrótsze ścieżki między wszystkimi parami wierzchołków • Mamy dany ważony graf skierowany G=(V,E) z funkcją wagową w:ER, 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.

  26. 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 iV definiujemy podgraf poprzedników grafu G dla wierzchołka i jako graf G,i=(V,i,E,i) w którym • V,i ={jV:ijNIL}{i} • oraz • E,i ={(ij,, j):jV,i –{i}}.

  27. 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

  28. 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.

  29. 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,jV 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}.

  30. Rekurencyjne rozwiązanie problemu najkrótszych ścieżek między wszystkimi parami wierzchołków

  31. 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)

  32. 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.

  33. Przykład (Źródło: Cormen)

  34. 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.

  35. Otrzymywanie nieujemnych wag

  36. Algorytm Johnsona

  37. Bibliografia • Cormen Thomas; Leiserson Charles; Rivest Ronald; Stein Clifford, „Wprowadzenie do Algorytmów”, Wydawnictwo Naukowe PWN, Warszawa 2012,

More Related