Złożoność obliczeniowa/Wykałd 5: Problemy NP-zupełne: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Pitab (dyskusja | edycje)
Nie podano opisu zmian
 
Pitab (dyskusja | edycje)
Nie podano opisu zmian
Linia 1: Linia 1:
{article}
{}{0.5cm} {}{0.8cm} {}{ -0.4cm} {}{ -0.4cm} {}{1mm}
{proof}{ ''Dowód: ''}{ <math>\square</math>}
{hint}{ ''Wskazówka: ''}{}
{solution}{ ''Rozwiązanie: ''}{}
Złożoność obliczeniowa
Moduł 5
Problemy NP-zupełne
==Wstęp==
==Wstęp==


Linia 34: Linia 20:
do <math>Q</math>. Innymi słowy, proces dowodzenia że dany problem <math>Q</math> jest w
do <math>Q</math>. Innymi słowy, proces dowodzenia że dany problem <math>Q</math> jest w
NPC składa sie z nastepujących kroków:
NPC składa sie z nastepujących kroków:
* dowieść że <math>Q</math> należy do NP
* dowieść że <math>Q</math> należy do NP


* wybrać znany problem NP-zupełny <math>Q'</math> i skonstruować redukcję z <math>Q'</math>
* wybrać znany problem NP-zupełny <math>Q'</math> i skonstruować redukcję z <math>Q'</math> do <math>Q</math>.
do <math>Q</math>.


Przypomnijemy, że redukcja z problemu A do B dowodzi, że B jest
Przypomnijemy, że redukcja z problemu A do B dowodzi, że B jest
niełatwiejszy niż A. Zatem dla konstrukcji takiej redukcji łatwiej
niełatwiejszy niż A. Zatem dla konstrukcji takiej redukcji łatwiej
jest, gdy (są to rozważania czysto intuicyjne):
jest, gdy (są to rozważania czysto intuicyjne):
* problem A nie jest skomplikowany, tzn. instancje tego problemu
* problem A nie jest skomplikowany, tzn. instancje tego problemu
wykazują pewną regularność, łatwą do "opisu" lub "zmierzenia"
wykazują pewną regularność, łatwą do "opisu" lub "zmierzenia"
Linia 71: Linia 54:
faktu jest dość łatwy.
faktu jest dość łatwy.


{{twierdzenie|[Uzupelnij]||
{{twierdzenie|||
Problem 3SAT jest NP-zupełny.
Problem 3SAT jest NP-zupełny.
}}
}}


{{dowod|[Uzupelnij]||
{{dowod|||
Problem 3SAT, jako podproblem problemu w klasie NP, sam należy do
Problem 3SAT, jako podproblem problemu w klasie NP, sam należy do
NP, zatem pierwsza część dowodu jest za nami.
NP, zatem pierwsza część dowodu jest za nami.
Linia 88: Linia 71:
Niech <math>k>3</math>. Dodajemy <math>k-3</math> nowych zmiennych <math>y_2, \ldots, y_{k-2}</math>,
Niech <math>k>3</math>. Dodajemy <math>k-3</math> nowych zmiennych <math>y_2, \ldots, y_{k-2}</math>,
i zastepujemy <math>C_j</math> przez
i zastepujemy <math>C_j</math> przez
_j <nowiki>=</nowiki> (x_1 x_2 y_2)( y_2 x_3 y_3)
( y_3 x_4 y_4)  ...
( y_{k-2} x_{k-1} x_k)<center><math>


Nietrudno spostrzec, że jeśli </math>C_j<math> jest spełniona przez pewne
 
wartościowanie zmiennych </math>x_1,...,x_k<math>, to da się tak dobrać
<center><math>D_j = (x_1\vee x_2\vee y_2)\wedge( \neg y_2\vee x_3\vee y_3)\wedge
wartości dla zmiennych </math>y_2,...,y_{k-2}<math>, aby spełnione były
( \neg y_3\vee x_4\vee y_4)\wedge  ...
wszystkie klauzule w </math>D_j<math>. Na odwrót, jeśli </math>D_j<math> jest spełniona
\wedge(\neg y_{k-2}\vee x_{k-1}\vee x_k)</math></center>
 
 
Nietrudno spostrzec, że jeśli <math>C_j</math> jest spełniona przez pewne
wartościowanie zmiennych <math>x_1,...,x_k</math>, to da się tak dobrać
wartości dla zmiennych <math>y_2,...,y_{k-2}</math>, aby spełnione były
wszystkie klauzule w <math>D_j</math>. Na odwrót, jeśli <math>D_j</math> jest spełniona
dla pewnego wartościowania zmiennych
dla pewnego wartościowania zmiennych
</math>x_1,...,x_k,y_2,...,y_{k-2}<math>, to łatwo wydedukować, że
<math>x_1,...,x_k,y_2,...,y_{k-2}</math>, to łatwo wydedukować, że
</math>x_i<nowiki>=</nowiki>1<math> dla pewnego </math>1 i k<math>. Mianowicie, jeśli </math>x_1<nowiki>=</nowiki>x_2<nowiki>=</nowiki>0<math>,
<math>x_i<nowiki>=</nowiki>1</math> dla pewnego <math>1 i k</math>. Mianowicie, jeśli <math>x_1<nowiki>=</nowiki>x_2<nowiki>=</nowiki>0</math>,
to z pierwszej klauzuli w </math>D_j<math> wynika że </math>y_2<nowiki>=</nowiki>1<math>. Ale wtedy z
to z pierwszej klauzuli w <math>D_j</math> wynika że <math>y_2<nowiki>=</nowiki>1</math>. Ale wtedy z
drugiej klauzuli mamy </math>x_3<nowiki>=</nowiki>1<math> lub </math>y_3<nowiki>=</nowiki>1<math>. W pierwszym przypadku
drugiej klauzuli mamy <math>x_3<nowiki>=</nowiki>1</math> lub <math>y_3<nowiki>=</nowiki>1</math>. W pierwszym przypadku
rozumowanie jest zakończone, w drugim przenosimy rozumowanie na
rozumowanie jest zakończone, w drugim przenosimy rozumowanie na
trzecią klauzulę i tak dalej.
trzecią klauzulę i tak dalej.
Linia 109: Linia 95:
logarytmicznej. Zauważmy jednak, że aby wypisać formułę wynikową, MT
logarytmicznej. Zauważmy jednak, że aby wypisać formułę wynikową, MT
potrzebuje pamięć roboczą tylko na licznik bieżącej alternatywy
potrzebuje pamięć roboczą tylko na licznik bieżącej alternatywy
</math>C_j<math> oraz licznik wygenerowanych do tej pory nowych zmiennych.
<math>C_j</math> oraz licznik wygenerowanych do tej pory nowych zmiennych.
}}
}}


{{uwaga|[Uzupelnij]||
{{uwaga|[1]||
Zapewne zauważyłaś(-łeś), że w wielu podręcznikach do algorytmiki
Zapewne zauważyłaś(-łeś), że w wielu podręcznikach do algorytmiki
również mówi się o NP-zupełności. Na ogół korzysta się wtedy z
również mówi się o NP-zupełności. Na ogół korzysta się wtedy z
Linia 124: Linia 110:
}}
}}


{{uwaga|[Uzupelnij]||
{{uwaga|[2]||
W literaturze przyjmuje sie również nieco inną definicję problemu
W literaturze przyjmuje sie również nieco inną definicję problemu
3SAT, w której zakłada sie dodatkowo, że w każdej klauzuli występują
3SAT, w której zakłada sie dodatkowo, że w każdej klauzuli występują
Linia 131: Linia 117:
sposób:
sposób:


Załóżmy że </math>k<nowiki>=</nowiki>2<math>. Wprowadzamy nową zmienną </math>y<math> i kładziemy </math>D_j <nowiki>=</nowiki>
Załóżmy że <math>k<nowiki>=</nowiki>2</math>. Wprowadzamy nową zmienną <math>y</math> i kładziemy <math>D_j <nowiki>=</nowiki>
(x_1  x_2  y)  (x_1  x_2  y)<math>. Jeśli
(x_1\vee x_2\vee y)\wedge (x_1 \vee x_2 \vee \neg y)</math>. Jeśli
istnieje wartościowanie spełniające formułę </math><math>, to w tym
istnieje wartościowanie spełniające formułę <math><math>, to w tym
wartościowaniu formuła </math><math> powstała z </math><math> przez zastąpienie
wartościowaniu formuła </math><math> powstała z </math><math> przez zastąpienie
klauzuli </math>C_j<math> formułą </math>D_j<math> jest również spełniona. I na odwrót,
klauzuli <math>C_j</math> formułą </math>D_j<math> jest również spełniona. I na odwrót,
jeśli pewne wartościowanie spełnia formułę </math><math>, to aby </math>D_j<math> było
jeśli pewne wartościowanie spełnia formułę <math>\psi</math>, to aby <math>D_j</math> było
prawdziwe </math>x_1<math> lub </math>x_2<math> musi mieć wartość 1, a zatem to samo
prawdziwe <math>x_1</math> lub <math>x_2</math> musi mieć wartość 1, a zatem to samo
wartościowanie (bez zmiennej </math>y<math>) spełnia formułę </math><math>.
wartościowanie (bez zmiennej <math>y</math>) spełnia formułę <math>\phi </math>.


Analogicznie, jesli </math>C_j<math> składa się tylko z jednego literału, to
Analogicznie, jesli </math>C_j<math> składa się tylko z jednego literału, to

Wersja z 15:57, 31 lip 2006

Wstęp

Jak czytelnikowi wiadomo, w aktualnym stanie wiedzy NP-zupełność jest podstawowym narzędziem do badania probelu algorytmicznego pod kątem jego trudności obliczeniowej. Na tym wykładzie dla wielu znanych klasycznych problemów z teorii grafów, kombinatoryki, logiki i innych podajemy definicje ich decyzyjnych wersji i wykazujemy ich NP-zupełność. Z problematyką ta spotkaliśmy się już na kursie Algorytmy i struktury danych. Tutaj rozbudowujemy te wiadomości, czynimy je bardziej formalnymi posługując się modelem maszyny Turinga i redukcją logarytmiczną. Na przedstawionych przykładach omawiamy również techniki dowodzenia NP-zupełności. Następny wykład pokazuje wykorzystanie tych technik do analizy złożoności problemu i jego zawężeń.

O problemie SAT

Aby wykazać, że dany problem Q z klasy NP jest NP-zupełny, zgodnie z własnościami redukcji logarytmicznej (przechodniość) wystarcza pokazać, dla dowolnego problemu QNPC, że Q redukuje się do Q. Innymi słowy, proces dowodzenia że dany problem Q jest w NPC składa sie z nastepujących kroków:

  • dowieść że Q należy do NP
  • wybrać znany problem NP-zupełny Q i skonstruować redukcję z Q do Q.

Przypomnijemy, że redukcja z problemu A do B dowodzi, że B jest niełatwiejszy niż A. Zatem dla konstrukcji takiej redukcji łatwiej jest, gdy (są to rozważania czysto intuicyjne):

  • problem A nie jest skomplikowany, tzn. instancje tego problemu

wykazują pewną regularność, łatwą do "opisu" lub "zmierzenia"

  • problem B dopuszcza konstrukcje różnorodnych instancji, jest "bogaty

strukturalnie"

Stąd dla wypracowania sobie "warsztatu" dla konstruowania dowodów NP-zupełności warto rozpocząć od dowiedzenia tej własności dla kilku nieskomplikowanych (pod wzgledem opisu struktury) problemów. W rzeczywistości, w literaturze dotyczącej tych zagadnień, można wyodrębnić niewielką grupę klasycznych w tym sensie problemów, które najczęściej wystepują jako lewa strona redukcji w dowodach NP-zupełnosci. Poniżej definiujemy lub przypominamy grupe takich problemów, dość różnorodnego pochodzenia i zastosowania, i dowodzimy ich NP-zupełności.

Najpierw 3SAT

Zaczynamy od sytuacji, w której jedynym znanym problemem NP-zupełnym (a więc możliwą lewą stroną redukcji) jest problem SAT. Jest on dość niewygodny jako problem źródłowy, redukcja z SAT do innego problemu na ogół wymaga skomplikowanego opisu. Okazuje się (wykazał to już Cook w swojej fundamentalnej pracy o NP-zupełności), że podproblem problemu SAT, w którym wymagamy aby każda klauzula zawierała nie więcej niz 3 literały jest sam w sobie NP-zupełny, a dowód tego faktu jest dość łatwy.

Twierdzenie

Problem 3SAT jest NP-zupełny.

Dowód

Problem 3SAT, jako podproblem problemu w klasie NP, sam należy do NP, zatem pierwsza część dowodu jest za nami.

Konstruujemy redukcję z problemu SAT do 3SAT. Na wejściu mamy formułe ϕ=C1Cm nad zmiennymi x1,,xn. Każdą z klauzul Cj przekształcamy osobno. Bez straty ogólności załóżmy, że Cj=x1xk, gdzie xi,i=1,,k są parami różne. Jeśli k3 to kładziemy Dj=Cj.

Niech k>3. Dodajemy k3 nowych zmiennych y2,,yk2, i zastepujemy Cj przez


Dj=(x1x2y2)(¬y2x3y3)(¬y3x4y4)...(¬yk2xk1xk)


Nietrudno spostrzec, że jeśli Cj jest spełniona przez pewne wartościowanie zmiennych x1,...,xk, to da się tak dobrać wartości dla zmiennych y2,...,yk2, aby spełnione były wszystkie klauzule w Dj. Na odwrót, jeśli Dj jest spełniona dla pewnego wartościowania zmiennych x1,...,xk,y2,...,yk2, to łatwo wydedukować, że xi<nowiki>=</nowiki>1 dla pewnego 1ik. Mianowicie, jeśli x1<nowiki>=</nowiki>x2<nowiki>=</nowiki>0, to z pierwszej klauzuli w Dj wynika że y2<nowiki>=</nowiki>1. Ale wtedy z drugiej klauzuli mamy x3<nowiki>=</nowiki>1 lub y3<nowiki>=</nowiki>1. W pierwszym przypadku rozumowanie jest zakończone, w drugim przenosimy rozumowanie na trzecią klauzulę i tak dalej.

Zatem, po przekształceniu kolejno wszystkich alternatyw powstaje równoważna formuła o co najwyżej trójskładnikowych alternatywach. Pozostaje wykazać, że przekształcenie to realizowalne jest w pamięci logarytmicznej. Zauważmy jednak, że aby wypisać formułę wynikową, MT potrzebuje pamięć roboczą tylko na licznik bieżącej alternatywy Cj oraz licznik wygenerowanych do tej pory nowych zmiennych.

Uwaga [1]

Zapewne zauważyłaś(-łeś), że w wielu podręcznikach do algorytmiki również mówi się o NP-zupełności. Na ogół korzysta się wtedy z redukcji wielomianowej. Złożoność czasowa jest łatwiejsza do analizy w przypadku modelu obliczeń takiego jak (uproszczony) język programowania wysokiego poziomu. Analiza złożoności pamięciowej (i to tylko z uwzględnieniem pamięci roboczej) może być trudniejsza.

Redukcja logarytmiczna jest bardziej uniwersalna i dlatego stosujemy ją w teorii złożoności.

Uwaga [2]

W literaturze przyjmuje sie również nieco inną definicję problemu 3SAT, w której zakłada sie dodatkowo, że w każdej klauzuli występują dokładnie 3 parami różne literały. Dowód NP-zupełności tej wersji otrzymujemy przez uzupełnienie dowodu powyższego w następujący sposób:

Załóżmy że k<nowiki>=</nowiki>2. Wprowadzamy nową zmienną y i kładziemy Dj<nowiki>=</nowiki>(x1x2y)(x1x2¬y). Jeśli istnieje wartościowanie spełniające formułę Parser nie mógł rozpoznać (błąd składni): {\displaystyle <math>, to w tym wartościowaniu formuła } Parser nie mógł rozpoznać (błąd składni): {\displaystyle powstała z } Parser nie mógł rozpoznać (błąd składni): {\displaystyle przez zastąpienie klauzuli <math>C_j} formułą </math>D_jParser nie mógł rozpoznać (błąd składni): {\displaystyle jest również spełniona. I na odwrót, jeśli pewne wartościowanie spełnia formułę <math>\psi} , to aby Dj było prawdziwe x1 lub x2 musi mieć wartość 1, a zatem to samo wartościowanie (bez zmiennej y) spełnia formułę ϕ.

Analogicznie, jesli </math>C_jParser nie mógł rozpoznać (błąd składni): {\displaystyle składa się tylko z jednego literału, to przekształcamy go w koniunkcję czterech trójskładnikowych klauzul, z dodanymi dwiema nowymi zmiennymi. Z tego spostrzeżenia będziemy korzystać w następnych dowodach NP-zupełności. }} Odnotujmy w tym miejscu, że dalsze zawężenie problemu polegające na dopuszczeniu klauzul o co najwyżej dwóch literałach, 2SAT, jest problemem obliczeniowo łatwym. Dowód tego faktu odkładamy do nastepnej lekcji. ===MAXSAT=== Warto wspomnieć o innych NP-zupełnych wersjach problemu spełnialnosci. Na przykład, możemy zapytać o istnienie wartościowania spełniającego co najmniej zadaną liczbe } kParser nie mógł rozpoznać (błąd składni): {\displaystyle klauzul (a niekoniecznie wszystkie). Problem ten nosi nazwę MAXSAT, i jest ogólniejszy niż SAT (a zatem jest również w NPC). Jego trudność przejawia sie również w tym, że zawężenie do klauzul długości dwa w przeciwieństwie do SAT, pozostawia ten problem trudnym. {{twierdzenie|[Uzupelnij]|| Problem MAX2SAT jest NP-zupełny. }} {{dowod|[Uzupelnij]|| Konstruujemy redukcję z problemu 3SAT. Na wejściu mamy formułę } =C_1 ... C_mParser nie mógł rozpoznać (błąd składni): {\displaystyle . Każdą klauzulę } C_j=a b cParser nie mógł rozpoznać (błąd składni): {\displaystyle przekształcamy w zbiór 10 klauzul, dla wygody rozważań podzielonych na trzy grupy, następujacej postaci: # } (a)(b)(c)(z)Parser nie mógł rozpoznać (błąd składni): {\displaystyle # } ( a b)( b c)( a c)Parser nie mógł rozpoznać (błąd składni): {\displaystyle # } (a z)(b z)(c z)Parser nie mógł rozpoznać (błąd składni): {\displaystyle Tych 10 klauzul ma następujace własności: # Jeśli } a=b=c=0Parser nie mógł rozpoznać (błąd składni): {\displaystyle , to niezależnie od wartości zmiennej } zParser nie mógł rozpoznać (błąd składni): {\displaystyle co najwyżej 6 klauzul jest spełnionych. # Jeśli któryś z literałów } a,blubcParser nie mógł rozpoznać (błąd składni): {\displaystyle jest równy 1, to można dobrać wartość } zParser nie mógł rozpoznać (błąd składni): {\displaystyle tak, że 7 klauzul jest spełnionych. Można sie o tym przekonać analizując wszystkie przypadki. Na przykład, jeśli } a=1,b=c=0Parser nie mógł rozpoznać (błąd składni): {\displaystyle , to kładziemy } z=0Parser nie mógł rozpoznać (błąd składni): {\displaystyle ; jeśli } a=b=1,c=0Parser nie mógł rozpoznać (błąd składni): {\displaystyle , to również kładziemy } z=0Parser nie mógł rozpoznać (błąd składni): {\displaystyle , jeśli natomiast } a=b=c=1Parser nie mógł rozpoznać (błąd składni): {\displaystyle to 7 klauzul jest spełnionych gdy } z=1Parser nie mógł rozpoznać (błąd składni): {\displaystyle . Pozostaje zdefiniować żądaną liczbę spełnionych klauzul w formule wynikowej na } 7mParser nie mógł rozpoznać (błąd składni): {\displaystyle . Z wymienionych własności wynika, że formuła wynikowa posiada wartościowanie spełniające dokładnie } 7mParser nie mógł rozpoznać (błąd składni): {\displaystyle alternatyw wtedy i tylko wtedy gdy formuła wejściowa jest spełnialna. Maszyna Turinga realizująca redukcję potrzebuje pamieci roboczej jedynie na liczniki, zatem działa w pamięci logarytmicznej. }} ==NP-zupełne problemy grafowe== ===Pokrycie wierzchołkowe=== Pierwszym z serii problemów grafowych, dla których udowodnimy NP-zupełność, jest problem pokrycia wierzchołkowego. Dla grafu nieskierowanego } G=(V,E)Parser nie mógł rozpoznać (błąd składni): {\displaystyle mówimy, że podzbiór } V' VParser nie mógł rozpoznać (błąd składni): {\displaystyle jest pokryciem wierzchołkowym, jeśli każda krawędź w G ma co najmniej jeden z końców w zbiorze } V'Parser nie mógł rozpoznać (nieznana funkcja „\bigskip”): {\displaystyle . \bigskip \noindent {\bf Problem} NODE COVER\\ {\it Wejście:} Graf nieskierowany } G=(V,E)Parser nie mógł rozpoznać (błąd składni): {\displaystyle , liczba całkowita } k

Rozważmy jeszcze trzy podobne problemy na zbiorach. Ich NP-zupełność stanie sie oczywista gdy zauważymy że stanowią one kolejne uogólnienia problemu trójdzielnego skojarzenia.

Problem EXACT COVER BY 3-SETS (pokrycie trójelementowymi podzbiorami)
Wejście: Rodzina trójelementowych podzbiorów zbioru X takiego że |X|=3k dla pewnej calkowitej k
Wyjście: TAK jesli istnieje podrodzina taka, że każdy element zbioru X należy do dokładnie jednego zbioru rodziny Parser nie mógł rozpoznać (błąd składni): {\displaystyle \cal F"} , NIE w przeciwnym przypadku

section

Wykaż że EXACT COVER BY 3-SETS jest NP-zupełny.

Rozwiązanie

Problem SET COVERING (pokrycie zbiorami)
Wejście: Rodzina F={S1,,Sn} podzbiorów zbioru |X|, liczba całkowita kn
Wyjście: TAK, jeśli istnieje k-elementowa podrodzina rodziny F, która pokrywa cały zbiór |X|, w przeciwnym przypadku NIE.

section

Wykaż NP-zupełność problemu SET COVERING.

Rozwiązanie

Suma podzbioru i inne problemy liczbowe

Teraz zajmiemy się kilkoma problemami związanymi z liczbami. Najwięcej trudu będzie kosztować udowodnienie NP-zupełności pierwszego z nich -- następne pójdą już łatwiej. Ta pierwsza trudność zasadza się na tym, że jak do tej pory dowodziliśmy NP-zupełność tylko dla problemów, w których tak naprawdę nie ma liczb, jako elementów struktury kombinatorycznej. Oczywiście, każde słowo wejściowe może byc traktowane jako liczba, kod maszyny Turinga tez jest liczbą. Tutaj jednak chodzi o naturalne sformułowanie problemu, w odniesieniu do obiektów abstrakcyjnych takich jak liczby, funkcje, relacje, grafy itd. Problematyka trudności obliczeniowej problemów z liczbami jest rozwinięta w następnej lekcji.

Problem SUBSET SUM (suma podzbioru)
Wejście: Skończony zbiór A elementów, dla każdego elementu aA waga s(a)Z+ oraz liczba BZ+.
Wyjście: TAK jeśli istnieje podzbiór AA taki że aAs(a)=B, NIE w przeciwnym przypadku.

Twierdzenie [Uzupelnij]

Problem SUBSET SUM jest NP-zupełny.

Dowód [Uzupelnij]

Skonstruujemy redukcję z problemu EXACT COVER BY 3 SETS. Na wejściu mamy zatem zbiór X o liczności 3m i rodzinę F={U1,,Un} jego podzbiorów. Naszym zadaniem jest skonstruować zbiór Y elementów z pewnymi wagami oraz liczbę B taką, że istnienie podzbioru w Y o sumie wag elementów równej B "wymusza" istnienie pokrycia zbioru X wybranymi rozłącznymi podzbiorami z rodziny F.

Niech p=log2(n+1). Najpierw ustalamy porządek elementów w zbiorze |X| i zapisujemy każdy zbiór Uj jako wektor 3m-bitowy (czyli jest to struktura danych -- wektor bitowy -- reprezentująca podzbiór danego zbioru). W każdym wektorze są oczywiście 3 bity równe 1 a pozostałe są zerowe. Następnie przed każdym bitem wstawiamy dodatkowo p1 bitów zerowych i traktujemy ten wektor kjako liczbe zapisaną binarnie. Powstaje w ten sposób n liczb 3mp-bitowych -- są to wagi elementów zbioru Y. Liczba B jest również takiej długości, powstaje przez wypisanie 3m jedynek a następnie wstawienie przed każdą jedynką p1 zer.

Jeśli istnieje podrodzina FF stanowiąca rozłączne pokrycie zbioru X, to wektory bitowe poszczególnych trójek z F arytmetycznie sumują sie do B, a na żadnej pozycji nie występuje przeniesienie. Zatem z istnienia pokrycia wynika istnienie podzbioru dającego w sumie wagę B.

Bloki zer dodane przed każdym bitem reprezentacji wektorowej podzbioru gwarantują, że sumując dowolny podzbiór wygenerowanych liczb nie napotkamy na przeniesienie poza taki blok zer. A zatem, jeśli istnieje podzbiór liczb dający w sumie B, to wszystkie te liczby w swoich rozwinięciach binarnych zawierają w sumie tyle jedynek ile jest ich w B, na różnych pozycjach. A więc odpowiadajace tym liczbom podzbiory pokrywają cały zbiór X.

Zatem opisane przekształcenie jest redukcją. Jak w poprzednich dowodach, potrzebna jest pamięć robocza jedynie na stałą liczbę liczników. A więc jest to redukcja logarytmiczna.

W tej części lekcji wykażemy NP-zupełność dwóch podobnych problemów liczbowych.

Problem PARTITION (podział)
Wejście: Skończony zbiór A elementów oraz dodatnia całkowita waga s(a) każdego elementu
Wyjście: TAK jeśli istnieje podzbiór AA taki że aAs(a)=aAAs(a), NIE w przeciwnym przypadku.

section

Wykaż NP-zupełność problemu podziału.

Wskazówka
Rozwiązanie

Problem KNAPSACK (plecak)
Wejście: Skończony zbiór A elementów, rozmiar s(a)Z+ i wartość v(a)Z+ dla każdego elementu, ograniczenie pojemności BZ+ oraz żądana wartość KZ+
Wyjście: TAK jeśli istnieje podzbiór AA taki że aAs(a)B oraz aAv(a)K, NIE w przeciwnym przypadku.

section

Pokaż że KNAPSACK jest NP-zupełny.

Wskazówka
Rozwiązanie

Podsumowanie technik dowodów NP-zupełności

Najprostsze redukcje otrzymujemy metodą zacieśnienia. Przez narzucenie dodatkowych zależności w instancjach problemu, o którym dowodzimy NP-zupełności, otrzymujemy instancje znanego problemu NP-zupełnego. W ten sposób wykazujemy, że nasz problem jest uogólnieniem problemu znanego, a więc jest niełatwiejszy. Przykłady takich redukcji zastosowaliśmy do problemów: EXACT COVER BY 3SETS, SET COVERING, KNAPSACK.

Pozostałe dowody można by zaliczyć do metody gadżetów. Fragmenty instancji problemu wejściowego przekształca się we fragmenty instancji probelmu wynikowego (gadżety), i wiąże się zależnościami (innymi gadżetami), których zachodzenie w problemie wynikowym ma mieć ścisłe odzwierciedlenie w spełnieniu wymagań problemu źródłowego. Czasem gadżet jest trywialny (np. w redukcji SUBSET SUM do PARTITION jest to ta sama waga elementu), kiedy indziej dość naturalny i nietrudny (SAT DO 3SAT), czasem bardzo pomysłowy (VERTEX COVER do HAMILTONIAN CYCLE, 3SAT do TRIPARTITE MATCHING, 3SAT do MAX2SAT).

Ćwiczenia końcowe

ż, że następujący problem izomorfizmu podgrafu jest NP-zupełny:

Problem SUBGRAPH ISOMORPHISM
Wejście: G1=(V1,E1), G2=(V2,E2) - grafy nieskierowane
Wyjście: TAK jeśli G1 ma podgraf izomorficzny z G2, NIE w przeciwnym przypadku.

Wskazówka
Rozwiązanie

tym ćwiczeniu pytamy o trudność obliczeniową problemu pochodzącego z teorii szergowania. Wykaż, że NP-zupełny jest następujący problem:

Problem SEQUENCING WITHIN INTERVALS
Wejście: Zbiór zadań T, dla każdego zadania t trzy liczby całkowite: długość zadania l(t)>0, moment pojawienia się r(t)0,oraz ograniczenie czasowe d(t)>0
Wyjście: TAK, jeśli wszystkie zadania można wykonać na jednym procesorze, bez przerywania, spełniając ograniczenia czasowe, NIE w przeciwnym przypadku. Formalnie, pytamy o funkcję alokacji A przydzielająca każdemu zadaniu t czas rozpoczęcia wykonywania A(t) taki, że [A(t),A(t)+l(t)][r(t),d(t)] oraz [A(t),A(t)+l(t))[A(t),A(t)+l(t))=, dla każdego zadania tt.

Wskazówka
Rozwiązanie

section

Problem cięcia w grafie zdefiniowany jest następująco:

Problem FEEDBACK VERTEX SET
Wejście: Graf skierowany G=(V,E), liczba całkowita k,0<k|V|.
Wyjście: TAK jeśli istnieje w G podzbiór k-wierzchołkowy, taki że graf pozostały po usunięciu tego podzbioru jest acykliczny.
Udowodnij, że FEEDBACK VERTEX SET jest NP-zupełny.

Wskazówka
Rozwiązanie

section

Kolorowanie (wierzchołkowe) grafu jest klasycznym problemem optymalizacyjnym w teorii grafów. Przypomnijmy, że chodzi o przypisanie wierzchołkom grafu nieskierowanego kolorów tak, aby końce każdej krawędzi miały różne kolory, a liczba kolorów była możliwie najmniejsza.

Okazuje sie że nawet jeśli ustalimy żądaną liczbe kolorów na 3, to problem jest NP-zupełny. Dowód tego faktu nie jest natychmiastowy.

Problem 3COLORING
Wejście: Graf nieskierowany G=(V,E).
Wyjście: TAK, jeśli istnieje funkcja c:V{0,1,2} taka, że dla każdej krawędzi (u,v)E, c(u)c(v).
Za pomocą redukcji z problemu 3SAT udowodnij, że problem trójkolorowania jest NP-zupełny.

Wskazówka
Rozwiązanie