200 likes | 402 Views
ALGORYTMY I STRUKTURY DANYCH. WYKŁAD 12 Algorytmy na grafach - metoda zachłanna Grażyna Mirkowska PJWSTK, 2002/2003. Plan wykładu. Idea algorytmów zachłannych Problem drzew rozpinających Chodzenie po grafie ze stosem i kolejką Algorytm Kruskala Problem najkrótszych ścieżek
E N D
ALGORYTMY I STRUKTURY DANYCH WYKŁAD 12 Algorytmy na grafach - metoda zachłanna Grażyna Mirkowska PJWSTK, 2002/2003
Plan wykładu • Idea algorytmów zachłannych • Problem drzew rozpinających • Chodzenie po grafie ze stosem i kolejką • Algorytm Kruskala • Problem najkrótszych ścieżek • Algorytm Dijkstry G. Mirkowska, ASD_12 Algorytmy na grafach
Na czym to polega? „Greedy” algorithms ZASADA W każdym kroku, w którym trzeba dokonać wyboru, wybierać zawsze rozwiązanie lokalnie optymalne, takie które w danym momencie działania algorytmu jest najlepsze. G. Mirkowska, ASD_12 Algorytmy na grafach
Drzewa rozpinające Niech G będzie dowolnym grafem niezorientowanym <V, E>. Drzewem rozpinającym grafu G = <V, E> nazywamy graf G* =<V*, E*> taki, że (1) V* = V, E* E(2) G* jest drzewem (tzn. graf spójny i acykliczny). Definicja Graf i jego drzewa rozpinające G. Mirkowska, ASD_12 Algorytmy na grafach
a b c f d e a b f b f f c e c e e d Jak znaleźć drzewo rozpinające grafu (1)? BFSWłóż do kolejki wybrany wierzchołek grafu i zamarkuj go. Dopóki kolejka nie jest pusta 1. Weź pierwszy element z kolejki i dopisz do kolejki wszystkie wierzchołki z nim incydentne o ile nie były zamarkowane i zamarkuj je. 2. Wypisz krawędzie odpowiadające dopisanym wierzchołkom.3. Usuń pierwszy element z kolejki. a c e d Wynik: ab af bc be cd d G. Mirkowska, ASD_12 Algorytmy na grafach
a b c f d e c c b b Jak znaleźć drzewo rozpinające grafu(2)? DFSWłóż na stos wybrany wierzchołek grafu i zamarkuj go. Dopóki stos nie jest pusty : 1. Weź element ze szczytu stosu. 2 . Usuń ze stosu ten element . 3. Dopisz do stosu wszystkie wierzchołki z nim incydentne, których jeszcze nie zamarkowano, a dopisane wierzchołki zamarkuj. 4. Wypisz krawędzie odpowiadające dopisanym wierzchołkom. e d f c a b b b ab af fe ed Wynik: fc G. Mirkowska, ASD_12 Algorytmy na grafach
Minimalne drzewo rozpinające Niech będzie dany graf G = <V, E> spójny niezorientowany, skończony i niech c : E R+ będzie funkcją kosztu określoną na krawędziach tego grafu. Problem Dla danego skończonego grafu G oraz danej funkcji kosztu c, znaleźć minimalne drzewo rozpinające, tzn. takie drzewo <V, T> rozpinające grafu G, że suma kosztów jego krawędzi SeT c (e) jest najmniejsza. G. Mirkowska, ASD_12 Algorytmy na grafach
1 1 8 8 10 10 4 4 2 2 7 7 3 3 4 4 4 4 7 7 3 3 6 6 5 5 6 6 5 5 15 15 8 8 7 7 7 7 9 9 Przykład: sieć wodociągowa Jakieś drzewo rozpinające Minimalne drzewo rozpinające G. Mirkowska, ASD_12 Algorytmy na grafach
v’ w’ Lemat {Vi: 1 i k}= V Ti E dla 1 i k Vi Vj = dla i j di - drzewo Niech G = <V, E> będzie grafem spójnym skończonym i nich c będzie jego funkcją kosztu. Niech d1= <V1, T1>, d2= <V2, T2>,......, dk = <Vk, Tk> będzie danym lasem rozpinającym G Vi Niech e = (v,w) będzie krawędzią o minimalnym koszcie, która nie należy do żadnego z drzew di. v Nie istnieje drzewo rozpinające <V,T*> grafu G, takie że e T* oraz <V, T*> ma najmniejszy koszt wśród drzew rozpinających zawierających wszystkie Ti. w G. Mirkowska, ASD_12 Algorytmy na grafach
Algorytm Kruskala Jeśli drzewo rozpinające ma mieć koszt minimalny i ma zawierać dany las drzew , to musi też zawierać krawędź e o minimalnym koszcie wsród krawędzi, które do tego lasu nie należą. Utworzyć kolejkę priorytetową PQ z wszystkimi krawędziami grafu, uporządkowanymi ze względu na koszt. Utworzyć początkowy podział Po zbioru V (tzn. rodzinę jednoelementowych zbiorów {x}, gdzie x V}. Przeglądać kolejno elementy kolejki i jeżeli końce rozważanej krawędzi należą do różnych zbiorów podziału, to krawędź dołączamy do tworzonego drzewa, a zbiory podziału łączymy. Algorytm G. Mirkowska, ASD_12 Algorytmy na grafach
5 6 7 2 1 1 3 8 4 3 2 6 15 4 5 7 10 7 Przykład 1. (1,2) 2. (1,4) 3.(2,3) 4. (1,3) 5.(4,5) 6. (3,5)7. (1,5)7. (6,7) 8. (1,6) 10. (7,4)15. (4,3) + 1| 2| 3| 4| 5| 6| 7 + 1, 2| 3| 4| 5| 6| 7 + 1, 2, 4| 3| 5| 6| 7 1, 2, 3, 4| 5| 6| 7 + 1, 2, 3, 4, 5| 6| 7 + 1, 2, 3, 4, 5| 6, 7 + 1, 2, 3, 4, 5, 6, 7 Kolejka Priorytetowa + Podział G. Mirkowska, ASD_12 Algorytmy na grafach
Algorytm Zakładam, że 1. pq jest kolejką priorytetową wszystkich krawędzi danego grafu G = <V, E>, 2. P jest początkowym podziałem zbioru V, 3. T pustym stosem (będą tam krawędzie drzewa). { while (not empty (pq) and card(P)>1) do kr := min(pq); pq := delmin(pq); A := Find(P,kr.początek); B := Find(P,kr.koniec); if A B then P := Union(P,B,A); T := push(T,kr) fi od } Find (P,x) = ten zbiór podziału P do którego należy x Union(P,B,A) = podział powstający z P przez połączenie zbiorów A i B. G. Mirkowska, ASD_12 Algorytmy na grafach
A A A B Jak to zaimplementować? Struktura Find-Union Drzewa z balansowaniem i kompresją ścieżek Koszt utworzenia kolejki priorytetowej – O(m lg m) Koszt 2m operacji Find O(lg(n))Koszt m operacji Union O(1) Koszt Razem O(m lg n) G. Mirkowska, ASD_12 Algorytmy na grafach
1 8 10 4 2 7 3 4 4 7 3 6 5 6 5 15 8 7 7 2 Problem ścieżek Dany jest graf G = <V, E> i jego funkcja kosztu c : E R +. Problem Znaleźć najkrótsze drogi od ustalonego wierzchołka (źródła) do wszystkich innych wierzchołków. Suma kosztów krawędzi leżących na tej drodze jest najmniejsza G. Mirkowska, ASD_12 Algorytmy na grafach
Metoda Dijkstry W kolejnych etapach algorytmu zbiór wierzchołków osiągalnych ze źródła jest powiększany o wierzchołki incydentne z ostatnio dołączonymi. Zawsze staramy się by dołączać te wierzchołki, których osiągnięcie wymaga najmniejszego kosztu (które znajdują się „najbliżej” zbioru już wcześniej wybranych wierzchołków. G. Mirkowska, ASD_12 Algorytmy na grafach
Struktura danych Tablica d (1: n) d[i] = długość najkrótszej ścieżki miedzy źródłem a wierzchołkiem i Na początku d[i] = c(s,i) jeśli (s,i) E, d[i] = + w p.p. Tablica P(1:n) P[i] = ojciec wierzchołka i na najkrótszej ścieżce od s do i. Zbiór wierzchołków S1 osiągalnych z s. Na początku S1 = {s}. Zbiór S2 wierzchołków osiągalnych z S1, S2 = {y : istnieje x S1, że (x,y) E}. Na początku S3 = V-{s}. Zbiór wierzchołków S3, których jeszcze nie sklasyfikowano. G. Mirkowska, ASD_12 Algorytmy na grafach
2 A B 5 6 9 4 A A B B G 5 2 5 C F 1 I H 4 G G 1 2 3 6 F F E D 1 C S1 A B C D E F G H I J d P Przykład A S2 S1 0 2 6 9 5 A B A A G. Mirkowska, ASD_12 Algorytmy na grafach
S2 2 A B 5 C 6 9 4 A A B B S1 G 5 2 5 C F 1 I H 4 H H G G 1 2 3 6 F F I I E D 1 D A B C D E F G H I J d P c.d. przykładu S2 C S1 0 2 6 8 9 5 10 7 A B C A A G G G. Mirkowska, ASD_12 Algorytmy na grafach
2 A B 5 6 9 4 G 5 2 5 C F 1 I H 4 1 2 3 6 E D 1 D A B C D E F G H I J d P Cd. przykładu S2 C B S1 A G I H F 0 2 6 8 9 5 10 7 Itd............. A B C A A G G G. Mirkowska, ASD_12 Algorytmy na grafach
Algorytm {x :=s;While niepusty (S3) doDla wszystkich wierzchołków y incydentnych z x do case y S2 if d(x) +c(x,y) <d(y) then P(y) := x; d(y) := d(x) +c(x,y) fi ; case y S3 S3 := S3 –{y}; S2 := S2 +{y}; P(y) := x; d(y) := d(x) +c(x,y);od;Wybierz taki element w zb. S2, że d(z) jest minimalnex := z;od} Koszt Algorytmu Dijkstry O(card(V)2) G. Mirkowska, ASD_12 Algorytmy na grafach