Konspekt 15 października 2014 1 Wykład III (16 października 2014 r.): optymalizacja kombinatoryczna na grafach (metody sieciowe) 1.1 Przykładowe problemy optymalizacji kombinatorycznej na grafach 1. Optymalizacja kombinatoryczna. 2. Problem poszukiwania minimalnego drzewa rozpinającego (MST, minimum spanning tree), algorytm Kruskala: 1: procedure Kruskal(G = (N, E, f)) 2: Wyjściowe MST: T 3: T 4: E = E 5: while T < N 1 & E = do 6: e arg min{f(i)} i E 7: e: najlżejsza krawędź w zbiorze nieuwzględnionych krawędzi 8: E E {e} 9: if T {e} nie zawiera cyklu then 10: T T {e} 11: end if 12: end while 13: Jeśli T < N 1 to G nie jest spójny 14: end procedure 3. Algorytm Prima (Prima-Dijkstry). 4. Algorytm zachłanny (greedy algorithm). 5. Problem Steinera. 6. Poszukiwanie przepływu maksymalnego. Twierdzenie Forda-Fulkersona. 7. Problem kolorowania wierzchołków w grafie. Twierdzenie o czterech barwach 8. Problem poszukiwania najkrótszej ścieżki w grafie. Strona 1
9. Algorytm przeszukiwania grafu wszerz (BFS, Breadth-First Search), drzewo ścieżek najkrótszych pod względem liczby przeskoków (hops): 1: procedure BFS(i, G = (V, A)) 5: S: zbiór węzłów, do których istnieje ścieżka skierowana od korzenia 6: L := {i} 7: L: uporządkowana lista przeszukiwanych węzłów 8: L := V {i} 9: L : zbiór dotychczas nieprzeszukanych węzłów 10: predecessor(i) = 0 11: predecessor(j) = k poprzednikiem węzła j na ścieżce skierowanej od korzenia jest węzeł k 12: Korzeń nie ma poprzednika 13: Pętla główna: 14: while L do 15: for all k L do 16: for all j L do 17: if (k, j) A then 18: S := S {k} 19: predecessor(j) = k 20: L := L {k} 21: L := L {k} 22: end if 23: end for 24: L := L {k} 25: end for 26: end while 27: return S i lista poprzedników węzłów należących do tego zbioru 28: end procedure 10. Algorytm przeszukiwania grafu w głąb (DFS, Depth-First Search): 1: procedure DFS(i, G = (V, A)) 5: S: zbiór węzłów, do których istnieje ścieżka skierowana od korzenia 6: L := V {i} 7: L : zbiór dotychczas nieprzeszukanych węzłów 8: predecessor(i) = 0 9: Pętla główna: 10: SearchDeep(i,G,S,L ) 11: return S i lista poprzedników węzłów należących do tego zbioru 12: end procedure Procedura wykonywana rekurencyjnie: 1: procedure SearchDeep(v,G,S,L ) Strona 2
2: for all j L do 3: if (v, j) A then 4: S := S {j} 5: predecessor(j) = v 6: L := L {j} 7: SearchDeep(j,G,S,L ) 8: end if 9: end for 10: end procedure 11. Algorytm Dijkstry (algorytm etykietowania/cechowania wierzchołków), założenia związane ze stosowalnością tego algorytmu, złożoność algorytmu O ( V 2), wersja algorytmu poszukiwania drzewa najkrótszych ścieżek: 1: procedure Dijkstra(i, G = (V, A, d)) 5: predecessor(i) = 0 6: S: zbiór oetykietowanych wierzchołków (dla których znaleziono najkrótszą ścieżkę z węzła i) 7: S := V {i} 8: S : zbiór nieoetykietowanych wierzchołków 9: for all j S do } 10: D ij d ij 11: Dla węzłów, które nie są sąsiednie, przyjmujemy d ij =, (i, j) / A d ij = 12: end for 13: Pętla główna: 14: while S do 15: Znaleźć k = arg min{d m S im 16: S S {k} 17: predecessor(k) = i 18: S S {k} 19: Sprawdzić polepszenie dotychczasowej najkrótszej ścieżki: 20: N k jest zbiorem następników k (pękiem wyjściowym dla k, forward star), N k = {j : (k, j) A} 21: for all j N k S do 22: D ij min{d ij, D ik + d kj } 23: W praktyce przechowujemy całe ścieżki (np. z użyciem relacji bycia poprzednikiem węzła na ścieżce), a nie tylko ich koszty 24: end for 25: end while 26: end procedure 12. Zmodyfikowany algorytm Dijkstry (dla sieci z ujemnymi wagami łączy, ale bez cykli negatywnych). Pojęcie cyklu negatywnego. 13. Algorytm Bhandari ego poszukiwania najkrótszej pary ścieżek rozłącznych. Strona 3
1.2 Zadania Proszę podać przykład takiego grafu ważonego G, który spełnia na raz wszystkie poniższe warunki: graf jest spójny, wszystkie wagi są liczbami naturalnymi, graf ma dziewięć wierzchołków, suma wag minimalnego drzewa rozpinającego jest równa połowie sumy wszystkich wag w G. Proszę pokazać, że minimalne drzewo rozpinające grafu pełnego K 9 o dowolnych wagach jest grafem dwudzielnym. Proszę podać przykład takiego grafu ważonego z wyróżnionym wierzchołkiem i, w którym: (a) drzewo najkrótszych ścieżek o korzeniu i oraz (b) najkrótsze drzewo rozpinające uzyskane za pomocą algorytmu Prima (przy starcie z wierzchołka i) nie są ze sobą tożsame. 1.3 Lektury 1.3.1 Materiał wykładu Zagadnienia omówione w ramach tego wykładu są w dużym stopniu opisane w następujących książkach: Wayne D. Grover. Mesh-Based Survivable Networks. Options and Strategies for Optical, MPLS, SONET, and ATM Networks. Prentice Hall PTR, Upper Saddle River, NJ, 2004: section 4.10. Deepankar Medhi and Karthikeyan Ramasamy. Network Routing. Algorithms, Protocols, and Architectures. Morgan Kaufmann Publishers Elsevier, San Francisco, CA, 2007: chapter 2. Michał Pióro and Deepankar Medhi. Routing, Flow and Capacity Design in Communication and Computer Networks. Morgan Kaufmann Publishers Elsevier, San Francisco, CA, 2004: appendix C.1-C.2. Maciej M. Sysło, Narsingh Deo, and Janusz S. Kowalik. Algorytmy optymalizacji dyskretnej. Wydawnictwo Naukowe PWN, Warszawa, Poland, 1999: rozdział 3.3-3.5. Robin J. Wilson. Wprowadzenie do teorii grafów. Wydawnictwo Naukowe PWN, Warszawa, Poland, 2000: 8, 17, 22, 28-29. 1.3.2 Lektura obowiązkowa Andrew V. Goldberg and Robert E. Tarjan. Efficient Maximum Flow Algorithms. Communications of the ACM, 57(8):82 89, August 2014. Na podstawie lektury należy sobie przede wszystkim opracować następujące zagadnienia: problemy maksymalnego przepływu (maximum flow) i minimalnego rozcięcia (minimum cut) twierdzenie Forda-Fulkersona (maximum flow, minimum cut theorem) algorytm wielomianowy (polynomial algorithm) Strona 4
formalna definicja problemu maksymalnego przepływu: pojęcia digrafu ważonego, źródła, ujścia, przepływu, wartości przepływu (flow value), i ograniczeń dotyczących przepływności (capacity constraint) oraz zachowania przepływu (conservation constraint) formalna definicja problemu minimalnego rozcięcia: rozcięcie jako podział (bipartition of the vertices), przepływność rozcięcia (capacity of a cut) pierwszy algorytm poszukiwania przepływu maksymalnego: graf rezydualny (residual graph), przepływ w grafie rezydualnym, powiększanie ścieżki (path augmenting), sposób poszukiwania ścieżki powiększającej. 1.3.3 Bibliografia uzupełniająca Ramesh Bhandari. Survivable Networks. Algorithms for Diverse Routing. Kluwer Academic Publishers, Dordrecht, The Netherlands, 1999: przegląd różnych algorytmów przydatnych w projektowaniu sieci (głównie niezawodnych). Maciej M. Sysło, Narsingh Deo, and Janusz S. Kowalik. Algorytmy optymalizacji dyskretnej. Wydawnictwo Naukowe PWN, Warszawa, Poland, 1999: podstawy teoretyczne do naszego kursu. Robin J. Wilson. Wprowadzenie do teorii grafów. Wydawnictwo Naukowe PWN, Warszawa, Poland, 2000: zwięzłe wprowadzenie do teorii grafów, trochę algorytmów. 1.4 Kursy online Zagadnienia omówione w ramach tego wykładu są w dużym stopniu omówione w ramach następujących wykładów online: Coursera, Algorithms: Design and Analysis, Part 2 by Tim Roughgarden (Dijkstra s Shortest-Path Algorithm, III. Introduction to Greedy Algorithms, V. Prim s Minimum Spanning Tree Algorithm, VI. Kruskal s Minimum Spanning Tree Algorithm). Strona 5