Przeskocz do treści

Delta mi!

Drzewo Steinera: jedno zagadnienie, mnóstwo problemów

Marek Cygan i Marcin Pilipczuk

o artykule ...

  • Publikacja w Delcie: kwiecień 2011
  • Publikacja elektroniczna: 31-03-2011
  • Autor: Marek Cygan
    Afiliacja: Instytut Informatyki, Uniwersytet Warszawski
    Autor: Marcin Pilipczuk
    Afiliacja: Instytut Informatyki, Uniwersytet Warszawski
  • Wersja do druku [application/pdf]: (167 KB)

W naszym zespole badawczym analizujemy wiele różnych zagadnień, które występują w różnych aspektach. Nic w tym dziwnego, wszak algorytmika jest bardzo szeroką dziedziną. Zdarza się i tak, że to samo zagadnienie pojawia się w wielu kontekstach. Taka sytuacja ma miejsce w przypadku problemu drzewa Steinera.

obrazek

Rys. 1 Punkt math jest punktem Steinera dla wierzchołków math

Rys. 1 Punkt math jest punktem Steinera dla wierzchołków math

Zanim przejdziemy do formalnej definicji, przyjrzyjmy się nastepującemu klasycznemu problemowi geometrycznemu. Książę Piotruś jest władcą trzech miast: math math i math Chce je połączyć drogami tak, by z każdego miasta dało się dojechać do każdego innego, i oczywiście pragnie zminimalizować koszt budowy, czyli sumę długości zbudowanych dróg. Jedną z dostępnych opcji jest zbudowanie dróg wzdłuż dwóch krótszych boków trójkąta math Jednak, co dla niektórych Czytelników może być zaskakujące, można lepiej! O ile tylko każdy kąt wewnętrzny trójkąta math ma miarę mniejszą niż math taniej jest zrobić tak: znajdujemy wewnątrz trójkąta math punkt math taki że math  i budujemy drogi math math  i math Czasem więc opłaca się wyjść poza schemat prowadzenia dróg bezpośrednio między miastami i zbudować dodatkowe skrzyżowanie. To dodatkowe skrzyżowanie nazywa się często punktem Steinera.

obrazek

Rys. 2 Cztery zaznaczone wierzchołki to terminale. Pozostałe wierzchołki oraz krawędzie to możliwe skrzyżowania i drogi. Pogrubionymi kreskami zaznaczono krawędzie najtańszego drzewa Steinera, którego koszt to 14.

Rys. 2 Cztery zaznaczone wierzchołki to terminale. Pozostałe wierzchołki oraz krawędzie to możliwe skrzyżowania i drogi. Pogrubionymi kreskami zaznaczono krawędzie najtańszego drzewa Steinera, którego koszt to 14.

Przełóżmy teraz problem księcia Piotrusia na język teorii grafów. Mamy dany spójny graf nieskierowany math w którym każda krawędź math ma swoją długość math Graf to cały świat księcia Piotrusia: wierzchołki grafu odpowiadają możliwym skrzyżowaniom, a krawędzie możliwym drogom. Księstwo księcia Piotrusia to podzbiór wierzchołków math: te wierzchołki reprezentują miasta, które chcemy połączyć drogami. Mamy znaleźć najtańszą sieć dróg – czyli spójny podgraf grafu math – która łączy wszystkie miasta – czyli wierzchołki zbioru math Zauważmy, że ten najtańszy podgraf zawsze będzie drzewem. Zbiór math często nazywa się zbiorem terminali. Tak określone zagadnienie to problem znalezienia najtańszego drzewa Steinera dla zbioru terminali math Przykładowy graf z czterema terminalami znajduje się na rysunku 2.

Będziemy też czasem mówili o problemie drzewa Steinera bez długości; wtedy zakładamy, że każda krawędź grafu ma długość jeden. Zauważmy, że odpowiada to znalezieniu jak najmniejszego zbioru wierzchołków math tak, by zbiór math indukował spójny podgraf grafu math tzn. aby krawędzie, których oba końce znajdują się w tym zbiorze, wystarczały do tego, aby z każdego terminalu dało się dojść do każdego innego terminalu. Zbiór math reprezentuje dodatkowe wierzchołki poza math w poszukiwanym drzewie Steinera. Jeśli weźmiemy math dodatkowych wierzchołków, to drzewo rozpinające math będzie miało math  krawędzi i taki sam będzie koszt budowy dróg, co oznacza, że minimalizując math minimalizujemy sumę długości krawędzi wybranych do drzewa Steinera.

Problem drzewa Steinera, nawet w wersji bez długości, jest NP-trudny, co oznacza, że najprawdopodobniej nie da się efektywnie znajdować optymalnych rozwiązań tego zagadnienia. Wobec tego będziemy próbowali radzić sobie z nim w dwojaki sposób: dla większych instancji (tj. większych danych wejściowych problemu) wystarczy nam rozwiązanie przybliżone, natomiast rozwiązanie dokładne będziemy znajdować w czasie wykładniczym dla grafów na tyle dużych, na ile pozwoli nam złożoność naszego algorytmu oraz moc obliczeniowa komputera.

Zacznijmy od najbardziej klasycznej metody radzenia sobie z problemami NP-trudnymi, czyli od algorytmów aproksymacyjnych. Chcemy szybko – w czasie wielomianowym od rozmiaru grafu – znaleźć drzewo Steinera, które niekoniecznie będzie najlepsze, ale będzie niewiele gorsze od optymalnego.

Aby otrzymać prosty algorytm aproksymacyjny, wróćmy do oryginalnego problemu księcia Piotrusia na płaszczyźnie. Wymyślenie, by dodać punkt math było dość trudne. A o ile gorzej byłoby, gdyby książę Piotruś zbudował drogi wzdłuż dwóch krótszych boków trójkąta math ? Otóż okazuje się, że niewiele gorzej.

obrazek

Rys. 3 Graf math otrzymany poprzez wyznaczenie najkrótszych ścieżek pomiędzy każdą parą terminali grafu z rysunku 2. Pogrubione krawędzie to minimalne drzewo rozpinające math o koszcie 15.

Rys. 3 Graf math otrzymany poprzez wyznaczenie najkrótszych ścieżek pomiędzy każdą parą terminali grafu z rysunku 2. Pogrubione krawędzie to minimalne drzewo rozpinające math o koszcie 15.

Przeanalizujmy ten pomysł w języku teorii grafów. Zmierzmy najkrótsze odległości między każdą parą miast. Zbudujmy graf pełny math o zbiorze wierzchołków math Dla miast math jako długość krawędzi math przyjmijmy długość najkrótszej ścieżki między math i math w grafie math Graf math odpowiada grafowi składającemu się z boków trójkąta math w rozpatrywanym na początku problemie na płaszczyźnie, przy założeniu, że robotnicy księcia Piotrusia nie potrafią budować dodatkowych skrzyżowań, ale potrafią budować najkrótsze drogi między każdą parą miast. W grafie math znajdźmy minimalne drzewo rozpinające math – można to zrobić wielomianowo za pomocą jednego z klasycznych algorytmów, np. Kruskala lub Prima. Następnie dla każdej krawędzi math drzewa math w grafie math zbudujmy ciąg dróg odpowiadający najkrótszej ścieżce między math i math W ten sposób w math połączymy wszystkie miasta. Zauważmy, że możliwa jest sytuacja, w której jedną drogę (krawędź oryginalnego grafu) będziemy chcieli wybudować więcej niż raz, gdyż była ona częścią kilku najkrótszych ścieżek wybranych do drzewa rozpinającego. Jednakże w takim wypadku uzyskane drzewo Steinera będzie tańsze niż drzewo math więc jest to dla nas sytuacja jak najbardziej korzystna. Zastanówmy się, o ile droższe może być drzewo math od rozwiązania optymalnego?

obrazek

Rys. 4 Lewy rysunek przedstawia cykl Eulera otrzymany przez podwojenie krawędzi drzewa math z rysunku 2. Po prawej stronie znajduje się zbiór krawędzi math rozpinający graf mathodpowiadający temu cyklowi Eulera (kolejne terminale na cyklu łączymy krawędziami w math).

Rys. 4 Lewy rysunek przedstawia cykl Eulera otrzymany przez podwojenie krawędzi drzewa math z rysunku 2. Po prawej stronie znajduje się zbiór krawędzi math rozpinający graf mathodpowiadający temu cyklowi Eulera (kolejne terminale na cyklu łączymy krawędziami w math).

Niech math będzie optymalnym drzewem Steinera. Wykonujemy następującą operację, kluczową dla całej analizy, mianowicie podwajamy krawędzie drzewa math W ten sposób otrzymujemy graf spójny, w którym każdy wierzchołek ma stopień parzysty. Ma on więc cykl Eulera o długości równej dwukrotności kosztu drzewa math Zauważmy, że fragmenty cyklu prowadzące pomiędzy kolejnymi terminalami mają długości co najmniej takie, jak długości odpowiednich krawędzi w grafie math gdyż długości krawędzi w grafie math odpowiadają najkrótszym ścieżkom w math Zatem podwojony koszt drzewa math jest nie mniejszy niż koszt pewnego zbioru krawędzi math rozpinającego graf math który to koszt jest z kolei nie mniejszy niż koszt drzewa math które jest minimalnym drzewem rozpinającym w grafie math Stąd, nasz algorytm aproksymacyjny znajdzie drzewo Steinera o koszcie nie większym niż dwukrotność kosztu optymalnego drzewa Steinera.

A czy da się lepiej? To znaczy, czy w czasie wielomianowym możliwe jest skonstruowanie drzewa Steinera, którego koszt będzie mniejszy niż dwukrotność optymalnego rozwiązania?

Okazuje się, że próbując lokalnie poprawiać otrzymane drzewo, np. starając się wybierać wierzchołki Steinera o stopniu math można otrzymać trochę lepszy współczynnik aproksymacji (największy iloraz znalezionego przez nas rozwiązania oraz rozwiązania optymalnego). Najlepszy aktualnie znany algorytm aproksymacyjny dla problemu drzewa Steinera znajduje zawsze rozwiązanie nie gorsze niż 1,39 optymalnego kosztu. Algorytm ten pochodzi z 2010 roku, a jednym z jego autorów jest Jarosław Byrka z Uniwersytetu Wrocławskiego.

Na dziś starczy algorytmów aproksymacyjnych. Teraz będziemy próbowali rozwiązać problem drzewa Steinera w sposób dokładny, lecz w wersji bez długości. W tym sformułowaniu problem przejawia naturę kombinatoryczną.

Uporządkowanym etykietowanym drzewem nazwiemy drzewo z wyróżnionym korzeniem, w którym zbiór synów każdego wierzchołka jest uporządkowany (tzn. ich kolejność ma znaczenie). Każdy wierzchołek takiego drzewa ma etykietę będącą identyfikatorem wierzchołka z grafu math Aby uporządkowane etykietowane drzewo math było poprawne, musi być spełniony warunek, że jeśli w drzewie math mamy krawędź łączącą wierzchołki o etykietach math to w grafie math istnieje krawędź math Zauważmy, że nie wymagamy, aby etykiety wierzchołków drzewa były różne, jednakże etykieta każdego wierzchołka jest różna od etykiety ojca, gdyż w grafie math nie ma pętli.

obrazek

Rys. 5 Graf math oraz jedno z poprawnych uporządkowanych etykietowanych drzew math Zauważmy, że drzewo math nie musi zawierać wszystkich etykiet wierzchołków z grafu math

Rys. 5 Graf math oraz jedno z poprawnych uporządkowanych etykietowanych drzew math Zauważmy, że drzewo math nie musi zawierać wszystkich etykiet wierzchołków z grafu math

Zauważmy, że jeśli w grafie math istnieje uporządkowane etykietowane drzewo math którego zbiór etykiet zawiera identyfikatory wszystkich terminali, to optymalne drzewo Steinera ma nie więcej niż math wierzchołków, gdyż możemy użyć drzewa math do konstrukcji zbioru dróg, które rozpinają cały zbiór terminali.

Wygodniej będzie, gdy zamienimy problem optymalizacyjny, jakim jest poszukiwanie minimalnej liczby wierzchołków w drzewie Steinera, na problem decyzyjny, w którym mamy stwierdzić, czy w danym grafie istnieje drzewo Steinera zawierające nie więcej niż math wierzchołków. Zamiast szukać drzewa Steinera, będziemy szukać uporządkowanego etykietowanego drzewa mathktórego zbiór etykiet zawiera wszystkie identyfikatory terminali ze zbioru math Okazuje się jednak, że dużo łatwiej szuka się drzewa, które nie zawiera pewnych etykiet, dlatego też użyjemy zasady włączeń i wyłączeń (czyli uogólnienia wzoru math na większą liczbę zbiorów). Niech math dla math i math oznacza liczbę uporządkowanych etykietowanych drzew o math wierzchołkach, których zbiór etykiet nie zawiera identyfikatorów terminali ze zbioru math Wartość math dla ustalonych math oraz math można obliczyć w czasie wielomianowym standardowym algorytmem programowania dynamicznego, co pozostawiamy Drogiemu Czytelnikowi jako ćwiczenie. Zauważmy też, że na mocy zasady włączeń i wyłączeń liczba uporządkowanych drzew math-wierzchołkowych zawierających wszystkie etykiety ze zbioru math jest równa:

display-math

Skoro każdą wartość math potrafimy obliczyć w czasie wielomianowym, to powyższą sumę możemy obliczyć w czasie math przy czym przez math oznaczamy czas wielomianowy względem math Ten algorytm zaprezentował w 2009 roku Jesper Nederlof, a główną zaletą tej metody jest to, że zależność wykładnicza dotyczy jedynie math a nie całego math Pytaniem otwartym jest, czy da się to zrobić szybciej, np. w czasie math dla jakiegoś math

W artykule Pokrycie wierzchołkowe kontratakuje (Delta 4/2010) przedstawiliśmy ideę kernelizacji. Algorytm kernelizacyjny to taki, który szybko (w czasie wielomianowym) istotnie zmniejsza rozmiar problemu w ten sposób, że dla zmniejszonej instancji wynik jest taki sam jak dla oryginalnej. Spróbujmy zrozumieć, czego oczekiwalibyśmy od algorytmu kernelizacyjnego dla problemu drzewa Steinera. Wejściem (decyzyjnej wersji) problemu drzewa Steinera bez długości jest graf math zbiór terminali (miast) math oraz liczba całkowita math; chcemy znaleźć drzewo matho co najwyżej math wierzchołkach, zawierające wszystkie terminale. Chcielibyśmy w czasie wielomianowym zredukować rozmiar grafu; powiedzmy, że oczekujemy, że po redukcji graf będzie wielkości wielomianowej względem math Pokażemy, dlaczego jest to niemożliwe (przy odpowiednich założeniach teoriozłożonościowych).

Na chwilę przenieśmy się do innego zagadnienia. W problemie znajdowania motywu w grafie mamy dany graf math w którym każdy wierzchołek jest pomalowany na jeden z math kolorów. Chcemy wybrać po jednym wierzchołku każdego koloru tak, by wybrane wierzchołki tworzyły (indukowały) graf spójny. Taki zbiór wierzchołków nazywamy motywem. Co może wydać się zaskakujące, problem ten jest NP-trudny, nawet gdy math jest drzewem, którego wszystkie wierzchołki mają stopień nie większy niż trzy.

Zauważmy, że problem drzewa Steinera jest co najmniej tak trudny jak problem znajdowania motywu w grafie. Faktycznie, istnieje sprowadzenie (redukcja) przekształcające instancje problemu znajdowania motywu w grafie na instancje problemu drzewa Steinera. Mając daną instancję problemu znajdowania motywu w grafie math dla każdego koloru math dodajemy terminal math połączony ze wszystkimi wierzchołkami koloru math Łatwo zauważyć, że drzewo Steinera o math wierzchołkach w grafie math z dodanymi terminalami odpowiada motywowi w oryginalnym grafie math Jest tak dlatego, że dwa różne terminale nigdy nie mają wspólnego sąsiada, co oznacza, że do drzewa Steinera musimy wybrać co najmniej math wierzchołków niebędących terminalami. Jednakże szukamy drzewa o co najwyżej math wierzchołkach, co oznacza, że zbiór nieterminali, które wybierzemy do drzewa Steinera, musi być spójny, gdyż nie możemy sobie pozwolić na wybranie żadnego dodatkowego wierzchołka. Ten spójny zbiór nieterminali odpowiada motywowi w oryginalnym grafie, jako że sąsiedzi różnych terminali mają różne kolory.

Teraz załóżmy, że mamy algorytm kernelizacyjny dla problemu drzewa Steinera w grafie bez długości, tj. algorytm, który w czasie wielomianowym redukuje rozmiar grafu math do wielkości wielomianowej od math – liczby terminali w grafie. Możemy wtedy wykonać następującą operację:

1.
Załóżmy, że mamy dany długi ciąg instancji problemu znajdowania motywu w grafie math ; każda instancja ma dokładnie math kolorów.
2.
Tworzymy graf math który jest sumą rozłączną wszystkich grafów math math Kolory wierzchołków są takie same jak w grafach math Zauważmy, że w grafie math istnieje motyw wtedy i tylko wtedy, gdy istnieje on w co najmniej jednym z grafów math : motyw musi być spójny, więc musi zawierać się w jednej spójnej składowej grafu math
3.
Redukujemy problem znajdowania motywu w grafie math do problemu znajdowania drzewa Steinera, tak jak w poprzednim akapicie: dodajemy po jednym terminalu każdego koloru. Otrzymujemy graf math w którym szukamy drzewa Steinera o math wierzchołkach.
4.
Na grafie math uruchamiamy algorytm kernelizacyjny, który zmniejsza graf math do rozmiarów wielomianowych względem math (czyli wielomianowych względem math).

Przeanalizujmy, co się stało. Liczba początkowych instancji – math – mogła być bardzo duża, ponadwielomianowa w stosunku do math Na końcu otrzymaliśmy jedną instancję problemu znajdowania drzewa Steinera o dużo mniejszej liczbie wierzchołków – wielomianowej względem math Przy tym ta końcowa instancja jest „syntezą” początkowych instancji: istnieje w niej odpowiednio małe drzewo Steinera wtedy i tylko wtedy, gdy co najmniej jedna początkowa instancja miała motyw. Końcowa instancja jest jednak bardzo mała i nie ma szans pomieścić informacji o wszystkich początkowych instancjach problemu znajdowania motywu w grafie – intuicyjnie oznacza to, że musieliśmy większość instancji math w jakiś sposób rozwiązać. Okazuje się, że dla problemu NP-zupełnego taka operacja nie może nam się udać; powyższe rozumowanie można sformalizować i pokazać, że algorytm kernelizacyjny dla problemu drzewa Steinera pociągałby za sobą dużą rewolucję w teorii złożoności, co jest mało prawdopodobne. Dodajmy tylko, że użyta tutaj technika jest również stosunkowo nowa – pierwsi użyli jej Lance Fortnow i Rahul Santhanam w swojej pracy z 2008 roku.

Jak widać, problem drzewa Steinera ma wiele ciekawych obliczy i każdy znajdzie w nim coś dla siebie. Barwne jest życie algorytmika.

Do grupy naukowej badającej różne aspekty problemów NP-trudnych na wydziale Matematyki, Informatyki i Mechaniki Uniwersytetu Warszawskiego należą dr Łukasz Kowalik, dr Marcin Mucha, dr hab. Piotr Sankowski, dr Jakub Wojtaszczyk, a także doktoranci i studenci wydziału, w tym autorzy tego artykułu. Główne kierunki badań stanowią aproksymacja oraz algorytmy dokładne dla problemów NP-trudnych. Prace, których autorami są członkowie zespołu, są publikowane na najlepszych międzynarodowych konferencjach poświęconych informatyce teoretycznej oraz w uznanych periodykach naukowych. Członkowie grupy są laureatami programów stypendialnych Fundacji Nauki Polskiej, miesięcznika Polityka i nagród im. Witolda Lipskiego. Ponadto prace naukowe grupy badawczej prowadzone są w ramach grantów MNiSW, jak również prestiżowego grantu „Starting Independent Researcher Grant” ufundowanego przez European Research Council, którego kierownikiem jest dr hab. Piotr Sankowski.


Na zakończenie

Objaśnienie terminologii grafowej wykorzystanej w tym artykule można znaleźć np. w książce R.J. Wilsona Wprowadzenie do teorii grafów, natomiast opis wspomnianych algorytmów Kruskala i Prima służących do wyznaczania minimalnego drzewa rozpinającego – w książce T.H. Cormen, C.E. Leiserson, R.L. Rivest, C. Stein, Wprowadzenie do algorytmów.