Algorytmy i struktury danych/NP-zupełność: Różnice pomiędzy wersjami
mNie podano opisu zmian |
Nie podano opisu zmian |
||
Linia 17: | Linia 17: | ||
algorytm rozwiązujący nasze zadanie: | algorytm rozwiązujący nasze zadanie: | ||
Dla każdej zmiennej <math>x</math> z <math>\phi</math> sprawdź, czy w <math>\phi</math> występują jednocześnie <math>x</math> i <math>\neg x</math>. | 1 Dla każdej zmiennej <math>x</math> z <math>\phi</math> sprawdź, czy w <math>\phi</math> występują jednocześnie <math>x</math> i <math>\neg x</math>. | ||
Jeśli taka zmienna nie istnieje, to <math>\phi</math> jest spełnialna, w | 2 Jeśli taka zmienna nie istnieje, to <math>\phi</math> jest spełnialna, w | ||
przeciwnym razie <math>\phi</math> nie jest spełnialna. | 3 przeciwnym razie <math>\phi</math> nie jest spełnialna. | ||
Sprawny programista bardzo szybo zaprogramuje powyższy algorytm. Musimy tylko sprecyzować, co oznacza sformułowanie '' | Sprawny programista bardzo szybo zaprogramuje powyższy algorytm. Musimy tylko sprecyzować, co oznacza sformułowanie ''dana jest formuła boolowska.'' Innymi słowy musimy podać ''rozsądny'' sposób kodowania formuł. Jednym z możliwych może | ||
być następujący sposób kodowania: Przyjmujemy, że zmienne występujące w formule są ponumerowane kolejno 1,2,<math>\ldots</math> Formułę kodujemy jako ciąg liczb | być następujący sposób kodowania: Przyjmujemy, że zmienne występujące w formule są ponumerowane kolejno 1,2,<math>\ldots</math> Formułę kodujemy jako ciąg liczb poddzielonych średnikami. Pierwszą liczbą w ciągu jest liczba <math>n</math> | ||
równa liczbie ''literałów'', czyli wystąpień w formule zmiennych lub ich negacji. W formule z przykładu mamy cztery literały. Po | równa liczbie ''literałów'', czyli wystąpień w formule zmiennych lub ich negacji. W formule z przykładu mamy cztery literały. Po liczbie literałów występuje <math>n</math> liczb ze zbioru <math>\{-n,-(n-1),\ldots,-1,1,2,\ldots, n\}</math>. | ||
Jeśli <math>i</math>-tym literałem jest zmienna <math>x_k</math>, to za <math>i</math>-tą spośród tych | Jeśli <math>i</math>-tym literałem jest zmienna <math>x_k</math>, to za <math>i</math>-tą spośród tych | ||
liczb bierzemy <math>k</math>, jeśli zaś <math>i</math>-tym literałem jest <math>\neg x_k</math>, to | liczb bierzemy <math>k</math>, jeśli zaś <math>i</math>-tym literałem jest <math>\neg x_k</math>, to | ||
Linia 89: | Linia 89: | ||
długości formuły. Mając takie wartościowanie, w czasie wielomianowym | długości formuły. Mając takie wartościowanie, w czasie wielomianowym | ||
można obliczyć odpowiadającą mu wartość logiczną formuły. Jeśli tą | można obliczyć odpowiadającą mu wartość logiczną formuły. Jeśli tą | ||
wartością jest 1 (Prawda), to formuła jest spełnialna. | wartością jest 1 ('''Prawda'''), to formuła jest spełnialna. | ||
Wartościowanie, dla którego formuła jest spełnialna nazywamy ''świadectwem'' spełnialności. Algorytm, który sprawdza spełnialność | Wartościowanie, dla którego formuła jest spełnialna nazywamy ''świadectwem'' spełnialności. Algorytm, który sprawdza spełnialność | ||
formuły dla danego wartościowania nazywamy ''algorytmem weryfikacji''. | formuły dla danego wartościowania nazywamy ''algorytmem weryfikacji''. | ||
Linia 97: | Linia 97: | ||
''Klasą NP'' nazywamy zbiór tych zadań algorytmicznych, które | ''Klasą NP'' nazywamy zbiór tych zadań algorytmicznych, które | ||
można weryfikować w czasie wielomianowym. Skróty P i NP. pochodzą z angielskiego, odpowiednio, ''polynomial time'' i ''nondeterministic polynomial time''. Niedeterminizm dotyczy pochodzenia świadectwa, ponieważ nie żąda się podania metody jego konstrukcji. | można weryfikować w czasie wielomianowym. Skróty ''P'' i ''NP''. pochodzą z angielskiego, odpowiednio, ''polynomial time'' i ''nondeterministic polynomial time''. Niedeterminizm dotyczy pochodzenia świadectwa, ponieważ nie żąda się podania metody jego konstrukcji. | ||
Łatwo zauważyć, że każde zadanie z P należy do | Łatwo zauważyć, że każde zadanie z ''P'' należy do | ||
NP, ponieważ zadanie takie można zawsze rozwiązać w czasie | ''NP'', ponieważ zadanie takie można zawsze rozwiązać w czasie | ||
wielomianowym i do weryfikacji nie potrzebujemy żadnego świadectwa. Zatem | wielomianowym i do weryfikacji nie potrzebujemy żadnego świadectwa. Zatem <math>P \subseteq NP</math>, a ''problem P=NP'', to | ||
problem | problem | ||
Czy | Czy <math>P \ne NP</math>? | ||
Do klasy NP należą tysiące ważnych, praktycznych zadań | Do klasy ''NP'' należą tysiące ważnych, praktycznych zadań | ||
algorytmicznych, o których nie wiadomo, czy należą do P. | algorytmicznych, o których nie wiadomo, czy należą do P. | ||
Przyjrzyjmy się jeszcze jednemu takiemu zadaniu. | Przyjrzyjmy się jeszcze jednemu takiemu zadaniu. | ||
Linia 116: | Linia 116: | ||
wierzchołków jest połączona krawędzią? | wierzchołków jest połączona krawędzią? | ||
Problem kliki z pewnością należy do NP. Dla danego | Problem kliki z pewnością należy do ''NP''. Dla danego | ||
<math>k</math>-elementowego podzbioru wierzchołków (świadectwa) można łatwo w | <math>k</math>-elementowego podzbioru wierzchołków (świadectwa) można łatwo w | ||
czasie wielomianowym, zależnym tylko od rozmiaru grafu, sprawdzić, czy | czasie wielomianowym, zależnym tylko od rozmiaru grafu, sprawdzić, czy | ||
Linia 132: | Linia 132: | ||
* <math>\phi_1 =</math> dla każdego <math>i</math>, <math>1\leq i \leq k</math>, istnieje co najmniej jeden wierzchołek <math>u \in V</math>, który jest <math>i</math>-tym wierzchołkiem w klice. | * <math>\phi_1 =</math> dla każdego <math>i</math>, <math>1\leq i \leq k</math>, istnieje co najmniej jeden wierzchołek <math>u \in V</math>, który jest <math>i</math>-tym wierzchołkiem w klice. | ||
** <math>\phi_1 = \bigwedge_{i = 1}^k(\bigvee_{v\in V} x_i^v).</math> | ** <math>\phi_1 = \bigwedge_{i = 1}^k(\bigvee_{v\in V} x_i^v).</math> | ||
* <math>\phi_2 =</math> dla każdego <math>i</math>, <math>1\leq i \leq k</math>, żadne dwa wierzchołki nie są jednocześnie <math>i</math>-tymi wierzchołkami w klice. | * <math>\phi_2 =</math> dla każdego <math>i</math>, <math>1\leq i \leq k</math>, żadne dwa wierzchołki nie są jednocześnie <math>i</math>-tymi wierzchołkami w klice. | ||
** <math> \phi_2 = \bigwedge_{i=1}^k\bigwedge_{u,v\in V, u\ne v} (\neg x_i^u \vee \neg x_i^v).</math> | |||
** <math> \phi_2 = \bigwedge_{i=1}^k\bigwedge_{u,v\in V, u\ne v} | |||
(\neg x_i^u \vee \neg x_i^v).</math> | |||
* Dla każdej pary <math>u, v</math>, jeśli <math>u</math>-<math>v</math> nie jest krawędzią w grafie, to <math>u</math> i <math>v</math> nie są jednocześnie w klice. | * Dla każdej pary <math>u, v</math>, jeśli <math>u</math>-<math>v</math> nie jest krawędzią w grafie, to <math>u</math> i <math>v</math> nie są jednocześnie w klice. | ||
** <math>\phi_3 = \bigwedge_{u\mbox{--}v\not \in E} \bigwedge_{1\leq i,j \leq k} (\neg x_i^u \vee \neg x_j^v).</math> | |||
** <math>\phi_3 = \bigwedge_{u\mbox{--}v\not \in E} \bigwedge_{1\leq i,j \leq k} | |||
(\neg x_i^u \vee \neg x_j^v).</math> | |||
Pozostawiamy czytelnikowi wykazanie, że formuła <math>\phi</math> jest spełnialna | Pozostawiamy czytelnikowi wykazanie, że formuła <math>\phi</math> jest spełnialna | ||
Linia 151: | Linia 144: | ||
wielomianowym. W tym przypadku mówimy, że zadanie kliki jest | wielomianowym. W tym przypadku mówimy, że zadanie kliki jest | ||
''redukowalne w czasie wielomianowym'' do zadania spełnialności. W 1971 roku | ''redukowalne w czasie wielomianowym'' do zadania spełnialności. W 1971 roku | ||
R. Cook udowodnił, że każde zadanie z NP można w czasie | R. Cook udowodnił, że każde zadanie z ''NP'' można w czasie | ||
wielomianowym zredukować do zadania spełnialności pewnej formuły | wielomianowym zredukować do zadania spełnialności pewnej formuły | ||
boolowskiej. Zadanie, które należy do klasy NP i do którego można zredukować w czasie wielomianowym każde inne zadanie z NP nazywamy zadaniem | boolowskiej. Zadanie, które należy do klasy ''NP'' i do którego można zredukować w czasie wielomianowym każde inne zadanie z ''NP'' nazywamy zadaniem ''NP-zupełnym''. W tym sensie zadanie spełnialności jest ''NP-zupełne''. | ||
Pozostawiamy czytelnikom pokazanie, że zadanie kliki jest też | Pozostawiamy czytelnikom pokazanie, że zadanie kliki jest też | ||
NP-zupełne. W tym celu wystarczy pokazać wielomianową redukcję zadania | ''NP-zupełne''. W tym celu wystarczy pokazać wielomianową redukcję zadania | ||
spełnialności do zadania kliki. Rozwiązanie dowolnego zadania | spełnialności do zadania kliki. Rozwiązanie dowolnego zadania | ||
NP-zupełnego w czasie wielomianowym pozwalałoby rozwiązywać w czasie | ''NP-zupełnego'' w czasie wielomianowym pozwalałoby rozwiązywać w czasie | ||
wielomianowym każde zadanie z NP. | wielomianowym każde zadanie z NP. | ||
Wersja z 14:40, 27 wrz 2006
Ten wykład poświęcimy klasie bardzo użytecznych problemów, dla których nieznane są algorytmy wielomianowe i nie wiadomo, czy takie algorytmy w ogóle istnieją. Rozpoczniemy od podania algorytmu rozwiązującego następujące zadanie:
Dane: Formuła boolowska w postaci koniunkcji zmiennych lub ich negacji.
Pytanie: Czy formuła jest spełnialna, tzn. czy istnieje takie wartościowanie zmiennych, dla którego formuła przyjmuje wartość 1 (Prawda)?
Przykład: Formuła przyjmuje wartość 1 tylko dla wartościowania .
Łatwo zauważyć, że formuła (w postaci z powyższego zadania) jest spełnialna wtedy i tylko wtedy, gdy nie występują w niej jednocześnie zmienna i jej negacja. Ta obserwacja pozwala sformułować bardzo prosty algorytm rozwiązujący nasze zadanie:
1 Dla każdej zmiennej z sprawdź, czy w występują jednocześnie i . 2 Jeśli taka zmienna nie istnieje, to jest spełnialna, w 3 przeciwnym razie nie jest spełnialna.
Sprawny programista bardzo szybo zaprogramuje powyższy algorytm. Musimy tylko sprecyzować, co oznacza sformułowanie dana jest formuła boolowska. Innymi słowy musimy podać rozsądny sposób kodowania formuł. Jednym z możliwych może być następujący sposób kodowania: Przyjmujemy, że zmienne występujące w formule są ponumerowane kolejno 1,2, Formułę kodujemy jako ciąg liczb poddzielonych średnikami. Pierwszą liczbą w ciągu jest liczba równa liczbie literałów, czyli wystąpień w formule zmiennych lub ich negacji. W formule z przykładu mamy cztery literały. Po liczbie literałów występuje liczb ze zbioru . Jeśli -tym literałem jest zmienna , to za -tą spośród tych liczb bierzemy , jeśli zaś -tym literałem jest , to -tą liczbą będzie .
Kodem przykładowej formuły jest
W każdym rozsądnym kodowaniu przyjmuje się ponadto, że do kodowania liczb stosujemy dowolny zapis o podstawie co najmniej 2 (najczęściej właśnie o podstawie 2). Zauważmy, że przy takim kodowaniu długość kodu formuły wynosi co najwyżej , dla pewnej stałej . Długość kodu danych będziemy nazywali rozmiarem zadania. W przedstawionym powyżej algorytmie literały są porównywane między sobą. Nawet przy bardzo naiwnej implementacji tego algorytmu liczba takich porównań wyniesie co najwyżej . Jeśli uwzględnimy, że porównywanie kodów dwóch literałów wymaga porównań bitów, to liczbę wszystkich operacji da się ograniczyć przez , a idąc dalej możemy powiedzieć, że liczbę operacji wykonywanych przez algorytm da się ograniczyć przez , gdzie jest rozmiarem danych, a stałą całkowitą większą od 0. (W naszym przypadku za można wziąć 3.) W takim przypadku mówimy, że algorytm rozwiązuje zadanie w czasie wielomianowym.
Klasą P nazywamy zbiór tych zadań algorytmicznych, dla których istnieją algorytmy rozwiązujące je w czasie wielomianowym.
Utrudnijmy teraz nasze wyjściowe zadanie.
Powiemy, że formuła boolowska jest w postaci koniunkcyjno-normalnej (z ang. w postaci CNF), jeśli jest koniunkcją formuł (klauzul), z których każda jest alternatywą zmiennych lub ich negacji, być może zdegenerowaną do jednego literału. Formuła jest w postaci -CNF, jeśli w każdej klauzuli występuje co najwyżej literałów.
Ćwiczenie 1
Pokaż, że każdą formułę boolowską można przekształcić do równoważnej (ze względu na spełnialność) formuły w postaci 3-CNF o długości tylko wielomianowo większej od długości formuły wyjściowej.
Oto przykład formuły w postaci 2-CNF: .}
Pokazaliśmy, że zadanie spełnialności formuł w postaci 1-CNF można rozwiązać w czasie wielomianowym. To stwierdzenie pozostaje w mocy także dla formuł w postaci 2-CNF.
Ćwiczenie 2
Zaprojektuj algorytm, który rozwiązuje to zadanie w czasie liniowym, tj. w czasie proporcjonalnym do długości formuły.
Sytuacja zmienia się diametralnie, gdy weźmiemy . Nie są znane algorytmy, które rozwiązywałyby to zadanie w czasie wielomianowym, nawet dla wielomianów bardzo dużego stopnia, np. 1000. Najlepsze znane algorytmy wymagają czasu co najmniej , gdzie jest stałą większą od 1, a jest długością kodu formuły. O takich algorytmach mówimy, że działają w czasie wykładniczym. Z praktycznego punktu widzenia oznacza to, że nawet na współczesnych komputerach takie algorytmy mają szanse dać wynik w rozsądnym czasie tylko dla danych o bardzo małych rozmiarach. Można zaryzykować stwierdzenie, że jeżeli dla zadania algorytmicznego znamy tylko rozwiązania działające w czasie wykładniczym, to zadanie to jest praktycznie algorytmicznie nierozwiązywalne.
Jaką interesującą własność ma jeszcze zadanie spełnialności formuł boolowskich? Gdyby ktoś chciał przekonać nas, że dana formuła jest spełnialna wystarczy, żeby podał odpowiednie wartościowanie zmiennych. Zauważmy, że rozmiar takiego wartościowania nie jest większy od długości formuły. Mając takie wartościowanie, w czasie wielomianowym można obliczyć odpowiadającą mu wartość logiczną formuły. Jeśli tą wartością jest 1 (Prawda), to formuła jest spełnialna. Wartościowanie, dla którego formuła jest spełnialna nazywamy świadectwem spełnialności. Algorytm, który sprawdza spełnialność formuły dla danego wartościowania nazywamy algorytmem weryfikacji. Innymi słowy, algorytmu weryfikacji można użyć do wykazania w czasie wielomianowym, że dana formuła jest spełnialna, jeżeli tylko istnieje i dane jest odpowiednie świadectwo.
Klasą NP nazywamy zbiór tych zadań algorytmicznych, które można weryfikować w czasie wielomianowym. Skróty P i NP. pochodzą z angielskiego, odpowiednio, polynomial time i nondeterministic polynomial time. Niedeterminizm dotyczy pochodzenia świadectwa, ponieważ nie żąda się podania metody jego konstrukcji.
Łatwo zauważyć, że każde zadanie z P należy do NP, ponieważ zadanie takie można zawsze rozwiązać w czasie wielomianowym i do weryfikacji nie potrzebujemy żadnego świadectwa. Zatem , a problem P=NP, to problem
Czy ?
Do klasy NP należą tysiące ważnych, praktycznych zadań algorytmicznych, o których nie wiadomo, czy należą do P. Przyjrzyjmy się jeszcze jednemu takiemu zadaniu.
Dane: Nieskierowany graf oraz liczba naturalna .
Pytanie: Czy w istnieje klika rozmiaru , tzn. czy w istnieje podgraf -wierzchołkowy, w którym każda para różnych wierzchołków jest połączona krawędzią?
Problem kliki z pewnością należy do NP. Dla danego -elementowego podzbioru wierzchołków (świadectwa) można łatwo w czasie wielomianowym, zależnym tylko od rozmiaru grafu, sprawdzić, czy wierzchołki te tworzą klikę. Pokażemy teraz, że gdybyśmy w czasie wielomianowym potrafili rozwiązać zadania spełnialności, to także w czasie wielomianowym można by rozwiązać zadanie kliki. W tym celu zadanie kliki sprowadzimy do zadania formuł boolowskich.
Dla każdego wierzchołka , wprowadzamy zmiennych boolowskich , ,, . Zmienna intuicyjnie mówi, że wierzchołek jest -tym wierzchołkiem w poszukiwanej klice. Skonstruujemy formułę , która jest koniunkcją trzech formuł i . Oto intuicyjne znaczenie i formalne definicje tych formuł:
- dla każdego , , istnieje co najmniej jeden wierzchołek , który jest -tym wierzchołkiem w klice.
- dla każdego , , żadne dwa wierzchołki nie są jednocześnie -tymi wierzchołkami w klice.
- Dla każdej pary , jeśli - nie jest krawędzią w grafie, to i nie są jednocześnie w klice.
Pozostawiamy czytelnikowi wykazanie, że formuła jest spełnialna wtedy i tylko wtedy, gdy w grafie istnieje klika rozmiaru . Łatwo zauważyć, że rozmiar powstałej formuły jest wielomianowo zależny od rozmiaru grafu, a samą formułę można skonstruować w czasie wielomianowym. W tym przypadku mówimy, że zadanie kliki jest redukowalne w czasie wielomianowym do zadania spełnialności. W 1971 roku R. Cook udowodnił, że każde zadanie z NP można w czasie wielomianowym zredukować do zadania spełnialności pewnej formuły boolowskiej. Zadanie, które należy do klasy NP i do którego można zredukować w czasie wielomianowym każde inne zadanie z NP nazywamy zadaniem NP-zupełnym. W tym sensie zadanie spełnialności jest NP-zupełne. Pozostawiamy czytelnikom pokazanie, że zadanie kliki jest też NP-zupełne. W tym celu wystarczy pokazać wielomianową redukcję zadania spełnialności do zadania kliki. Rozwiązanie dowolnego zadania NP-zupełnego w czasie wielomianowym pozwalałoby rozwiązywać w czasie wielomianowym każde zadanie z NP.
Pojęcie klasy P wprowadzili niezależnie Cobham i Edmonds w połowie lat sześćdziesiątych. Edmonds wprowadził też pojęcie klasy NP i jako pierwszy sformułował pytanie, czy P NP. Metoda redukcji pochodzi od Karpa, który przy jej pomocy pokazał, że wiele ważnych zadań kombinatorycznych jest NP-zupełnych.