Temat: Problem najkrótszych cieek w grafach waonych, cz. I: Algorytmy typu label - setting.. Oznaczenia i załoenia Oznaczenia G = <V, E, c> - graf skierowany z funkcj wagi s wierzchołek ródłowy t wierzchołek docelowy Załoenia Wagi krawdzi to liczby całkowite: c: E C Graf zawiera skierowane cieki z s do kadego innego wierzchołka Graf nie zawiera ujemnych cykli. Róne typy problemu najkrótszych cieek. Znalezienie najkrótszych cieek z ustalonego s do pozostałych wierzchołków, zakładajc, e wszystkie krawdzie grafu maj nieujemne wagi.. Znalezienie najkrótszych cieek z ustalonego s do pozostałych wierzchołków, zakładajc, e wagi krawdzi mog by dowolne (take ujemne).. Znalezienie najkrótszych cieek midzy dowoln par wierzchołków grafu. 4. Róne uogólnienia problemu najkrótszych cieek
. Algorytmy ciekowe typu label - setting i label - correcting Zarówno metoda label setting jak i label - correcting to metody iteracyjne, które modyfikuj (optymalizuj) odległoci do wierzchołków grafu w kadym kroku algorytmu. Metody róni si sposobem ustalania etykiet odległoci w poszczególnych iteracjach. W algorytmach typu label - setting wybierany jest w kadym kroku jeden optymalny wierzchołek (z najmniejsz etykiet odległoci) i jego etykiet odległoci uznaje si za optymaln we wszystkich nastpnych iteracjach. W algorytmach typu label correcting etykiety odległoci nadane wierzchołkom s tymczasowe, mog si zmieni w kolejnych iteracjach, a ich ostateczne (opytmalne) wartoci ustalaj si dopiero na kocu realizacji algorytmu. Metoda label setting moe by zastosowana do rozwizania problemu najkrótszych cieek w grafach acyklicznych z dowolnymi wartociami wag albo w grafach z nieujemnymi wagami. 4. Przykład zastosowania problemu najkrótszych cieek: Alokacja punktów kontrolnych w systemie linii produkcyjnej Linia produkcyjna składa si z uporzdkowanego cigu n faz produkcyjnych. W kadej fazie realizuje si pewien fragment procesu wytwarzania, który moe by poddany ewentualnej kontroli. Produkt wchodzi w faz numer produkcji w partiach złoonych z B elementów. Kady z elementów partii moe ulec defektowi w fazie produkcji i z prawdopodobiestwem α i. Zakładamy, e wszystkie defekty s nie do naprawienia, wic jeeli po jakiej fazie produkcji kontrola wykae defekt jakiego elementu partii, to ten element jest niszczony (nie przechodzi przez kolejne fazy produkcji ani kontroli). Problem polega na zalezieniu optymalnego planu kontroli, który ustali, po których fazach
produkcji ustawi punkty kontrolne tak, aby zminimalizowa łczny (we wszystkich fazach produkcji) koszt produkcji i kontroli. Oczywicie ustawienie mniejszej liczby punktów kontrolnych zmniejszy koszt łczny kontroli, ale moe spowodowa zwikszenie łcznego kosztu produkcji partii elementów, bo zbyt póno zostan wyeliminowane elementy z defektem. Dane wejciowe: p i koszt produkcji jednego elementu w fazie i f ij koszt kontroli partii po fazie j, zakładajc, e poprzednia kontrola miała miejsce po fazie i g ij koszt kontroli jednego elementu po fazie j, zakładajc, e poprzednia kontrola tego elementu miała miejsce w fazie i Koszt kontroli po danej fazie j zaley od tego kiedy miała miejsce ostatnia kontrola (po której z poprzednich faz), poniewa jeeli zaszła ona po fazie i, to kontroler musi szuka defektów, które mogły powsta nie tylko w fazie j, ale take w fazach i+, i+,, j-. Powyszy problem mona sformułowa jako problem znalezienia najkrótszej cieki w grafie acyklicznym. Wierzchołki grafu to fazy produkcji z dodatkow faz 0. Krawdzie grafu s zdefiniowane midzy kad par wierzchołków (i, j) tak, e i < j. 0 4
Wagi krawdzi c ij s sum: kosztu kontroli partii f ij, kosztu kontroli elementów, które nie uległy defektowi do fazy i włcznie. Warto B(i)g ij, gdzie B(i)=B(-α )(-α ) (-α i ). kosztu produkcji elementów, które nie uległy defektowi do fazy i włcznie i były przetwarzane w fazach i+, i+,, j. Ogólnie Warto B( i) = c ij = j k = i+ f ij p k. + B( i) g ij + B( i) j k = i+ Jeeli najkrótsza cieka w grafie zdefiniowanym wyej przechodzi przez wierzchołki 0--4, to naley ustawi dwa punkty kontrolne, za faz numer oraz 4, aby łczny koszt produkcji i kontroli w całej linii był moliwie najniszy. 5. Najkrótsze cieki w grafie acyklicznym Wejcie: Graf G - acykliczny, zorientowany, z dowolnymi wagami zapamitanymi w tablicy c i z ustalonym wierzchołkiem startowym s Wyjcie: Najkrótsze cieki z s do pozostałych wierzchołków: d - tabela odległoci minimalnych z s do pozostałych wierzchołków, prev tabela poprzedników na ciece Algorytm Acyclic_SP; G =sortowanie_topologiczne(g); for (i = ; i<=n; i++) if (i == s) d[i]=0; else d[i]=c [s, i]; for (i = ; i<=n; i++) if (i == s) prev[i]=0; else if (c [s, i]!= ) prev[i]=s; for (i = ; i<=n; i++) p k 4
if (i!= s) for ( j Adj(i)) if (d[j]> d[i]+c [i, j])) d[j]=d[i]+c [i, j]; prev[j]=i; Przykład 5 s - 4 4 6 Powyszy graf jest posortowany topologicznie. Po inicjalizacji: d: [0 ] prev: [0 - - -] Po I kroku: i = d: [0 ] prev: [0 - -] Po II kroku: i = d: 0 0 4 prev: [0 -] Po III kroku: i = 4 d: 0 0 4 4 prev: 0 4 Po ostatnim kroku i = 5, 6 d: 0 0 4 4 prev: 0 4 5
Koszt czasowy: O(n+m), gdy graf nie spełnia warunku uporzdkowania topologicznego, O(m) gdy graf G jest posortowany topologicznie. 6. Algorytm Dijkstra Wejcie: Graf G zorientowany, z nieujemnymi wagami, zapamitanymi w tablicy c i ustalonym wierzchołkiem startowym s Wyjcie: Najkrótsze cieki z s do pozostałych wierzchołków: d - tabela odległoci minimalnych z s do pozostałych wierzchołków, prev tabela poprzedników na ciece Algorytm Dijkstra; T =,,..., n; for (i = ; i<=n; i++) if (i == s) d[i]=0; else d[i]=c[s,i]; for (i = ; i<=n; i++) if (i == s) prev[i]=0; else if (c[s, i]!= ) prev[i]=s; T=,,..., n-s; while (T!= ) u="dowolny wierzchołek r T taki, e d[r]=mind[p]:p T"; T=T-u; for (v = ; v<=n; v++) if v T then if (d[v]>d[u]+c[u,v]) d[v]=d[u]+c[u,v]; prev[v]=u; 6
Przykład 7 6 5 s 4 5 Stan zbioru T oraz tablic d oraz prev po kolejnych iteracjach: Po inicjalizacji T =,, 4, 5, 6, d = [0 ], prev = [0 - - - -] Po I krok u=, T =, 4, 5, 6, d = [0 6 8], prev = [0 - ] Po II krok ptli u= 4, T=, 5, 6, d = [0 4 7 8], prev = [0 4 4 ] Po III krok ptli u=, T= 5, 6, d = [0 4 7 5], prev = [0 4 4 ] Po IV krok ptli u= 6, T=5, d= [0,, 4,, 6, 5], prev = [0 4 6 ] Po V krok ptli u=5, T=, d= [0,, 4,, 6, 5], prev = [0 4 6 ] 4 7
Złoono czasowa: O(n ) gdy struktur danych dla zbioru T jest struktura liniowa (lista, tablica), O(mlogn) gdy struktur dla zbioru T kopiec binarny, O(m + nlogn) gdy T jest zaimplementowany jako kopiec Fibonacciego. 7. Odwrotny algorytm Dijkstra Wejcie: Graf G zorientowany, z nieujemnymi wagami, zapamitanymi w tablicy c i ustalonym wierzchołkiem docelowym t Wyjcie: Najkrótsze cieki do t z pozostałych wierzchołków grafu: d - tabela odległoci minimalnych z dowolnego wierzchołka do t, next tabela nastpników na ciece Algorytm Reverse_Dijkstra; T =,,..., n; for (i = ; i<=n; i++) if (i == t) d[i]=0; else d[i]=c[i, t]; for (i = ; i<=n; i++) if (i == t) next[i]=0; else if (c[i, t]!= ) next[i]=t; T=,,..., n-t; while (T!= ) u="dowolny wierzchołek r T taki, e d[r]=mind[p]:p T"; T=T-u; for (v = ; v<=n; v++) if v T then if (d[v]>d[u]+c[v, u]) d[v]=d[u]+c[v, u]; next[u]=v; 8
Przykład 4 4 6 t 5 5 Po inicjalizacji: Stan zbioru T oraz tablic d oraz next po kolejnych iteracjach: T =,,, 4, 5, d = [ 5 0], next = [- - - 6 6 0] Po I krok u= 4, T =,,, 5, d = [ 6 4 5 0], next = [- 4 4 6 6 0] Po II krok ptli u=, T=,, 5, d = [6 6 4 5 0], next = [ 4 4 6 6 0] Po III krok ptli u= 5, T=,, d = [6 6 4 5 0], next = [ 4 4 6 6 0] Po IV krok ptli u=, T=, d = [6 6 4 5 0], next = [ 4 4 6 6 0] Po V krok ptli u=, T=, d = [6 6 4 5 0], next = [ 4 4 6 6 0] Złoono czasowa: Jak dla algorytmu Dijkstra. 9
8. Dwukierunkowy algorytm Dijkstra Wejcie: Graf G zorientowany, z nieujemnymi wagami, zapamitanymi w tablicy c i ustalonymi wierzchołkami s oraz t Wyjcie: Najkrótsza cieka z s do t: d - tabela odległoci minimalnych z s do pozostałych wierzchołów, d - tabela odległoci minimalnych do t z pozostałych wierzchołów, next tabela nastpników na ciece, prev tabela poprzedników w ciece Algorytm Bidirectional_Dijkstra; T s =,,..., n; T t =,,..., n; for (i = ; i<=n; i++) if (i == s) d[i]=0; else d[i]=c[s, i]; for (i = ; i<=n; i++) if (i == s) prev[i]=0; else if (c[s, i]!= ) prev[i]=s; for (i = ; i<=n; i++) if (i == t) d[i]=0; else d[i]=c[i, t]; for (i = ; i<=n; i++) if (i == t) next[i]=0; else if (c[i, t]!= ) next[i]=t; T s =,,..., n-s; T t =,,..., n-t; i = s; j = t; while (i!= j) i="dowolny wierzchołek r T s taki, e d[r]=mind[p]:p T s "; T s =T s -i; for (v = ; v<=n; v++) if v T s then if (d[v]>d[i]+c[i,v]) 0
d[v]=d[i]+c[i,v]; prev[v]=i; j="dowolny wierzchołek r T t taki, e d[r]=mind[p]:p T t "; T t =T t -j; for (v = ; v<=n; v++) if v T t then if (d[v]>d[j]+c[v, j]) d[v]=d[i]+c[v, j]; next[j]=v; // - konkatenacja cieek (*) m=d[i]+d[i]; path=prev(s i) next(i t); (**) for (u, v) E takich, e u!=v, u T s oraz v T t w=d[u]+c uv +d[v]; if (m>w) m = w; path = prev(s u) (u, v) next(v t); Przykład 4 s 4 5 5 6 t
Po inicjalizacji: Stan zbiorów T s i T t oraz tablic d, d oraz next i prev po kolejnych iteracjach: T s =,, 4, 5, 6, d = [0 ], prev = [0 - - -] T t =,,, 4, 5, d = [ 5 0], next = [- - - 6 6 0] Po I krok i=, T s =, 4, 5, 6, d = [0 4 ], prev = [0 - -] j= 4, T t =,,, 5, d = [ 6 4 5 0], next = [- 4 4 6 6 0] Po II krok ptli i=, T s = 4, 5, 6, d = [0 4 ], prev = [0 -] j=, T t =,, 5, d = [6 6 4 5 0], next = [ 4 4 6 6 0] Po (*) m=d[i]+d[i]= d[]+d[]=+4=6 path = prev(s i) + next(i t) = prev( ) + next( 6)=--4-6 W (**) rozwaana jest tylko jedna krawd: (4, 5) w=d[u]+c uv +d[v] = d[4]+c 45 +d[5] = +4 +5 = Ostatecznie : najkrótsza cieka z do 6 ma długo 6 i jest nastpujca: --4-6 Koszt czasowy : pesymistyczny taki jak dla algorytmu Dijkstra, ale redni sporo niszy, gdy moemy bardzo szybko trafi na ten sam wierzchołek i rozpatrywany w ciekach z s do i oraz z i do t