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
iK
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Лnn/en Θ , 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 1x   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δ

♠

Podobne dokumenty