6: ±cie»ki
Spis zagadnie«problem najkrótszych ±cie»ek z jednym ¹ródªem Rozwi zanie sznurkowe kraw dzi Wariant 1: Wariant 2: nieujemne kraw dzie (Dijkstra) Wariant 3: dowolny graf () ±cie»ki dla wszystkich par Zmiana wag grafu na nieujemne przez potencjaªy Johnsona Przykªad: oszacowanie ±rednicy grafu
Problem najkrótszych ±cie»ek Wej±cie: skierowany graf G = (V, E) z wagami na kraw dziach, danymi przez funkcje w : E R, i wierzchoªek startowy s V Wyj±cie: dla ka»dego wierzchoªka v V dªugo± najkrótszej ±cie»ki µ(s, v) z s do v, je±li istnieje rodzic w drzewie najkrótszych ±cie»ek (je±li istnieje), pozwalaj cy zrekonstruowa najkrótsze ±cie»ki z s Najkrótsza ±cie»ka mo»e nie istnie z dwóch powodów: v mo»e nie by osi galny z s w grae mog istnie ujemne cykle (wtedy mo»e nie by dolnego ograniczenia na dªugo± ±cie»ki) (przykªad)
Przy projektowaniu optymalnego algorytmu, mo»na wzi pod uwag pewne specjalne wªasno±ci grafu, np.: graf jest skierowany, albo nieskierowany graf jest acykliczny (wtedy mo»na zastosowa najszybszy algorytm) wagi s nieujemne (wtedy mo»na zastosowa szybszy algorytm) 1 Pokazane zostan ró»ne warianty w zale»no±ci od wªasno±ci wej±ciowego grafu 1 albo caªkowite - w tym przypadku jest bardziej efektywna struktura danych
±cie»ki - wªasno±ci Zaªó»my dla grafu G = (V, E) i wierzchoªków s, v V nast puj c konwencj : µ(s, v) oznacza dªugo± najkrótszej ±cie»ki z s do v w G, czasami, je±li s jest znane z kontekstu, b dziemy pisali krócej µ(v): µ(s, v) = + (kiedy nie ma ±cie»ki z s do v) µ(s, v) = (kiedy istnieje ±cie»ka z s do v zawieraj ca ujemny cykl) µ(s, v) = d R (w pozostaªych przypadkach) Lemat: Pod±cie»ka najkrótszej ±cie»ki musi by najkrótsz ±cie»k
Obliczanie najkrótszych ±cie»ek: idea Ogólny pomysª jest podobny do BFS (ze ¹ródªa s). Z ka»dym wierzchoªkiem v zwi zujemy 2 atrybuty: v.distance: przechowuje najkrótsz (obecnie znan ) odlegªo± z s do v v.parent: przechowuje poprzednika (rodzica) v na najkrótszej ±cie»ce (obecnie znanej) z s inicjalizacja: s.distance = 0, s.parent = s, a wszystkie pozostaªe wierzchoªki maj atrybut distance ustawiony na + oraz parent na null. Uaktualnienia tych atrybutów s nast pnie propagowane przez kraw dzie: nazywane jest to relaksacj kraw dzi
kraw dzi %% relax((u,v)) # (u,v) jest kraw dzi w grafie if u.distance + w(u,v) < v.distance v.distance = u.distance + w(u,v) v.parent = u y dokonuj kolejnych relaksacji dopóki najkrótsze ±cie»ki nie zostan obliczone lub ujemny cykl wykryty. Relaksacje maj pewne wa»ne wªasno±ci, np: (zaªo»ywszy uprzednie dokonanie opisanej inicjalizacji) - po dowolnym ci gu relaksacji v V v.distance µ(v) czyli,»e warto± distance odkryta przez relaksacje nie mo»e spa± poni»ej prawdziwej warto±ci odlegªo±ci (dowód przez indukcj po liczbie relaksacji kraw dzi)
Poprawno± relaksacji Lemma Po dokonaniu ci gu R relaksacji takiego,»e zawiera on (jako podci g) najkrótsz ±cie»k p = (e 1,..., e k ) z s do v, zachodzi,»e: v.distance = µ(s, v) (czyli,»e najkrótsza ±cie»ka zostanie odkryta). Dowód: Poniewa» p jest najkrótsz ±cie»ka, wi c mamy µ(v) = w(e 1 j k j). Niech v i oznacza koniec kraw dzi e i, dla 0 < i k (v 0 = s). Poka»emy przez indukcj,»e po i-tej relaksacji zachodzi v i.distance w(e 1 j i j). Jest to prawda na pocz tku (s.distance == 0). Nast pnie, po i-tej relaksacji, v i.distance v i 1.distance + w(e i ) w(e 1 j i j) (z dencji relaksacji i na mocy indukcji). Wi c po k-tej relaksacji zachodzi: v.distance µ(v). Ale v.distance nie mo»e by ni»sze ni µ(v) (poprzedni lemat), a wi c zachodzi v.distance == µ(v).
1: ±cie»ki w grae acyklicznym () Je±li graf jest skierowanym grafem acyklicznym (), to stanowi to bardzo prosty przypadek dla problemu najkrótszych ±cie»ek ze ¹ródªa s. Ka»dy mo»e by topologicznie posortowany (np. przez DFS) w czasie O(m + n), co daje ci g wierzchoªków (v 1,..., v n ). Nast pnie, zakªadaj c,»e s = v j, dla pewnego 0 < j n, mo»na dokona relaksacji wszystkich kraw dzi wychodz cych z v j, a nast pnie wychodz cych z v j+1 i tak dalej a» do v n. W ten sposób ka»da kraw d¹ poddana jest relaksacji co najwy»ej raz a ka»da najkrótsza ±cie»ka jest odkryta jako podci g ci gu dokonanych relaksacji. Poniewa» zªo»ono± czasowa relaksacji jest staªa, wi c algorytm ma ª czn zªo»ono± O(m + n) w tym przypadku. UWAGA: wierzchoªki wyst puj ce przed s w posortowanym ci gu s nieosi galne z s.
2: (wagi nieujemne) Zauwa»my,»e je±li nie ma kraw dzi o ujemnych wagach, to nie ma te» ujemnych cykli. Natomiast cykle mog istnie, wi c nie mo»na zaªo»y wykonalno±ci sortowania topologicznego. Pomysª algorytmu w tym przypadku polega na dokonywaniu relaksacji w kolejno±ci niemalej cych najkrótszych odlegªo±ci od ¹ródªa. Dzi ki nieujemno±ci wag, ka»da najkrótsza ±cie»ka zostanie w ten sposób odkryta. Uwaga:»eby osi gn powy»sz kolejno±, w algorytmie stosowana jest kolejka priorytetowa przechowuj ca kolejne wierzchoªki do odwiedzenia (priorytetem jest warto± atrybutu distance) Przykªad (sznurki z w z ªkami): Jest to analogiczne do podnoszenia ze stoªu sznurków powi zanych za pomoc w z ªków (kolejne podnoszone ze stoªu w z ªki odpowiadaj wierzchoªkom).
(Dijkstra) (pq - kolejka priorytetowa z operacj decreasekey, priorytetem jest warto± atrybutu distance) s.distance = 0 pq.insert(s) s.parent = s for-each v in V except s: v.distance = INFINITY v.parent = null while(!pq.isempty()) scannednode = pq.delmin() for-each v in scannednode.adjlist: if (v.distance > scannednode.distance + w(scannednode, v)) v.distance = scannednode.distance + w(scannednode, v) v.parent = scannednode if (pq.contains(v)) pq.decreasekey(v) else pq.insert(v) (»eby efektywnie zaimplementowa operacje contains i decreasekey musimy u»y tzw. adresowalnej kolejki priortytowej, czyli wyposa»onej w dodatkowy sªownik mapuj cy wierzchoªki do ich pozycji w kolejce priorytetowej)
Analiza pesymistczyna algortymu rozmiar danych: n = V, m = E operacja dominuj ca: porównanie priorytetów (równie» wewn trz kolejki priorytetowej), aktualizacja atrybutów Zªo»ono± gªównej p tli zale»y od u»ytej implementacji kolejki priorytetowej. inicjalizacja: O(n) p tla: O(n (delmin + insert) + m decreasekey) O(nlogn) + O(mlogn) = O((n + m)logn) (dla kopca binarnego)
Analiza c.d. Powy»sza analiza dotyczy przypadku pesymistycznego. Mo»na pokaza,»e w przypadku przeci tnym liczba operacji decreasekey wynosi O(nlog(m/n)), co daje przeci tn zªo»ono± czasow O(m + nlog(m/n)logn). Przy dostatecznie g stym grae (gdy pierwszy czynnik dominuje nad drugim) otrzymujemy liniowy czas przeci tny. Ponadto, mo»na u»y kopca Fibonacciego, który ma amortyzowany koszt staªy operacji decreasekey i wtedy otrzymujemy czas pesymistyczny (jednak kopiec Fibonacciego ma ukryt wy»sz staª multiplikatywn ): O(m + nlogn) Ponadto, je±li wagi s caªkowite i ograniczone przez staª C, mo»na zredukowa zªo»ono± pesymistyczn do: O(m + nc) stosuj c tzw. monotoniczn bukietow kolejk priorytetow.
3: Bellmana-a (dowolne wagi) W poprzednich przypadkach wystarczaªo conajwy»ej m relaksacji. Zawsze jednak wystarcza dokona O(nm) relaksacji, aby odkry ka»d najkrótsz ±cie»k (jako podci g). Jest to rodzaj podej±cia siªowego, które dziaªa dla ka»dego grafu. Poniewa» dowolna najkrótsza ±cie»ka mo»e zawiera conajwy»ej n 1 kraw dzi spo±ród m, wi c wystarczy dokona (n 1)-krotnej relaksacji wszystkich m kraw dzi ustawionych w ustalony ci g, aby ci g kraw dzi ka»dej najkrótszej ±cie»ki byª w nim zawarty jako podci g (i w ten sposób wykry wszystkie dobrze okre±lone najkrótsze ±cie»ki). Dla wierzchoªków nieosi galnych b dzie v.d ==. Aby nast pnie wykry jakiekolwiek ujemne cykle, wystarczy nast pnie jeszcze raz dokona m relaksacji (te, dla których atrybut d wci» maleje, le» na ±cie»kach zawieraj cych ujemny cykl) i nast pnie w czasie liniowym przypisa wierzchoªkom osi galnym z tego cyklu warto± v.d ==
's Algorithm %% (initialise as in Dijkstra) for(i = 1; i <= (n-1); i++) for each e in E relax(e) for each e=(u,v) in E if (u.distance + w(u,v) < v.distance) identifynegativecycle(v) *** identifynegativecycle(v) if (v.distance > -infinity) v.distance = -infinity for each w in v.adjlist identifynegativecycle(w)
±cie»ki dla wszystkich par Problem: wej±cie: dany jest graf skierowany z wagami na kraw dziach. wyj±cie: najkrótsze ±cie»ki pomi dzy wszystkimi parami wierzchoªków Rozwi zanie 1: wykona Bellmana-a ze wszystkich wierzchoªków (O(n 2 m)) Rozwi zanie 2 (szybsze): odpowiednio zamieni wagi na nieujemne (zachowuj c najkrótsze ±cie»ki) i wykona algorytm ze wszystkich wierzchoªków (O(n(m + nlogn))) Uwaga: rozwi zanie 2 da si wykona tylko je±li nie ma cykli ujemnych.
Zmiana wag na nieujemne Aby móc zastosowa«algorytm, w grae zostaj zmienione wagi na nieujemne, tak aby zachowa najkrótsze ±cie»ki. Mianowicie, ka»dej kraw dzi e = (v, w) o dotychczasowej wadze w(e) przypisywana jest nowa waga: w (e) = w(e) + pot(v) pot(w), gdzie pot() jest pewn funkcj nieujemn maj c pewne po» dane wªasno±ci: wszystkie nowe wagi s nieujemne najkrótsze ±cie»ki przy nowych wagach s takie same jak przy starych sumy wag na cyklach nie ulegaj zmianie Funkcj speªniaj c te warunki nazywamy potencjaªem wierzchoªka.
Potencjaª wierzchoªka Aby funkcja pot() speªniaªa powy»sze warunki wyznaczamy j nast puj co: przykªad dodajemy do grafu pewien sztuczny wierzchoªek s oraz ª czymy go kraw dziami (skierowanymi) z wagami 0 do wszystkich wierzchoªków grafu obliczamy najkrótsze odlegªo±ci µ(v) z s do ka»dego wierzchoªka v grafu
Nowe wagi zachowuj najkrótsze ±cie»ki Lemat 1: Je±li p, q s ±cie»kami z v do w, a c(p) oznacza koszt tej ±cie»ki przy oryginalnych wagach, a c (p) przy nowych wagach, to: 1 c (p) = pot(v) + c(p) pot(w) 2 c (p) c (q) wtw c(p) c(q) (zachowuje porz dek kosztów ±cie»ek) 3 najkrótsze ±cie»ki przy nowych kosztach s takie same jak przy starych Dowód: Niech p = (e1,..., e k 1 ), e i = (v i, v i+1 ), v = v0 i w = v k. Wtedy: c (p) = k 1 i=0 w (e i ) = 0 i<k (pot(v i ) + w(e i ) pot(v i+1 )) = pot(v0) + 0 i<k w(e i ) pot(v k ) = pot(v0) + c(p) pot(v k ) (a wi c zmiana kosztu ±cie»ki zale»y tylko od wierzchoªków ko«cowych) Wynika z tego punkt 2 i 3 Lematu. Wniosek: Dla ka»dego cyklu C, c (C) = c(c) (nie zmienia kosztów cykli)
Nowe wagi s nieujemne Lemat 2: Je±li graf nie ma ujemnych cykli i wszystkie wierzchoªki s osi galne z s, to przy zdeniowaniu potencjaªu pot(v) = µ(v) (jako dªugo±ci najkrótszej ±cie»ki z s) nowe wagi s nieujemne dla wszystkich kraw dzi. Dowód: Poniewa» nie ma ujemnych cykli, to wszystkie warto±ci pot(v) s dobrze zdeniowane. Rozwa»my dowoln kraw d¹ e = (v, w). Mamy tedy: µ(v) + w(e) µ(w) (gdy» najkrótsze ±cie»ki speªniaj nierówno± trójk ta) a wi c: w (e) = µ(v) + w(e) µ(w) 0 Uwaga: czy wag nie mo»na po prostu zwi kszy o staª warto±, tak aby byªy nieujemne? (podaj odpowiedni kontrprzykªad)
Pomysª algorytmu Johnsona Z powy»szych dwóch lematów wynika,»e nowe wagi zachowuj najkrótsze ±cie»ki i pozwalaj zastosowa algorytm. Aby obliczy nowe wagi, nale»y najpierw wykona algorytm Bellmana-a z wierzchoªka s aby obliczy warto± µ(v) dla ka»dego wierzchoªka v (przy okazji pozwala on wykry ewentualne ujemne cykle). Nast pnie wykona algorytm z ka»dego wierzchoªka i przywróci poprzednie wagi. Taki algorytm ma zªo»ono± : O(mn) (BF) + O(n(m + nlogn)) (n razy Dijkstra, przy u»yciu kopca Fibonacciego), czyli ª cznie: O(nm + n 2 logn)
Johnsona %% algorytmjohnsona(){ dodaj wierzchoªek s z kraw dziami o zerowej wadze do wszystkich wierzcho wykonaj aby obliczy najkrótsze ±cie»ki z s for each node v: przypisz pot(v) jako odlegªo± od s for each node v: wykonaj Dijkstra z v na zmienionych wagach (bo s nieujemne) for each edge e=(u,v): przywró poprzednie wagi (**) (poniewa» najkrótsze ±cie»ki s te same) } (**) w(v, w) = w (v, w) + pot(w) pot(v)
Przykªad: oszacowanie ±rednicy grafu (diam(g)) (przypomnienie: maksymalna odlegªo± pomi dzy par wierzchoªków w grae) Mo»na prosto oszacowa ±rednic grafu nie licz c wszystkich par odlegªo±ci na podstawie poni»szej obserwacji: Lemat: Niech D (s) = max u V µ(s, u), dla pewnego wierzchoªka s (ekscentryczno± wierzchoªka s). Je±li graf jest nieskierowany, to zachodzi D (s) diam(g) 2D (s). Je±li graf jest skierowany, to powy»sza nierówno± nie zachodzi, ale zachodzi max(d (s), D (s)) D D (s) + D (s), gdzie D (s) = max u V µ(u, s). Czyli ±rednic mo»na oszacowa przez ekscentryczno± dowolnego wierzchoªka (czyli zªo»ono± liniowa zamiast kwadratowej)
Problem najkrótszych ±cie»ek z jednym ¹ródªem Rozwi zanie sznurkowe kraw dzi Wariant 1: Wariant 2: nieujemne kraw dzie (Dijkstra) Wariant 3: dowolny graf () ±cie»ki dla wszystkich par Zmiana wag grafu na nieujemne przez potencjaªy Johnsona Przykªad: oszacowanie ±rednicy grafu
Przykªadowe Zadania wykonaj efektywny algorytm obliczania najkrótszych ±cie»ek z podanego ¹ródªa dla podanego grafu (najpierw zaklasykuj graf do odpowiedniego przypadku) dokonaj zmiany wag podanego grafu na nieujemne zachowuj c najkrótsze ±cie»ki, zgodnie z przedstawion technik potencjaªów wykonaj algorytm Johnsona dla podanego grafu oszacuj ±rednic podanego grafu (nieskierowanego lub skierowanego) za pomoc przedstawionej techniki.
Dzi kuj za uwag