Złożoność obliczeniowa/Wykład 7: Algorytmy aproksymacyjne: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Pitab (dyskusja | edycje)
Pitab (dyskusja | edycje)
Linia 13: Linia 13:
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 <math>\cc{NP}</math> w czasie wielomianowym:
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 <math>\cc{NP}</math> w czasie wielomianowym:


{{definicja|1.1||
{{definicja|1.1|def 1.1|
Problem <math>\Pi</math> jest problemem <math>\cc{NP}</math>-optymalizacyjnym, jeżeli składa się z:
Problem <math>\Pi</math> jest problemem <math>\cc{NP}</math>-optymalizacyjnym, jeżeli składa się z:


Linia 21: Linia 21:
** każde <math>s \in \func{S_\Pi}{I}</math> ma rozmiar wielomianowy od <math>|I|</math> i istnieje algorytm wielomianowy, który sprawdza czy dla pary <math>\braq{I,s}</math> zachodzi <math>s \in \func{S_\Pi}{I}</math>,
** każde <math>s \in \func{S_\Pi}{I}</math> ma rozmiar wielomianowy od <math>|I|</math> i istnieje algorytm wielomianowy, który sprawdza czy dla pary <math>\braq{I,s}</math> zachodzi <math>s \in \func{S_\Pi}{I}</math>,
* funkcji celu <math>\obj_\Pi</math>, która przyporządkowuje rozwiązaniom dopuszczalnym nieujemne wartości wymierne. Funkcja ta musi być wielomianowo obliczalna dla każdej pary <math>\braq{I,s}</math>, gdzie <math>I</math> jest instancją <math>\Pi</math>, a <math>s</math> dopuszczalnym rozwiązaniem <math>I</math>.
* funkcji celu <math>\obj_\Pi</math>, która przyporządkowuje rozwiązaniom dopuszczalnym nieujemne wartości wymierne. Funkcja ta musi być wielomianowo obliczalna dla każdej pary <math>\braq{I,s}</math>, gdzie <math>I</math> jest instancją <math>\Pi</math>, a <math>s</math> dopuszczalnym rozwiązaniem <math>I</math>.
}}
{{definicja|1.2|def 1.2|
Rozwiązaniem optymalnym minimalizacji (maksymalizacji) dla instancji <math>I</math> problemu <math>\cc{NP}</math>-optymalizacyjnego <math>\Pi</math> jest każde z rozwiązań dopuszczalnych, dla którego funkcja celu jest minimalna (maksymalna).
}}
Wartość minimalną (maksymalną) funkcji celu oznaczamy przez <math>\func{\opt_\Pi}{I}</math> i nazywamy optimum. Często będziemy używać skróconej notacji <math>\opt</math>, 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 <math>\Pi</math>. Dla problemów maksymalizacyjnych całe rozumowanie jest analogiczne.
Z problemem <math>\Pi</math> w naturalny sposób jest związany problem decyzyjny <math>\Sigma</math> równoważny pytaniu: " Czy dla zadanej instancji <math>I</math> problemu <math>\Pi</math> i liczby <math>B</math> istnieje rozwiązanie dopuszczalne osiągające wartość funkcji celu mniejszą niż <math>B</math>?".
Znając wartość optimum dla <math>I</math> można natychmiast odpowiadać na pytania <math>\Sigma</math>. Z drugiej strony, zazwyczaj można łatwo znaleźć wartość <math>\func{\opt_\Pi}{I}</math> używając algorytmu rozwiązującego <math>\Sigma</math>. Wystarczy użyć odpowiednio dobranego wyszukiwania binarnego.
Dość oczywistą i ważną własnością jest, że jeżeli problem <math>\Sigma</math> jest <math>\cc{NP}</math>-zupełny, to skojarzony z nim problem minimalizacji jest <math>\cc{NP}</math>-trudny. W dalszej części wykładu będziemy analizować tylko problemy, których wersje decyzyjne są <math>\cc{NP}</math>-zupełne.
{{uwaga|1.3|uw 1.3|
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|def 1.4|
Algorytmem aproksymacyjnym <math>\mathcal{A}</math> dla minimalizacji (maksymalizacji) problemu <math>\cc{NP}</math>-optymalizacyjnego <math>\Pi</math> nazywamy algorytm, który działa w czasie wielomianowym i dla każdej instancji problemu <math>\Pi</math> 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|def 2.5|
Jeżeli dla problemu minimalizacji <math>\Pi</math> i algorytmu <math>\mathcal{A}</math> istnieje stała <math>a \in \realsplus</math>, taka że:
<center><math>a \geq 1 \wedge \forall_{I \in D_\Pi}
\func{\obj_\Pi}{I,\func{\mathcal{A}}{I}} \leq a \cdot
\func{\opt_\Pi}{I},
</math></center>
to <math>\mathcal{A}</math> jest algorytmem <math>a</math>-aproksymacyjnym. Można też powiedzieć, że <math>a</math> jest stałą aproksymacji algorytmu <math>\mathcal{A}</math>.
}}
Jeżeli <math>\Pi</math> jest problemem maksymalizacji, to Algorytm <math>\mathcal{A}</math> musi spełniać odwrotną nierówność:
<center><math>a \leq 1 \wedge \forall_{I \in D_\Pi} \func{\obj_\Pi}{I,\func{\mathcal{A}}{I}} \geq a \cdot \func{\opt_\Pi}{I}
</math></center>
Istotne jest wymaganie, aby <math>a \in \realsplus</math>, gdyż każdy algorytm aproksymacyjny spełniałby powyższą równość dla <math>a\leq0</math>.
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|def 2.6|
Jeżeli dla algorytmu <math>\mathcal{A}</math> rozwiązującego problem minimalizacji <math>\Pi</math> istnieje funkcja <math>\alpha : \naturals \rightarrow \realsplus</math>, taka że
<center><math>\forall_{n \in \naturals} \func{\alpha}{n} \geq 1 \wedge \forall_{I\in D_\Pi} \func{\obj_\Pi}{I,\func{\mathcal{A}}{I}} \leq
\func{\alpha}{\size{I}} \cdot \func{\opt_\Pi}{I},
</math></center>
to <math>\mathcal{A}</math> jest algorytmem <math>\alpha</math>-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.
{{cwiczenie|2.7 [Problemy decyzyjne jako problemy optymalizacyjne]|cw 2.7|
Przyjrzyjmy się bliżej związkom <math>\cc{NP}</math>-zupełnych problemów decyzyjnych i <math>\cc{NP}</math>-optymalizacyjnych. Skorzystamy z definicji języka <math>L</math> należącego klasy <math>\cc{NP}</math>:
<center><math>L = \defset{x}{\exists_y \braq{x,y} \in R}
</math></center>
gdzie <math>y</math> jest świadkiem wielomianowo zrównoważonej relacji <math>R</math>. Możemy teraz zdefiniować problem optymalizacyjny związany z językiem <math>L</math>. Instancją problemu <math>\Pi_L</math> będzie dowolny ciąg bitów <math>x</math>. Rozwiązaniami dopuszczalnymi będą dowolne ciągi <math>y</math> o długości wielomianowo ograniczonej od <math>\size{x}</math> (z tym samym wielomianem który decyduje o zrównoważeniu relacji <math>R</math>). Funkcja celu natomiast będzie zdefiniowana następująco:
<center><math>\func{\obj_{\Pi_L}}{x,y} =
\begincases
0\quad\braq{x,y} \notin R \\
1\quad\braq{x,y} \in R
\endcases
</math></center>
Pokaż, że jest to dobrze zdefiniowany problem <math>\cc{NP}</math>-optymalizacyjny i że o ile problem <math>L</math> jest <math>\cc{NP}</math>-zupełny i <math>\pneqnp</math>, to dla problemu maksymalizacji <math>\Pi_L</math> nie ma algorytmu <math>a</math>-aproksymacyjnego.}}
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none"> Użyj algorytmu <math>a</math>-aproksymacyjnego do znalezienia świadka relacji <math>R</math> lub stwierdzenia, że taki świadek nie istnieje.
</div></div>
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"> Żeby uzasadnić dobre postawienie problemu wystarczy powiedzieć, że dziedzina instancji jest dobrze określona, dla każdej instancji istnieją rozwiązania i są one wielomianowego rozmiaru, oraz że zarówno funkcja sprawdzająca  dopuszczalność rozwiązania, jak i funkcja celu są obliczalne w czasie wielomianowym. Wszystkie te własności są zapewnione przez wielomianowe zrównoważenie relacji <math>R</math>.
Załóżmy teraz, że <math>\mathcal{A}</math> jest algorytmem <math>a</math>-aproksymacyjnym dla problemu <math>\Pi_L</math>. Jeżeli <math>x \in L</math>, to <math>\func{\opt_{\Pi_L}}{x} = 1</math>, a w przeciwnym wypadku <math>\func{\opt_{\Pi_L}}{x} = 0</math>. W związku z tym rozwiązanie znajdowane przez algorytm <math>\func{\mathcal{A}}{x}</math> musi mieć wartość funkcji celu nie mniejszą niż <math>a > 0</math> dla <math>x \in L</math>. Oznacza to, że dla <math>x \in L</math> musi zachodzić <math>\braq{x,\func{\mathcal{A}}{x}} \in R</math>, bo w przeciwnym wypadku <math>\func{\obj_{\Pi_L}}{x,\func{\mathcal{A}}{x}}=0</math>. Dla dowolnego ciągu <math>x</math> możemy zatem uruchomić algorytm <math>\mathcal{A}</math>, który działa w czasie wielomianowym i sprawdzić, czy znalezione rozwiązanie jest świadkiem relacji <math>R</math> dla <math>x</math>.
Pokazaliśmy właśnie algorytm wielomianowy rozwiązujący <math>\cc{NP}</math>-zupełny problem <math>L</math>, co jest sprzeczne z założeniem <math>\pneqnp</math>.
</div></div>
}}
==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 <math>v</math> o największym stopniu.
# dodaj <math>v</math> do pokrycia i usuń z grafu wszystkie krawędzie incydentne z <math>v</math>.
Okazuje się jednak, że ten algorytm, nie osiąga stałej aproksymacji. Aby dowieść tego faktu, wystarczy spojrzeć na poniższy przykład:
{{przyklad|2.2|przy 2.2|
[[pokrycie wierzchołkowe - ZO-7.1]]
Algorytm zachłanny najpierw wybierze do pokrycia wierzchołek z grupy <math>B_n</math> (ma on stopień <math>n</math>, gdy tymczasem wierzchołki z grupy <math>A</math> mają stopień co najwyżej <math>n-1</math>). Po usunięciu tego wierzchołka stopień wierzchołków z <math>A</math> spadnie do co najwyżej <math>n-2</math>, więc algorytm wybierze wszystkie wierzchołki z grupy <math>B_{n-1}</math>, itd.
W wyniku działania algorytmu zostanie skonstruowane pokrycie <math>B_n \cup B_{n-1} \cup \ldots \cup B_2</math> o rozmiarze <math>\floor{\frac{n}{n}}+\floor{\frac{n}{n-1}}+\ldots+\floor{\frac{n}{2}}</math>, gdy tymczasem rozwiązaniem optymalnym jest pokrycie <math>A</math> o rozmiarze <math>n</math>.
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 <math>\notT{\log n}</math> 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 <math>\cc{NP}</math>-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 <math>2</math>-aproksymacyjny dla problemu pokrycia wierzchołkowego.
===Algorytm skojarzeniowy===
Algorytm ten jest bardzo prosty w konstrukcji:
Algorytm skojarzeniowy
# Znajdź dowolne skojarzenie maksymalne (w sensie inkluzji) <math>M</math> w grafie <math>G</math>.
# Wypisz wszystkie wierzchołki występujące w <math>M</math>.
[[Animacja:algorytm skojarzeniowy - ZO-7.2]]
{{twierdzenie|2.4|tw 2.4|
Algorytm skojarzeniowy jest algorytmem <math>2</math>-aproksymacyjnym dla problemu minimalizacji rozmiaru pokrycia wierzchołkowego.
}}
{{dowod|||
Najpierw musimy pokazać, że wierzchołki <math>M</math> tworzą pokrycie <math>G</math>. Gdyby jakaś krawędź nie była pokryta, oznaczałoby to, że żaden z jej końców nie należy do <math>M</math> i można by poszerzyć skojarzenie o tą krawędź, co przeczy maksymalności <math>M</math>.
Niech <math>O</math> będzie optymalnym pokryciem. Zauważmy, że ponieważ <math>M</math> jest skojarzeniem, to zawiera <math>\size{M}</math> krawędzi, z których żadne dwie nie mają wspólnego wierzchołka. Zatem w pokryciu <math>O</math> 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 <math>O</math>). Z tego wynika, że


<center><math>\size{M} \leq \size{O}\textnormal{,}
</math></center>
a liczba wierzchołków w pokryciu znalezionym przez algorytm wynosi <math>2M</math>, co dowodzi że jest to algorytm <math>2</math>-aproksymacyjny.
}}
}}
{{cwiczenie|2.5 [Pesymistyczny przypadek dla algorytmu skojarzeniowego]|cw 2.5|
Pokaż rodzinę grafów, dla których wynik algorytmu skojarzeniowego jest dokładnie <math>2</math> razy gorszy od optymalnego.}}
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none"> Dla grafów z tej rodziny pokrycie wierzchołkowe musi zawierać dokładnie po jednym wierzchołku z każdej krawędzi skojarzenia maksymalnego.
</div></div>
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"> Przykładem takiej rodziny grafów są pełne grafy dwudzielne <math>K_{n,n}</math> z <math>2n</math> wierzchołkami. Każde skojarzenie maksymalne w takim grafie ma <math>n</math> krawędzi, a więc <math>2n</math> wierzchołków. Tymczasem minimalne pokrycie wierzchołkowe składa się z dokładnie <math>n</math> wierzchołków.
[[Rysunek:graf <math>K_{n,n}</math> - ZO-7.3]]
</div></div>
}}
{{cwiczenie|2.6 [Konstrukcja rozwiązania optymalnego z wyrocznią podającą optimum]|cw 2.6|
Pokaż, że używając wyroczni podającej rozmiar najmniejszego pokrycia wierzchołkowego dla zadanego grafu, można znaleźć rozwiązanie optymalne problemu NODE COVER w czasie wielomianowym.}}
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none"> Użyj wyroczni do stwierdzenia czy konkretny wierzchołek należy do jakiegoś rozwiązania optymalnego.
</div></div>
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"> Oznaczmy odpowiedź wyroczni dla grafu <math>G</math> przez <math>\func{\mathcal{A}}{G}</math>.
Dla danego wierzchołka <math>x</math> możemy przy pomocy wyroczni <math>\mathcal{A}</math> stwierdzić, czy istnieje pokrycie wierzchołkowe minimalnego rozmiaru zawierające <math>x</math>. Wystarczy porównać wartości <math>\func{\mathcal{A}}{G}</math> i <math>\func{\mathcal{A}}{G-x}</math>. Druga z nich jest mniejsza od pierwszej wtedy i tylko wtedy, gdy istnieje pokrycie wierzchołkowe minimalnego rozmiaru zawierające <math>x</math>.
Po znalezieniu takiego wierzchołka <math>x</math> wystarczy go dodać do konstruowanego pokrycia, usunąć z grafu i kontynuować proces dopóki w grafie są jeszcze jakieś krawędzie.
</div></div>
}}
==Problem maksymalnego przekroju - MAX CUT==
Ciekawym problemem optymalizacyjnym, który daje się łatwo aproksymować jest problem maksymalnego przekroju.

Wersja z 20:23, 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 DΠ. Rozmiarem instancji |I| dla IDΠ jest ilość bitów potrzebnych do zapisania I,
  • 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| 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 I jest instancją Π, a s dopuszczalnym rozwiązaniem I.

Definicja 1.2

Rozwiązaniem optymalnym minimalizacji (maksymalizacji) dla instancji I 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ć (nieznana funkcja „\func”): {\displaystyle \func{\opt_\Pi}{I}} i nazywamy optimum. Często będziemy używać skróconej notacji Parser nie mógł rozpoznać (nieznana funkcja „\opt”): {\displaystyle \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 I problemu Π i liczby B istnieje rozwiązanie dopuszczalne osiągające wartość funkcji celu mniejszą niż B?".

Znając wartość optimum dla I można natychmiast odpowiadać na pytania Σ. Z drugiej strony, zazwyczaj można łatwo znaleźć wartość Parser nie mógł rozpoznać (nieznana funkcja „\func”): {\displaystyle \func{\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.

Uwaga 1.3

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:


Parser nie mógł rozpoznać (nieznana funkcja „\func”): {\displaystyle a \geq 1 \wedge \forall_{I \in D_\Pi} \func{\obj_\Pi}{I,\func{\mathcal{A}}{I}} \leq a \cdot \func{\opt_\Pi}{I}, }


to 𝒜 jest algorytmem a-aproksymacyjnym. Można też powiedzieć, że a jest stałą aproksymacji algorytmu 𝒜.

Jeżeli Π jest problemem maksymalizacji, to Algorytm 𝒜 musi spełniać odwrotną nierówność:


Parser nie mógł rozpoznać (nieznana funkcja „\func”): {\displaystyle a \leq 1 \wedge \forall_{I \in D_\Pi} \func{\obj_\Pi}{I,\func{\mathcal{A}}{I}} \geq a \cdot \func{\opt_\Pi}{I} }


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 a0.

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


Parser nie mógł rozpoznać (nieznana funkcja „\naturals”): {\displaystyle \forall_{n \in \naturals} \func{\alpha}{n} \geq 1 \wedge \forall_{I\in D_\Pi} \func{\obj_\Pi}{I,\func{\mathcal{A}}{I}} \leq \func{\alpha}{\size{I}} \cdot \func{\opt_\Pi}{I}, }


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 L należącego klasy Parser nie mógł rozpoznać (nieznana funkcja „\cc”): {\displaystyle \cc{NP}} :


Parser nie mógł rozpoznać (nieznana funkcja „\defset”): {\displaystyle L = \defset{x}{\exists_y \braq{x,y} \in R} }


gdzie y jest świadkiem wielomianowo zrównoważonej relacji R. Możemy teraz zdefiniować problem optymalizacyjny związany z językiem L. Instancją problemu ΠL będzie dowolny ciąg bitów x. Rozwiązaniami dopuszczalnymi będą dowolne ciągi y 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 R). Funkcja celu natomiast będzie zdefiniowana następująco:


Parser nie mógł rozpoznać (nieznana funkcja „\func”): {\displaystyle \func{\obj_{\Pi_L}}{x,y} = \begincases 0\quad\braq{x,y} \notin R \\ 1\quad\braq{x,y} \in R \endcases }


Pokaż, że jest to dobrze zdefiniowany problem Parser nie mógł rozpoznać (nieznana funkcja „\cc”): {\displaystyle \cc{NP}} -optymalizacyjny i że o ile problem L jest Parser nie mógł rozpoznać (nieznana funkcja „\cc”): {\displaystyle \cc{NP}} -zupełny i Parser nie mógł rozpoznać (nieznana funkcja „\pneqnp”): {\displaystyle \pneqnp} , to dla problemu maksymalizacji ΠL nie ma algorytmu a-aproksymacyjnego.
Wskazówka
Rozwiązanie

}}

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:

  1. wybierz wierzchołek v o największym stopniu.
  1. dodaj v do pokrycia i usuń z grafu wszystkie krawędzie incydentne z v.

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 Bn (ma on stopień n, gdy tymczasem wierzchołki z grupy A mają stopień co najwyżej n1). Po usunięciu tego wierzchołka stopień wierzchołków z A spadnie do co najwyżej n2, więc algorytm wybierze wszystkie wierzchołki z grupy Bn1, itd.

W wyniku działania algorytmu zostanie skonstruowane pokrycie BnBn1B2 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 A o rozmiarze n.

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 2-aproksymacyjny dla problemu pokrycia wierzchołkowego.

Algorytm skojarzeniowy

Algorytm ten jest bardzo prosty w konstrukcji:

Algorytm skojarzeniowy

  1. Znajdź dowolne skojarzenie maksymalne (w sensie inkluzji) M w grafie G.
  1. Wypisz wszystkie wierzchołki występujące w M.

Animacja:algorytm skojarzeniowy - ZO-7.2

Twierdzenie 2.4

Algorytm skojarzeniowy jest algorytmem 2-aproksymacyjnym dla problemu minimalizacji rozmiaru pokrycia wierzchołkowego.

Dowód

Najpierw musimy pokazać, że wierzchołki M tworzą pokrycie G. Gdyby jakaś krawędź nie była pokryta, oznaczałoby to, że żaden z jej końców nie należy do M i można by poszerzyć skojarzenie o tą krawędź, co przeczy maksymalności M.

Niech O będzie optymalnym pokryciem. Zauważmy, że ponieważ M 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 O 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 O). Z tego wynika, że


Parser nie mógł rozpoznać (nieznana funkcja „\size”): {\displaystyle \size{M} \leq \size{O}\textnormal{,} }


a liczba wierzchołków w pokryciu znalezionym przez algorytm wynosi 2M, co dowodzi że jest to algorytm 2-aproksymacyjny.

Ćwiczenie 2.5 [Pesymistyczny przypadek dla algorytmu skojarzeniowego]

Pokaż rodzinę grafów, dla których wynik algorytmu skojarzeniowego jest dokładnie 2 razy gorszy od optymalnego.
Wskazówka
Rozwiązanie

}}

Ćwiczenie 2.6 [Konstrukcja rozwiązania optymalnego z wyrocznią podającą optimum]

Pokaż, że używając wyroczni podającej rozmiar najmniejszego pokrycia wierzchołkowego dla zadanego grafu, można znaleźć rozwiązanie optymalne problemu NODE COVER w czasie wielomianowym.
Wskazówka
Rozwiązanie

}}

Problem maksymalnego przekroju - MAX CUT

Ciekawym problemem optymalizacyjnym, który daje się łatwo aproksymować jest problem maksymalnego przekroju.