Złożoność obliczeniowa/Wykład 7: Algorytmy aproksymacyjne: Różnice pomiędzy wersjami
Linia 58: | Linia 58: | ||
<center><math>a \geq 1 \wedge \forall_{I \in D_\Pi} | <center><math>a \geq 1 \wedge \forall_{I \in D_\Pi} | ||
\textnormal{obj}_\Pi} | \textnormal{obj}_\Pi}(I,\func{\mathcal{A}}(I)) \leq a \cdot | ||
\textnormal{opt}_\Pi} | \textnormal{opt}_\Pi}(I), | ||
</math></center> | </math></center> | ||
Linia 69: | Linia 69: | ||
<center><math>a \leq 1 \wedge \forall_{I \in D_\Pi} \ | <center><math>a \leq 1 \wedge \forall_{I \in D_\Pi} \textnormal{obj}_\Pi(I,\func{\mathcal{A}}(I)) \geq a \cdot \func{\opt_\Pi}{I} | ||
</math></center> | </math></center> | ||
Wersja z 20:37, 16 sie 2006
W poprzednich modułach pokazaliśmy o wielu problemach, że są Parser nie mógł rozpoznać (nieznana funkcja „\cc”): {\displaystyle \cc{NP}} -zupełne. Jeżeli Parser nie mógł rozpoznać (nieznana funkcja „\cc”): {\displaystyle \cc{P}\neq\cc{NP}} , to żaden z tych problemów nie może mieć rozwiązania, które działałoby w satysfakcjonujący sposób. Jednak wiele z nich to istotne zagadnienia praktyczne i metody choćby częściowego radzenia sobie z nimi są bardzo potrzebne. Konstruowane rozwiązania heurystyczne idą zazwyczaj w dwóch kierunkach:
- wyszukiwanie takich podproblemów, dla których można znaleźć rozwiązanie w czasie wielomianowym,
- szukanie algorytmów aproksymacyjnych, które nie rozwiązują problemu dokładnie, ale podają rozwiązania przybliżone do poprawnych.
W tym i w dwóch następnych modułach zajmiemy się właśnie tym drugim podejściem. Przedstawimy formalizmy, które służą do opisu algorytmów aproksymacyjnych i przeanalizujemy najistotniejsze przykłady.
Problem optymalizacyjny
Zwykłe problemy decyzyjne nie nadają się do aproksymowania, bo nie da się przybliżyć rozwiązania konkretnej instancji problemu, którym jest albo "tak", albo "nie". Problemy, które są podatne na aproksymację, to takie, w których odpowiedzią na konkretną instancję problemu jest jakiś kombinatoryczny obiekt z klasy rozwiązań dopuszczalnych. Wprowadzając dodatkowo funkcję celu na obiektach klasy rozwiązań dopuszczalnych możemy żądać, aby znaleziona odpowiedź minimalizowała (lub maksymalizowała) wartość tej funkcji po wszystkich rozwiązaniach dopuszczalnych.
Problem, który ma powyżej przedstawioną charakterystykę nazywamy problemem optymalizacyjnym i przedstawimy teraz jego formalną definicję w interesującej nas wersji dotyczącej aproksymowania problemów z klasy Parser nie mógł rozpoznać (nieznana funkcja „\cc”): {\displaystyle \cc{NP}} w czasie wielomianowym:
Definicja 1.1
Problem jest problemem Parser nie mógł rozpoznać (nieznana funkcja „\cc”): {\displaystyle \cc{NP}} -optymalizacyjnym, jeżeli składa się z:
- zbioru instancji . Rozmiarem instancji dla jest ilość bitów potrzebnych do zapisania ,
- zbioru rozwiązań dopuszczalnych dla każdej instancji Parser nie mógł rozpoznać (nieznana funkcja „\func”): {\displaystyle \func{S_\Pi}{I}}
. Zbiór ten musi posiadać dodatkowe własności:
- Parser nie mógł rozpoznać (nieznana funkcja „\func”): {\displaystyle \func{S_\Pi}{I} \neq \emptyset} - dla każdej instancji jest jakieś rozwiązanie dopuszczalne,
- każde Parser nie mógł rozpoznać (nieznana funkcja „\func”): {\displaystyle s \in \func{S_\Pi}{I}} ma rozmiar wielomianowy od i istnieje algorytm wielomianowy, który sprawdza czy dla pary Parser nie mógł rozpoznać (nieznana funkcja „\braq”): {\displaystyle \braq{I,s}} zachodzi Parser nie mógł rozpoznać (nieznana funkcja „\func”): {\displaystyle s \in \func{S_\Pi}{I}} ,
- funkcji celu Parser nie mógł rozpoznać (nieznana funkcja „\obj”): {\displaystyle \obj_\Pi} , która przyporządkowuje rozwiązaniom dopuszczalnym nieujemne wartości wymierne. Funkcja ta musi być wielomianowo obliczalna dla każdej pary Parser nie mógł rozpoznać (nieznana funkcja „\braq”): {\displaystyle \braq{I,s}} , gdzie jest instancją , a dopuszczalnym rozwiązaniem .
Definicja 1.2
Rozwiązaniem optymalnym minimalizacji (maksymalizacji) dla instancji problemu Parser nie mógł rozpoznać (nieznana funkcja „\cc”): {\displaystyle \cc{NP}} -optymalizacyjnego jest każde z rozwiązań dopuszczalnych, dla którego funkcja celu jest minimalna (maksymalna).
Wartość minimalną (maksymalną) funkcji celu oznaczamy przez Parser nie mógł rozpoznać (błąd składni): {\displaystyle \textnormal{opt}_\Pi}{I}} i nazywamy optimum. Często będziemy używać skróconej notacji Parser nie mógł rozpoznać (błąd składni): {\displaystyle \textnormal opt} , kiedy nie będzie wątpliwości jaki problem i jego instancję mamy na myśli.
Problemy optymalizacyjne, a problemy decyzyjne
Załóżmy, że mamy problem minimalizacji . Dla problemów maksymalizacyjnych całe rozumowanie jest analogiczne.
Z problemem w naturalny sposób jest związany problem decyzyjny równoważny pytaniu: "Czy dla zadanej instancji problemu i liczby istnieje rozwiązanie dopuszczalne osiągające wartość funkcji celu mniejszą niż ?".
Znając wartość optimum dla można natychmiast odpowiadać na pytania . Z drugiej strony, zazwyczaj można łatwo znaleźć wartość Parser nie mógł rozpoznać (nieznana funkcja „\texnormal”): {\displaystyle \texnormal{opt}_\Pi{I}} używając algorytmu rozwiązującego . Wystarczy użyć odpowiednio dobranego wyszukiwania binarnego.
Dość oczywistą i ważną własnością jest, że jeżeli problem jest Parser nie mógł rozpoznać (nieznana funkcja „\cc”): {\displaystyle \cc{NP}} -zupełny, to skojarzony z nim problem minimalizacji jest Parser nie mógł rozpoznać (nieznana funkcja „\cc”): {\displaystyle \cc{NP}} -trudny. W dalszej części wykładu będziemy analizować tylko problemy, których wersje decyzyjne są Parser nie mógł rozpoznać (nieznana funkcja „\cc”): {\displaystyle \cc{NP}} -zupełne.
Dla wielu problemów sama tylko umiejętność znajdowania wartości optimum wystarcza, aby w czasie wielomianowym znaleźć również rozwiązanie optymalne. Nie jest to jednak reguła - są problemy, o których zostało pokazane, że nie mają tej własności. Dlatego trzeba rozróżniać problem znalezienia wartości optimum i znalezienia rozwiązania optymalnego. Oczywiście ten drugi jest dla nas znacznie ciekawszy.
Rozwiązania aproksymacyjne
Wprowadzimy teraz pojęcie algorytmu aproksymacyjnego. Nie będzie ona zbyt restrykcyjna i będzie obejmować każdy algorytm znajdujący jakiekolwiek rozwiązania. Dopiero później zdefiniujemy pojęcia, które pozwolą mówić o skuteczności takich algorytmów.
Definicja 1.4
Algorytmem aproksymacyjnym dla minimalizacji (maksymalizacji) problemu Parser nie mógł rozpoznać (nieznana funkcja „\cc”): {\displaystyle \cc{NP}} -optymalizacyjnego nazywamy algorytm, który działa w czasie wielomianowym i dla każdej instancji problemu znajduje rozwiązanie dopuszczalne.
W domyśle interesują nas algorytmy, które znajdują rozwiązania przybliżające rozwiązanie optymalne. W związku z tym chcemy ograniczyć błąd jaki może popełnić algorytm. Stąd definicja:
Definicja 2.5
Jeżeli dla problemu minimalizacji i algorytmu istnieje stała Parser nie mógł rozpoznać (nieznana funkcja „\realsplus”): {\displaystyle a \in \realsplus} , taka że:
to jest algorytmem -aproksymacyjnym. Można też powiedzieć, że jest stałą aproksymacji algorytmu .
Jeżeli jest problemem maksymalizacji, to Algorytm musi spełniać odwrotną nierówność:
Istotne jest wymaganie, aby Parser nie mógł rozpoznać (nieznana funkcja „\realsplus”): {\displaystyle a \in \realsplus}
, gdyż każdy algorytm aproksymacyjny spełniałby powyższą równość dla .
Czasem algorytm nie ma stałej aproksymacji, ale różnicę pomiędzy rozwiązaniami znajdowanymi, a optymalnymi można ograniczyć przez funkcję zależną od rozmiaru instancji. Chcemy mieć możliwość uchwycenia również takich zależności.
Definicja 2.6
Jeżeli dla algorytmu rozwiązującego problem minimalizacji istnieje funkcja Parser nie mógł rozpoznać (nieznana funkcja „\naturals”): {\displaystyle \alpha : \naturals \rightarrow \realsplus} , taka że
to jest algorytmem -aproksymacyjnym.
Definicja dla problemu maksymalizacji jest analogiczna.
Zaprezentowane definicje pozwalają badać pesymistyczne zachowanie algorytmów. Często można również przeprowadzić analizę przypadku średniego, w którym znalezione rozwiązania są zazwyczaj znacząco lepsze od tych, które występują w przypadku pesymistycznym. My jednak skupimy się poszukiwaniu algorytmów, które dają gwarancję ograniczonego błędu dla dowolnej instancji.
Ćwiczenie 2.7 [Problemy decyzyjne jako problemy optymalizacyjne]
Przyjrzyjmy się bliżej związkom Parser nie mógł rozpoznać (nieznana funkcja „\cc”): {\displaystyle \cc{NP}} -zupełnych problemów decyzyjnych i Parser nie mógł rozpoznać (nieznana funkcja „\cc”): {\displaystyle \cc{NP}} -optymalizacyjnych. Skorzystamy z definicji języka należącego klasy Parser nie mógł rozpoznać (nieznana funkcja „\cc”): {\displaystyle \cc{NP}} :
gdzie jest świadkiem wielomianowo zrównoważonej relacji . Możemy teraz zdefiniować problem optymalizacyjny związany z językiem . Instancją problemu będzie dowolny ciąg bitów . Rozwiązaniami dopuszczalnymi będą dowolne ciągi o długości wielomianowo ograniczonej od Parser nie mógł rozpoznać (nieznana funkcja „\size”): {\displaystyle \size{x}}
(z tym samym wielomianem który decyduje o zrównoważeniu relacji ). Funkcja celu natomiast będzie zdefiniowana następująco:
}}
Pokrycie wierzchołkowe - NODE COVER
Pierwszym problemem, którego możliwość aproksymacji zbadamy jest problem minimalizacji rozmiaru pokrycia wierzchołkowego grafu. Jest to optymalizacyjna wersja problemu NODE COVER. Instancją problemu jest pojedynczy graf. Rozwiązaniami dopuszczalnymi są pokrycia wierzchołkowe tego grafu, a funkcją celu jest rozmiar znalezionego pokrycia. Interesuje nas oczywiście minimalizacja rozmiaru pokrycia.
Zarówno sprawdzenia dopuszczalności rozwiązania, jak i obliczenia funkcji celu można łatwo dokonać w czasie liniowym od rozmiaru grafu.
Algorytm zachłanny
Na początek przeanalizujemy najbardziej naturalne podejście do rozwiązania. Wykorzystamy metodę zachłanną konstruowania algorytmów. Wydaje się, że wybieranie do pokrycia wierzchołków, które mają największy stopień (a więc pokrywają najwięcej krawędzi), pozwala najszybciej pokryć cały graf. Prowadzi to do następującego algorytmu:
Algorytm zachłanny
Dopóki w grafie są krawędzie:
- wybierz wierzchołek o największym stopniu.
- dodaj do pokrycia i usuń z grafu wszystkie krawędzie incydentne z .
Okazuje się jednak, że ten algorytm, nie osiąga stałej aproksymacji. Aby dowieść tego faktu, wystarczy spojrzeć na poniższy przykład:
Przykład 2.2
pokrycie wierzchołkowe - ZO-7.1
Algorytm zachłanny najpierw wybierze do pokrycia wierzchołek z grupy (ma on stopień , gdy tymczasem wierzchołki z grupy mają stopień co najwyżej ). Po usunięciu tego wierzchołka stopień wierzchołków z spadnie do co najwyżej , więc algorytm wybierze wszystkie wierzchołki z grupy , itd.
W wyniku działania algorytmu zostanie skonstruowane pokrycie o rozmiarze Parser nie mógł rozpoznać (nieznana funkcja „\floor”): {\displaystyle \floor{\frac{n}{n}}+\floor{\frac{n}{n-1}}+\ldots+\floor{\frac{n}{2}}} , gdy tymczasem rozwiązaniem optymalnym jest pokrycie o rozmiarze .
Używając prostej analizy z wykorzystaniem sumy ciągu harmonicznego można pokazać, że dla instancji z tej konkretnej rodziny rozwiązanie znajdowane przez algorytm jest Parser nie mógł rozpoznać (nieznana funkcja „\notT”): {\displaystyle \notT{\log n}} razy gorsze od rozwiązania optymalnego.
Pierwsze, bardzo naturalne, podejście do problemu nie doprowadziło nas do algorytmu ze stałą aproksymacji. Niestety, regułą jest, że nie da się osiągnąć aproksymacji problemów Parser nie mógł rozpoznać (nieznana funkcja „\cc”): {\displaystyle \cc{NP}} -zupełnych tak prostymi sposobami i trzeba szukać bardziej wyrafinowanych metod. Oczywiście są od tej reguły wyjątki, które pokażemy. Teraz skonstruujemy algorytm -aproksymacyjny dla problemu pokrycia wierzchołkowego.
Algorytm skojarzeniowy
Algorytm ten jest bardzo prosty w konstrukcji:
Algorytm skojarzeniowy
- Znajdź dowolne skojarzenie maksymalne (w sensie inkluzji) w grafie .
- Wypisz wszystkie wierzchołki występujące w .
Animacja:algorytm skojarzeniowy - ZO-7.2
Twierdzenie 2.4
Algorytm skojarzeniowy jest algorytmem -aproksymacyjnym dla problemu minimalizacji rozmiaru pokrycia wierzchołkowego.
Dowód
Najpierw musimy pokazać, że wierzchołki tworzą pokrycie . Gdyby jakaś krawędź nie była pokryta, oznaczałoby to, że żaden z jej końców nie należy do i można by poszerzyć skojarzenie o tą krawędź, co przeczy maksymalności .
Niech będzie optymalnym pokryciem. Zauważmy, że ponieważ jest skojarzeniem, to zawiera Parser nie mógł rozpoznać (nieznana funkcja „\size”): {\displaystyle \size{M}} krawędzi, z których żadne dwie nie mają wspólnego wierzchołka. Zatem w pokryciu musi się znajdować przynajmniej jeden z końców każdej z tych krawędzi (w przeciwnym wypadku, krawędź ta byłaby niepokryta przez ). Z tego wynika, że
a liczba wierzchołków w pokryciu znalezionym przez algorytm wynosi , co dowodzi że jest to algorytm -aproksymacyjny.

Ćwiczenie 2.5 [Pesymistyczny przypadek dla algorytmu skojarzeniowego]
Ćwiczenie 2.6 [Konstrukcja rozwiązania optymalnego z wyrocznią podającą optimum]
Problem maksymalnego przekroju - MAX CUT
Ciekawym problemem optymalizacyjnym, który daje się łatwo aproksymować jest problem maksymalnego przekroju.