Przeskocz do treści

Delta mi!

Pokrycie wierzchołkowe kontratakuje

Marcin Pilipczuk

o artykule ...

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

Delcie 7/2009 Marek Cygan opisał pewien sposób radzenia sobie z tym, że dla niektórych trudnych problemów nie potrafimy znaleźć szybkiego algorytmu. Autor rozważał klasę problemów NP-trudnych – czyli takich, których prawdopodobnie nie można rozwiązać w czasie wielomianowym – i pokazywał, że dla wielu z nich można w efektywny sposób skonstruować nie dokładne, lecz przybliżone rozwiązanie.

W tym artykule spróbujemy ugryźć trudne problemy z drugiej strony. Wciąż poruszamy się w świecie algorytmów działających w czasie wielomianowym – te uznajemy za szybkie. Ale zamiast poszukiwać dokładnego rozwiązania, użyjemy innej sztuczki: będziemy szukali algorytmów, które starają się jak najbardziej zmniejszyć rozmiar instancji (czyli egzemplarza problemu, np. zadanego grafu), zachowując przy tym odpowiedź. Wówczas, dla zredukowanej instancji, możemy odpalić nasz ulubiony algorytm dokładny, np. rozpatrujący wszystkie możliwości. A jako że rozmiar egzemplarza będzie dużo mniejszy od początkowego, algorytm dokładny być może zadziała całkiem szybko. Przejdźmy do przykładu.

Definicja. Pokryciem wierzchołkowym w grafie math nazwiemy taki zbiór wierzchołków math że każda krawędź math ma co najmniej jeden koniec w math

Problem znalezienia liczności najmniejszego pokrycia wierzchołkowego w danym grafie jest NP-trudny. Marek Cygan w swoim artykule pokazywał, jak szybko znaleźć pokrycie wierzchołkowe, które jest co najwyżej dwa razy liczniejsze od optymalnego (czyli tzw. math-aproksymację).

My będziemy rozważać wersję problemu pokrycia wierzchołkowego, w której odpowiedź jest binarna („TAK” lub „NIE”). Mianowicie, mając dany graf math oraz liczbę naturalną math pytamy, czy w grafie math istnieje pokrycie wierzchołkowe zawierające co najwyżej math wierzchołków. Oczywiście, z punktu widzenia algorytmów wielomianowych obie wersje są równoważne: mając dany algorytm rozwiązujący wersję decyzyjną, możemy wyszukać najmniejsze math dla którego algorytm ten daje odpowiedź „TAK”, i w ten sposób otrzymać rozmiar najmniejszego pokrycia wierzchołkowego.

Mamy więc dany graf math i liczbę math Co możemy teraz zrobić? Ustalmy wierzchołek math Jeśli math nie należy do pewnego pokrycia wierzchołkowego math to wszyscy sąsiedzi math muszą należeć do math Poszukujemy math o mocy co najwyżej math więc jeśli math ma co najmniej math sąsiadów, to musimy wziąć math do math W ten sposób otrzymaliśmy następującą regułę redukcyjną:

jeśli w grafie math jest wierzchołek math który ma co najmniej math sąsiadów, wyrzuć z math wierzchołek math oraz incydentne z nim krawędzie oraz zmniejsz math o jeden.

W wyniku zastosowania tej reguły otrzymaliśmy równorzędną instancję problemu pokrycia wierzchołkowego: w zredukowanym grafie istnieje pokrycie wierzchołkowe rozmiaru co najwyżej math wtedy i tylko wtedy, gdy w oryginalnym grafie istniało pokrycie wierzchołkowe rozmiaru co najwyżej math

A co się dzieje, jeśli nie możemy zastosować powyższej reguły? Każdy wierzchołek jest incydentny z co najwyżej math krawędziami, więc pokrycie wierzchołkowe math pokrywa co najwyżej math krawędzi. Czyli, jeśli nie możemy zastosować naszej reguły, a zostało nam więcej niż math krawędzi, możemy śmiało odpowiedzieć „NIE”.

Otrzymaliśmy właśnie coś, co informatycy nazywają jądrem (ang. kernel) problemu pokrycia wierzchołkowego: pokazaliśmy szybki algorytm, który albo rozwiązuje problem pokrycia wierzchołkowego, albo znajduje równoważną instancję problemu o co najwyżej math krawędziach. Zwróćmy uwagę na to, że rozmiar zredukowanego grafu zależy tylko od parametru math a nie od rozmiaru wyjściowego grafu: początkowy graf mógł być olbrzymi.

A może da się lepiej? Zredukowaliśmy graf do math krawędzi, ale może da się jeszcze ograniczyć liczbę wierzchołków? Zacznijmy od prostej obserwacji: z grafu math możemy wyrzucić wszystkie wierzchołki izolowane. Zostanie nam co najwyżej math wierzchołków. Pokażemy teraz inną regułę redukcyjną – istotnie bardziej skomplikowaną od poprzedniej – która prowadzi do dużo mniejszego grafu: zredukujemy liczbę wierzchołków do math Załóżmy więc, że math ma więcej niż math wierzchołków.

Aproksymując pokrycie wierzchołkowe, Marek Cygan używał skojarzeń. My również ich użyjmy. Skojarzeniem w grafie nazywamy zbiór krawędzi, w którym żadne dwie nie mają wspólnego końca. Istnieje szybki algorytm znajdujący najliczniejsze skojarzenie w dowolnym grafie – załóżmy więc, że znamy math najliczniejsze skojarzenie w grafie math Zauważmy, iż w dowolnym pokryciu wierzchołkowym musi być co najmniej jeden koniec każdej krawędzi z math Skoro te nie są incydentne, to jeśli math możemy od razu odpowiedzieć „NIE”. Załóżmy więc dalej, że math

Niech math będzie zbiorem wierzchołków, które są końcami krawędzi w math a math  niech będzie zbiorem pozostałych wierzchołków. Skoro math to math czyli math Co więcej, zauważmy, że w math nie ma żadnej krawędzi łączącej dwa wierzchołki w math : gdyby była, moglibyśmy dodać ją do math powiększając liczność skojarzenia.

obrazek

Rys. 1 Krok konstrukcyjny: wybór math oraz math

Rys. 1 Krok konstrukcyjny: wybór math oraz math

Uwaga, teraz będziemy robić coś skomplikowanego. Wyrzućmy z grafu math wszystkie krawędzie o obu końcach w math Otrzymamy wówczas graf dwudzielny math który z jednej strony będzie miał math a z drugiej math Sprawdźmy, czy w tym grafie istnieje skojarzenie rozmiaru math (czyli największe możliwe). Jeśli nie istnieje, to, z twierdzenia Halla, istnieje zbiór math i zbiór jego sąsiadów math taki że math Wyrzućmy z grafu math  i math tj. weźmy mathmath Postępujmy tak do skutku, tj. mając dane math  i math :

1.
konstruujemy graf dwudzielny math biorąc z grafu math tylko krawędzie łączące math  z math ;
2.
sprawdzamy, czy istnieje w tym grafie skojarzenie rozmiaru math – jeśli tak, to koniec;
3.
jeśli nie, to korzystając z twierdzenia Halla, znajdujemy zbiór math i zbiór jego sąsiadów math taki że math ;
4.
przypisujemy math math

Pomińmy tutaj problem, jak znajdować zbiory math  i math: wystarczy nam informacja, że można to zrobić w czasie wielomianowym. Zauważmy, że postępując według powyższej procedury, utrzymujemy następujące niezmienniki:

1.
w math nie ma krawędzi łączącej dwa wierzchołki ze zbioru math gdyż math a ten warunek był spełniony już dla math ;
2.
math bo math i w każdym kroku math ;
3.
zawsze math gdyż zbiorem sąsiadów math jest całe math – żaden z wierzchołków math nie jest izolowany, bo te usunęliśmy. A zatem math nigdy nie stanie się puste;
4.
math  jest zbiorem sąsiadów math gdyż za każdym razem usuwając z math zbiór math ze zbioru math usuwamy math czyli wszystkich sąsiadów math

W związku z tym, gdy nasza procedura zakończy działanie, otrzymamy niepuste zbiory wierzchołków math oraz math o następujących własnościach:

1.
w math nie ma krawędzi łączącej dwa wierzchołki z math ;
2.
istnieje skojarzenie math rozmiaru math w którym każda krawędź łączy wierzchołek z math z wierzchołkiem z math ;
3.
math  jest zbiorem sąsiadów math
obrazek

Rys. 2 Rozkład koronny grafu math

Rys. 2 Rozkład koronny grafu math

To, co właśnie otrzymaliśmy, nazywamy rozkładem koronnym (ang. crown decomposition) grafu: mamy koronę math leżącą na głowie math Zauważmy, że w dowolnym pokryciu wierzchołkowym w grafie math musimy wybrać co najmniej math wierzchołków spośród math – musimy wybrać po końcu każdej krawędzi z math Ale, z drugiej strony, biorąc do pokrycia wierzchołkowego całe math pokrywamy wszystkie krawędzie incydentne z  math Możemy więc zachłannie wziąć do pokrycia wierzchołkowego całe math i usunąć z grafu wierzchołki math oraz incydentne z nimi krawędzie. Tym samym zmniejszyliśmy rozmiar grafu.

Zastanówmy się, co właśnie osiągnęliśmy. Wyszliśmy od takiej instancji problemu pokrycia wierzchołkowego (grafu math oraz parametru math), że graf math miał więcej niż math wierzchołków. Przeraźliwie Uważny Czytelnik zauważy także, że w powyższej konstrukcji po kryjomu założyliśmy math Możemy, dla danego grafu math z parametrem math powtarzać powyższą redukcję, dopóki jest to możliwe. Zauważmy, iż przy redukcji parametr math może się zmieniać – ale zawsze będzie malał. Mamy trzy możliwe zakończenia tej procedury: Zastanówmy się, co właśnie osiągnęliśmy. Wyszliśmy od takiej instancji problemu pokrycia wierzchołkowego (grafu math oraz parametru math), że graf math miał więcej niż math wierzchołków. Przeraźliwie Uważny Czytelnik zauważy także, że w powyższej konstrukcji po kryjomu założyliśmy math Możemy, dla danego grafu math z parametrem math powtarzać powyższą redukcję, dopóki jest to możliwe. Zauważmy, iż przy redukcji parametr math może się zmieniać – ale zawsze będzie malał. Mamy trzy możliwe zakończenia tej procedury:

1.
pewna redukcja odpowie „NIE”, gdyż rozmiar skojarzenia math będzie za duży – wówczas wiemy, że w początkowym grafie odpowiedź też była „NIE”;
2.
otrzymamy w wyniku redukcji parametr math – wówczas odpowiedź brzmi „TAK”, jeśli w grafie nie pozostała żadna krawędź, lub „NIE” w przeciwnym przypadku;
3.
otrzymamy nowy zredukowany graf math z nowym parametrem math taki że graf math ma co najwyżej math wierzchołków.

Pokazaliśmy właśnie, że algorytm polegający na aplikowaniu opisanej redukcji, dopóki jest to możliwe, prowadzi do zredukowania wyjściowego grafu do rozmiaru co najwyżej math gdzie math jest parametrem zredukowanej instancji, a więc jest nie większy od parametru oryginalnej instancji.

Wykonując powyższą konstrukcję trochę uważniej, można otrzymać jądro o math wierzchołkach, a komplikując dużo bardziej, da się dojść do algorytmu redukującego graf do math wierzchołków. Z drugiej strony, ostatnio udowodniono, że przy pewnych, rozsądnych założeniach z teorii złożoności nie istnieje jądro o math krawędziach dla żadnego math

Wiele NP-trudnych problemów ma niewielkie jądra. Bardzo często algorytmy redukujące są proste, opierają się na kombinatorycznych spostrzeżeniach, a nie na wielkiej teorii. Można by całą Deltę wypełnić opisami algorytmów jak ten powyżej, ale może jednak tego nie róbmy.