drzewa steinera
Transkrypt
drzewa steinera
Szymon Bargłowski http://students.mimuw.edu.pl/~sb214568 DRZEWA STEINERA I. Drzewo Steinera dla K wybranych wierzchołków (terminali) ważonego grafu G jest podgrafem G, który łączy wszystkie terminale. Przyjmujemy, że wagi są dodatnie. II. Problem znajdowania najlżejszego drzewa Steinera jest problemem NP – trudnym. DOWÓD: Sprowadzimy problem pokrycia wierzchołkowego grafu do problemu znajdowania drzewa Steinera. Dany jest graf G = (V, E); chcemy sprawdzić, czy istnieje w nim pokrycie wierzchołkowe rozmiaru nie większego niż K. W tym celu konstruujemy graf G' = (V', E') jak następuje: V '=V 1 ∪V 2 V1 V2 Odpowiada Odpowiada E V E ' =E 1∪ E 2 E 1 = {a , b: a∈V 1 ∧ b∈V 2 ∧ b jest końcem a w G } E 2 = {a , b: a , b ∈ V 2 } Wagi krawędzi z E1 wynoszą |V|, a wagi krawędzi z E2 wynoszą 1. Jako zbiór terminali wybieramy V1 . W tak zdefiniowanym grafie szukamy optymalnego drzewa Steinera. Jego waga nie przekracza: |E|*|V| + (K – 1) wtedy i tylko wtedy, gdy w grafie G istnieje pokrycie wierzchołkowe o mocy mniejszej bądź równej K. Zauważmy, że przedstawiona konstrukcja od razu wyznacza poszukiwane pokrycie wierzchołkowe. Sprowadzenie jest w oczywisty sposób wielomianowe, zatem problem szukania drzewa Steinera jest NP – trudny. III. Algorytm Dreyfus'a – Wagner'a INPUT: graf G = (V, E), |V| = n zbiór terminali S ⊂V , |S| = K OUTPUT: drzewo Steinera dla grafu G Opisywany algorytm jest algorytmem dynamicznym, obliczającym rekurencyjnie drzewa Steinera T X ∪ {v } dla wszystkich X ⊂S oraz v∈V . Ważną obserwacją jest fakt, że każdy liść w drzewie Steinera musi być terminalem, skoro zakładamy dodatnie wagi krawędzi. Rekurencję opisuje równość: T X ∪ v = min P vw ∪ T X ' ∪ w ∪ T X ' ' ∪ w w której minimum brane jest po wszystkich nietrywialnych podziałach X = X ' ∪ X ' ' oraz wszystkich w∈V , a Pvw oznacza najkrótszą ścieżkę od v do w. W “głównym” przypadku deg(w) ≥ 3 oraz v jest liściem w T X ∪ v i przedstawiona rekursja działa. W przypadku, gdy v nie jest liściem bierzemy w = v, natomiast gdy v jest liściem, a deg(w) = 2, to bierzemy X' = {w} Czas działania przedstawionego algorytmu wynosi: O ∑ n K 2i = O n3 K = O*(3K) i iK IV Poprawienie współczynnika wykładniczego (23.01.2006, B. Fuchs, W. Kern, D. Möle, S. Richter, P. Rossmanith, X. Wang) INPUT oraz OUTPUT jak poprzadnio Główna idea tego algorytmu polega na konstruowaniu rozwiązania z obliczonych drzew dla “małych” podzbiorów zbioru terminali S. W tym celu dodajemy 1/ ε nowych terminali, a ponieważ optymalne rozwiązanie nie jest znane, musimy uczynić to na n 1 /ε sposobów. Złożoność czasowa prezentowanego algorytmu wynosi: O 2δ K n−11 ln δ/ δ = O*((2 + δ)K) dla dowolnej 0 < δ < 1 Jak zapowiedziałem wcześniej, drzewo dzielimy na mniejsze komponenty, czyli kawałki posiadające terminale jedynie w liściach. Rozmiarem komponentu nazwiemy liczbę znajdujących się w nim terminali. LEMAT 1 Dla ε > 1/K dodanie co najwyżej 1/ ε nowych terminali wystarcza, aby podzielić T na komponenty o rozmiarach ≤ εK + 1. DOWÓD: Bez straty ogólności zakładamy, że T nie posiada wewnętrznych terminali. Dla dowolnego wierzchołka u drzewa T niech f(u) oznacza maksymalny rozmiar komponentów, na które u dzieli drzewo T (u należy do każdego z nich). Istnieje taki wierzchołek u, dla którego f(u) ≤ K/2 + 1. Zatem istnieje wierzchołek v, który maksymalizuje wartość f(v) przy warunku f(v) ≤ K – εK. Zauważmy, że v dzieli T na komponent o rozmiarze f(v), oraz na komponenty o rozmiarach ≤ εK + 1. Poprzez indukcję widzimy, że ten “duży” komponent może być podzielony na ε f v 1 1−ε komponenty o rozmiarach , czyli ≤ εK + 1, za pomocą co najwyżej 1−ε 1 = −1 ε ε wierzchołków. W celu omówienia działania algorytmu przyjmujemy następujące oznaczenie dla zbiorów terminali X, X1, X2 : X = X 1 ° X 2 ⇔ X = X 1∪ X 2 ∧ ∣ X 1∩ X 2∣ = 1 Algorytm ASC (Attach Small Components): Dla wszystkich S' S ⊆ S' ⊆ V, |S'| = K + [1/ε] Rób: 1. Oblicz T(X) dla wszystkich X ⊆ S' takich, że |X| ≤ εK + 1 2. Dla wszystkich X ⊆ S', |X| > εK + 1 oblicz T(X) rekurencyjnie zgodnie z: T X = min {T X 1 ∪T X 2 : X = X 1 ° X 2 ,∣ X 2∣ εK 1} TWIERDZENIE 1 Algorytm ASC poprawnie oblicza optymalne drzewo Steinera dla S ⊆ V. DOWÓD: Niech T będzie minimalnym drzewem Steinera dla S ⊆ V. Załóżmy, że A ⊆ V(T), |A| ≤ [1/ε] został dołożony jako zbiór dodatkowych terminali, dzieląc T = T(S) na komponenty o rozmiarze ≤ εK + 1. Niech S' = S ∪ A, wtedy T = T(S'). Jeśli X1 ⊆ S' jest zbiorem terminali drzewa T' będącego sumą połączonych ze sobą komponentów, to T' musi być minimalnym drzewem Steinera dla X1, w przeciwnym wypadku T nie byłoby drzewem optymalnym. Przez indukcję po |X| pokażemy, że ASC oblicza minimalne DS dla X ⊆ S' jeśli X jest zbiorem terminali sumy TX połączonych ze sobą komponentów drzewa T. Ponieważ S' posiada tę własność, wynika z tego poprawność algorytmu ASC. Dla |X| ≤ εK + 1 możemy zastosować wcześniej zaprezentowany algorytm Dreyfus'a - Wagner'a i otrzymać minimalne DS nawet dla wszystkich takich X-ów. Wpp możemy rozłożyć X na X1 ○ X2, gdzie X1 jest zbiorem terminali drzewa T1 będącego sumą pewnej liczby komponentów drzewa T, natomiast X2 jest zbiorem terminali jednego komponentu T2 drzewa T oraz |X2| ≤ εK + 1. TX = T1 ∪ T2 to minimalne DS dla X, z tezy indukcyjnej wynika, że algorytm wyznacza optymalne DS T(X1) oraz T(X2). Łatwo jest zauważyć, że możemy zastąpić T1 przez T(X1), a T2 przez T(X2) w TX aby dostać być może inne minimalne DS dla X. Czynione jest to w 2-gim kroku algorytmu ASC. ♠ Należy zwrócić uwagę na fakt, że jeśli X = X1 ○ X2 , oraz T(X1) i T(X2) są minimalnymi DS odpowiednio dla X1 i X2 to NIE zawsze T(X1) ∪ T(X2) jest minimalnym DS dla X. Kontrprzykład: 2 1 2 1 1, 2 1, 2 2 1 2 1 2 1 1, 2 2 TWIERDZENIE 2 Dla S ⊆ V, |S| = K algorytm ASC działa w czasie: O*((2 + δ)K) dla dowolnej 0 < δ < 1 oraz odpowiednio małego ε > 0. W szczególności czas ten może być oszacowany przez: O 2δK n−11 ln δ/ δ DOWÓD: Jest n1/ ε możliwości wybrania S' rozmiaru K' = K + [1/ε]. Czas potrzebny na 1-wszy krok ASC (Dreyfus – Wagner) jest pomijalny dla odpowiednio małego ε. Zatem całkowity czas działania jest ograniczony przez: n1/ ε ∑ K ' i i i n1/ ε K ' 2 K ' K ' / 2 εK 1 εK ' Dzięki wariantowi formuły Stirlinga: n! = 2Лnn/en Θ , dla 1Θ1,1 współczynnik dwumianowy K ' /2 εK ' możemy oszacować przez: [ K ' /2 εK ' 1 2ε ε 1 1−2ε 0,5−ε K ' ] Ponieważ chcemy uzyskać oszacowanie czasu działania postaci O*((2 + δ)K), 5 1 3 ε = δ /ln przyjmijmy . Wtedy δ 2ε 3 18 δ dla δ1 oraz: 1 5 δ δ2 δ ε ln δ − ln 1 2ε 18 3 18 3 (Z rozwinięcia w szereg Taylora) Obustronne potęgowanie daje: 1 2ε ε δ 1 3 Z drugiej strony mamy: 1 1−2ε 0,5−ε δ 1ε 1 8 x2 ponieważ ln 1x x− dla 0 < x ≤ 1 2 oraz zachodzi: 2 1 1 1 ε −ε ln −ε 2ε−2ε 2 ε− ln 1ε 2 1−2ε 2 2 Zatem: ε 1 2ε 1 1−2ε 0,5−ε 1 δ 3 1 δ δ 1 8 2 Co daje następujące oszacowanie czasu działania ASC: K O 2δ n −54ln δ 5δ ♠