{{TOC float}}

{{Sources| Tohle je poněkud obšírnější výcuc ke <Státnice> ze <Státnice_-Informatika-Složitost%28obory_Matematická_lingvistika_a_Softwarové_systémy%29> pro obory <Státnice_-Informatika-_I3:Matematická_lingvistika> a <Státnice-Informatika-_I2:_Softwarové_systémy>, pocházející ze zápisků z předmětu Složitost I -- User:Tuetschek 22:44, 16 Aug 2010 (CEST)

}}

Třídy P a NP, polynomiální převody, NP-úplnost

Definice (Úloha)

  • Úloha je situace, kdy pro daný vstup (instanci úlohy) chceme získat výstup se zadanými vlastnostmi.

  • Optimalizační úloha je úloha, kde cílem je získat optimální (zpravidla největší nebo nejmenší) výstup s danými vlastnostmi.

  • Rozhodovací problém je úloha, jejímž výstupem je ANO/NE.

Definice (Kódování vstupů)

Každá instance problému Q ⁣ Q\,\! je kódována jako posloupnost 0 a 1, tj. instance je <u>slovo v abecedě</u> {0,1} ⁣ \{0,1\}^{*}\,\!. Kódy všech instancí problému Q ⁣ Q\,\! tvoří <u>jazyk</u> L(Q) ⁣ L(Q)\,\! nad abecedou {0,1} ⁣ \{0,1\}^{*}\,\!, který se dělí na

  • L(Q)Y ⁣ L(Q)_Y\,\! -- kódy instancí s odpovědí ANO (jazyk kladných instancí)

  • L(Q)N ⁣ L(Q)_N\,\! -- kódy instancí s odpovědí NE (jazyk záporných instancí)

Rozhodovací problém pak je rozhodnutí, zda xL(Q)Y ⁣ x\in L(Q)_Y\,\! nebo xL(Q)N ⁣ x\in L(Q)_N\,\! (kde x ⁣ x\,\! je kód nějaké instance Q ⁣ Q\,\!), když předpokládáme, že rozhodnutí xL(Q) ⁣ x\in L(Q)\,\! lze udělat v polynomiálním čase vzhledem k x ⁣ |x|\,\!.

Definice (Deterministický Turingův stroj)

DTS obsahuje řídící jednotku, čtecí a zápisovou hlavu a (nekonečnou) pásku. Program sestává z:

  1. Konečné množiny Γ ⁣ \Gamma\,\! páskových symbolů, ΣΓ ⁣ \Sigma \subset \Gamma\,\! vstupních symbolů a Γ ⁣ *\in\Gamma\,\! prázdného symbolu

  2. Konečné množiny Q ⁣ Q\,\! stavů řídící jednotky, která obsahuje startovní stav q0 ⁣ q_0\,\! a 2 terminální stavy qY ⁣ q_Y\,\!, qN ⁣ q_N\,\!

  3. Přechodové funkce δ:(Q\{qY,qN})×ΓQ×Γ×{,,} ⁣ \delta:(Q\backslash\{q_Y,q_N\})\times\Gamma\to Q\times\Gamma\times\{\leftarrow,\bullet, \rightarrow \}\,\!

DTS s programem M ⁣ M\,\! přijímá xΣ ⁣ x\in\Sigma^{*}\,\!, právě když pro vstup x ⁣ x\,\! se M ⁣ M\,\! zastaví ve stavu qY ⁣ q_Y\,\!. Jazyk rozpoznávaný programem M je

ParseError: KaTeX parse error: Undefined control sequence: \mbox at position 26: …in\Sigma^{*}|M \̲m̲b̲o̲x̲{ prijima } x\}…

.

DTS s programem M ⁣ M\,\! řeší problém Q ⁣ Q\,\!, právě když výpočet M ⁣ M\,\! skončí pro každý vstup xΣ ⁣ x\in\Sigma^{*}\,\! a platí L(M)=L(Q)Y ⁣ L(M)=L(Q)_Y\,\!.

Nechť M ⁣ M\,\! je program pro DTS, který skončí pro xΣ ⁣ \forall x\in\Sigma^{*}\,\!. Časová složitost programu M ⁣ M\,\! je dána funkcí TM(n)=max{mxΣ,x=n, T_M(n)=\max\{m|\exists x\in\Sigma^{*},|x|=n, výpočet na DTS s programem M ⁣M\,\! a vstupem x ⁣x\,\! skončí po m  m\,\; krocích stroje} ⁣\}\,\!. Pokud existuje polynom p ⁣ p\,\! tak, že TM(n)p(n)n ⁣ T_M(n)\leq p(n) \forall n\,\!, pak M ⁣ M\,\! je polynomiální DTS program.

Definice (Třída P)

Problém Q ⁣ Q\,\! je ve třídě P, právě když existuje polynomiální DTS program M ⁣ M\,\!, který řeší Q ⁣ Q\,\!.

Definice (Nedeterministický Turingův stroj)

Stejný jako DTS, ale místo přechodové funkce δ ⁣ \delta\,\! je zde zobrazení δ ⁣ \delta\,\!, které každé dvojici z Q×Γ ⁣ Q\times\Gamma\,\! přiřazuje <u>množinu</u> možných pokračování výpočtu, tj. trojic z Q×Γ×{,,} ⁣ Q\times\Gamma\times\{\leftarrow,\bullet, \rightarrow \}\,\!.

NTS s programem M ⁣ M\,\! přijímá xΣ ⁣ x\in\Sigma^{*}\,\!, právě když existuje přijímající výpočet programu M ⁣ M\,\! (tj. běh M ⁣ M\,\!, kdy na vstupu je x ⁣ x\,\! a končí se ve stavu qY ⁣ q_Y\,\!). Jazyk rozpoznávaný programem M je

ParseError: KaTeX parse error: Undefined control sequence: \mbox at position 26: …in\Sigma^{*}|M \̲m̲b̲o̲x̲{ prijima } x\}…

.

Čas, ve kterém M ⁣ M\,\! přijímá xΣ ⁣ x\in\Sigma^{*}\,\! definujeme jako počet kroků nejkratšího přijímajícího výpočtu nad daty x ⁣ x\,\!.

Časová složitost programu je dána funkcí:

:

ParseError: KaTeX parse error: Undefined control sequence: \mbox at position 23: …\begin{cases}1 \̲m̲b̲o̲x̲{ neexistuje }x…

Pokud existuje polynom p ⁣ p\,\! takový, že TM(n)p(n) ⁣ T_M(n)\leq p(n)\,\!, pak M ⁣ M\,\! je polynomiální NTS program.

Definice (Třída NP)

Problém Q ⁣ Q\,\! je ve třídě NP, právě když existuje polynomiální NTS program M ⁣ M\,\!, který řeší Q ⁣ Q\,\!. Na rozdíl od deterministického případu netrváme na tom, že výpočet musí skončit i pro nepřijímané instance.

Poznámka (Jiný model NTS)

Přidáme další pásku (orákulum) a stroj pracuje ve 2 fázích:

  1. Nedeterministicky hádá -- zapíše problém do orákula.

  2. Deterministicky ověřuje obsah orákula -- práce DTS na původním vstupu plus obsahu orákula.

Je to ekvivalentní s původním -- omezíme-li počet možných přechodů NTS na 2 (tím ho jen zpomalíme) a zapisujeme-li do orákula větve pokračování výpočtu (pak stačí na jednu jeden bit), převedeme veškerý nedeterminismus čistě na naplnění orákula.

Definice (Třída co-NP)

Problém Q ⁣ Q\,\! je ve třídě co-NP, právě když existuje polynomiální NTS program M ⁣ M\,\! takový, že L(M)=L(Q)N ⁣ L(M) = L(Q)_N\,\!. O poměru množin co-NP a NP nevíme nic, jen to, že podmnožinou jejich průniku je P.

Převody a NP-úplnost

Definice (Polynomiálně vyčíslitelná funkce)

Funkce f:{0,1}{0,1} ⁣ f:\{0,1\}^{*}\to\{0,1\}^{*}\,\! je polynomiálně vyčíslitelná, právě když existuje polynom p ⁣ p\,\! a algoritmus A ⁣ A\,\! takový, že pro každý vstup x{0,1} ⁣x\in \{0,1\}^{*}\,\! dává výstup f(x) ⁣ f(x)\,\! v čase nejvýše p(x) ⁣ p(|x|)\,\!.

Definice (Polynomiální převoditelnost)

Jazyk L1 ⁣ L_1\,\! je polynomiálně převoditelný na jazyk L2 ⁣ L_2\,\! (píšeme L1L2 ⁣ L_1\propto L_2\,\!), právě když existuje polynomiálně vyčíslitelná funkce f ⁣ f\,\! taková, že

:x{0,1}:xL1f(x)L2 ⁣\forall x\in\{0,1\}^{*}:x\in L_1\equiv f(x)\in L_2\,\!

Definice (NP-těžký, NP-úplný problém)

  • Problém Q ⁣ Q\,\! je NP-těžký, právě když QNP:L(Q)YL(Q)Y ⁣ \forall Q'\in\mathrm{NP}:L(Q')_Y\propto L(Q)_Y\,\!.

  • Problém Q ⁣ Q\,\! je NP-úplný, právě když je Q ⁣ Q\,\! NP-těžký a QNP ⁣ Q\in\mathrm{NP}\,\!.

Je-li nějaký NP-těžký problém převoditelný na jiný, pak ten musí být také NP-těžký.

Příklady NP-úplných problémů a převody mezi nimi

{{Sources|Upraveno podle vypracovaných otázek V. Bedecse, původně zřejmě ze slajdů <Ondřej%20Čepek> k <Složitost%20I> . -- User:Tuetschek 10:28, 31 Aug 2010 (CEST)}}

Cook-Levinova věta

Existuje NP-úplný problém.

Důkaz pro KACHL

{{TODO|Dopsat zkráceně, <KACHL> je detailní.}}

Máme množinu barev BB, čtvercová síť SS s obvodem obarveným barvami z BB a množinu KK typů kachlíků, kde je každý typ definován svou horní, dolní, levou a pravou barvou.

Lze síť SS vykachlíkovat pomocí kachlíků z množiny KK (stejný typ lze použít libovolněkrát, kachlíky ale nelze otáčet) tak, aby:

  • barvy kachlíků přilehlé k obvodu sítě souhlasily s barvami předepsanými tomto na obvodu sítě a

  • každá dvojice barev na dotyku dvou kachlíků byla rovněž shodná?

NP-úplné problémy

Splnitelnost (SAT)

CNF (booleovská formule v konjunktivní normální formě, tj. konjunkce disjunkcí) FF na nn proměnných. Existuje pravdivostní ohodnocení proměnných, které splňuje formuli FF?

Důkaz transformací KACHL ∝ SAT: pomocí proměnných xijkx_{ijk}, kde xijk=1x_{ijk} = 1, pokud na pozici

ParseError: KaTeX parse error: Undefined control sequence: \[ at position 1: \̲[̲i,j]

se nachází kachlík typu kk. Jednotlivé klauzule se vytvoří tak, aby zaručovaly, že na každé pozici je právě jeden kachlík, že kachlíky navazují horizontálně, vertikálně i na kraje stěny.

3-SAT

Kubická CNF (vždy jen 3 proměnné v jedné disjunkci) FF na nn Booleovských proměnných. Existuje pravdivostní ohodnocení proměnných, které splňuje formuli FF?

Transformace SAT ∝ 3-SAT: stačí každou klauzuli (disjunkci) rozložit s pomocí nových volných proměnných na několik kubických klauzulí: (ai,1ai,2ai,3ai,ki)(a_{i,1} \vee a_{i,2} \vee a_{i,3} \vee \dots \vee a_{i,k_i}) odpovídá (ai,1ai,2yi,1)(¬yi,1ai,3yi,2)(¬yi,2)(¬yi,ki3ai,ki1ai,ki)(a_{i,1} \vee a_{i,2} \vee y_{i,1}) \wedge (\neg y_{i,1} \vee a_{i,3} \vee y_{i,2}) \wedge (\neg y_{i,2} \dots) \wedge \dots \wedge (\neg y_{i,k_i-3} \vee a_{i,k_i-1}\vee a_{i,k_i})

3-COLOR

Tříobarvení grafu: Mějme neorientovaný graf G=(V,E)G=(V, E). Lze obarvit vrcholy ve VV třemi barvami tak, aby žádná hrana v EE neměla na obou koncích vrcholy stejné barvy?

Image:3sat-3color.png Transformace 3-SAT ∝ 3-COLOR: Vytvořím pro všechny proměnné a jejich negace vrcholy grafu a spojím se třemi body (z nichž každý musí být jinak barevný podle obrázku), aby proměnné musely mít barvu T nebo F. Proměnné a negace jsou taky spojené, aby bylo jednoznačně dána hodnota každé z nich. Pro každou klauzuli 3-SAT přidám grafík podle obrázku (napojím na proměnné, které představují literály klauzule a na druhé straně na barvu F), aby proměnné v něm nešly obarvit FFF.

KLIKA

Mějme neorientovaný graf G=(V,E)G=(V, E) a přirozené číslo kk. Existuje VVV' \subseteq V, V=k|V’| = k, indukující úplný podgraf grafu GG?

Transformace SAT ∝ KLIKA -- pro každý literál vytvořím bod grafu, spojím všechny body odpovídající literálům různých klauzulí, pokud se nejedná o komplementární proměnné, tj. mezi xix_i a ¬xi\neg x_i nevede hrana.

Nezávislá Množina (NM)

Mějme neorientovaný graf G=(V,E)G=(V, E) a přirozené číslo qq. Existuje VVV' \subseteq V, V=q|V’| = q, taková, že uvnitř VV' nejsou žádné hrany?

Transformace KLIKA ∝ NM: stačí prohodit hrany a ne-hrany.

Vrcholové pokrytí (VP)

Máme neorientovaný graf G=(V,E)G=(V, E) a přirozené číslo rr. Existuje VVV' \subseteq V, V=r|V’| = r taková, že každá hrana má ve VV' alespoň jeden vrchol?

Transformace NM ∝ VP: NM je doplněk VP (vedou-li hrany do VP, už nemůžou vést mezi ostatními vrcholy).

Hamiltonovská Kružnice (HK)

Máme neorientovaný graf G=(V,E)G=(V,E). Obsahuje G hamiltonovskou kružnici, tj. jednoduchou kružnici, která prochází každým vrcholem právě jednou?

Image:hk-vp.png

Transformace VP ∝ HK: Na V|V| pomyslných linkách naskládám pro každou hranu původního grafu dvanáctici vrcholů spojených podle obrázku (widget). Krajní body všech linek spojím s vrcholy odpovídající původnímu VP v1,,vrv_1,\dots,v_r. Protože widgety lze projít jen částečně (2x po linkách) nebo úplně (jednou všechny), bude HK vést částečným průchodem přes widgety, pokud oba vrcholy příslušné jejich hraně původního grafu patří do VP a úplným jinak.

Obchodní cestující (TSP)

Máme úplný neorientovaný graf G=(V,E)G=(V,E), váhy w:EZ0+w : E \to \mathbb{Z}_0^+ a číslo kZ+k \in \mathbb{Z}^+. Existuje v GG hamiltonovská kružnice s celkovou váhou nejvýše kk? Někdy se počítá nad neúplným grafem a požaduje se hamiltonovský sled, tj. je možné opakovat vrcholy; to se ale na tuto definici snadno převede.

Transformace HK ∝ TSP: stačí nastavit váhy tak, že w(e)=1w(e) = 1, pokud ee byla v původním grafu a w(e)=2w(e) = 2 jinak. Je-li chtěná váha rovna počtu vrcholů původního grafu, řešení dává HK v něm.

Součet podmnožiny (SP)

Jsou daná čísla a1,,an,bZ+a_1 , \dots ,a_n , b \in \mathbb{Z}^+. Existuje množina indexů S{1,,n}S \subseteq \{1,\dots ,n\} taková, že iSai=b\sum_{i\in S} a_i = b?

Transformace VP ∝ SP: vyrobím incidenční matici grafu (řádky odp. vrcholům, sloupce hranám), kde budou jedničky na místech, kde daná hrana vede z daného vrcholu. Přidám k ní matici, jejíž řádky i sloupce odpovídají hranám a jedničky jsou pouze na diagonále (tj. každá hrana má jedničku ve "svém" řádku a sloupci). "Nalevo" od incidenční matice přidám sloupec plný jedniček. Řádky matice interpretuju jako čísla ve čtyřkové soustavě (v každém sloupci jsou tři jedničky, proto nedojde nikdy k přesunu řádů) a hledám součet podmnožiny jako číslo, které má na začátku velikost VP (sečte se ze sloupce jedniček) a následují samé dvojky (pro každou hranu).

Silná NP-úplnost, pseudopolynomiální algoritmy

Příklad

SP není exponenciální, ale polynomiální v počtu a velikosti čísel. Algoritmus (dynamické programování):

  1. Nechť a1a2an ⁣ a_1\leq a_2\leq \dots \leq a_n\,\! a A ⁣ A\,\! je bitové pole délky b ⁣ b\,\! (kde 1 ⁣ 1\,\! na pozici i ⁣ i\,\! bude indikovat možnost vytvoření podmnožiny se součtem i ⁣ i\,\!).

  2. Všechny prvky pole A ⁣ A\,\! nastav na 0 ⁣ 0\,\! a a0a_0 nastav na b+1.

  3. Pro i ⁣ i\,\! od 1 ⁣ 1\,\! do n ⁣ n\,\! opakuj (hl. cyklus):

    1. ParseError: KaTeX parse error: Undefined control sequence: \[ at position 3: A\̲[̲a_i]:=1\,\!

    2. Pro j ⁣ j\,\! od ai1 ⁣ a_{i-1}\,\! do b ⁣ b\,\! zkoušej: když

      ParseError: KaTeX parse error: Undefined control sequence: \[ at position 3: A\̲[̲j] = 1\,\!

      a j+aib ⁣ j+a_i\leq b\,\!, nastav

      ParseError: KaTeX parse error: Undefined control sequence: \[ at position 3: A\̲[̲j+a_i]:=1\,\!

  4. Je-li

    ParseError: KaTeX parse error: Undefined control sequence: \[ at position 3: A\̲[̲b] = 1\,\!

    , podmnožina se součtem rovným b ⁣ b\,\! existuje.

Po i ⁣ i\,\!-tém průchodu hlavním cyklem obsahuje A ⁣ A\,\! jedničky právě u všech součtů neprázdných podmnožin {a1,,ai} ⁣ \{a_1,\dots,a_i\}\,\!. Důkaz -- indukcí. Celk. složitost je O(nb) ⁣ O(n\cdot b)\,\!, což je exponenciální vzhledem k binárně kódovanému vstupu, ale polynomiální, máme-li na vstupu čísla konstantní délky.

Definice (Pseudopolynomiální algoritmus)

Nechť je dán rozhodovací problém Π ⁣ \Pi\,\! a jeho instance I ⁣ I\,\!. Pak definujeme:

  • kód(I) -- délka zápisu (počet bitů) instance I ⁣ I\,\! v binárním kódování (či jiném na něj polynomiálně převoditelném)

  • max(I) -- velikost největšího čísla, vyskytujícího se v I ⁣ I\,\! (NE délka jeho binárního zápisu!)

Algoritmus se nazývá pseudopolynomiální, pokud je jeho časová složitost omezena polynomem v proměnných kód(I) ⁣ (I)\,\! a max(I) ⁣ max(I)\,\!. Každý polynomiální algoritmus je tím pádem pseudopolynomiální.

Poznámka (O číselných problémech)

Pokud pro nějaký problém Π ⁣ \Pi\,\! platí, že I:max(I)p( ⁣ \forall I:max(I)\leq p(\,\!kód(I)) ⁣ (I))\,\! pro nějaký polynom p ⁣ p\,\!, pak všechny pseudopolynomiální algoritmy, řešící tento problém, jsou zároveň polynomiální.

Všechny problémy, kde tato rovnice neplatí(tj. neexistuje p ⁣ p\,\!, že by platila), nazýváme číselné problémy.

Věta (O pseudopolynomialitě a NP)

Nechť Π ⁣ \Pi\,\! je NP-úplný problém a není číselný. Pak pokud P ⁣ \neq\,\!NP, nemůže být Π ⁣ \Pi\,\! řešen pseudopolynomiálním algoritmem.

Poznámka

Ani ne každý číselný problém je řešitelný pseudopolynomiálním algoritmem.

Věta (O pseudopolynomialitě a podproblémech)

Nechť Π ⁣ \Pi\,\! je rozhodovací problém a p ⁣ p\,\! polynom. Potom Πp ⁣ \Pi_p\,\! označme množinu instancí (podproblém) problému Π ⁣ \Pi\,\!, pro které platí max(I)p( ⁣ max(I)\leq p(\,\!kód(I)) ⁣ (I))\,\!. Potom máme-li pseudopolynomiální algoritmus A ⁣ A\,\!, který řeší problém Π ⁣ \Pi\,\!, určitě existuje polynomiální algoritmus, řešící Πp ⁣ \Pi_p\,\!. Toto platí pro libovolné p.

Důkaz

Algoritmus A ⁣ A'\,\!, řešící Πp ⁣ \Pi_p\,\! v polynomiálním čase, otestuje x ⁣ x\,\! na přítomnost v Πp ⁣ \Pi_p\,\! (spočítá kód(x) ⁣ (x)\,\! a max(x) ⁣ max(x)\,\!) a pokud xΠp ⁣ x\in\Pi_p\,\!, chová se stejně jako A ⁣ A\,\!, takže běží v čase q( ⁣ q(\,\!kód(x),max(x))q( ⁣ (x),max(x))\leq q(\,\!kód(x),p( ⁣ (x),p(\,\!kód(x)))=q( ⁣ (x))) = q'(\,\!kód(x)) ⁣ (x))\,\!.

Definice (Silně NP-úplný problém)

Rozhodovací problém Π ⁣ \Pi\,\! je silně NP-úplný, pokud Π ⁣ \Pi\in\,\!NP a existuje polynom p ⁣ p\,\! takový, že podproblém Πp ⁣ \Pi_p\,\! je NP-úplný.

Věta (O silné NP-úplnosti)

Nechť problém Π ⁣ \Pi\,\! je silně NP-úplný. Potom, pokud P ⁣ \neq\,\!NP, neexistuje pseudopolynomiální algoritmus, který by řešil Π ⁣ \Pi\,\!.

Důkaz

Plyne z předchozí věty.

Příklady

TSP je silně NP-úplný. Je to číselný problém, protože váhy hran nejsou omezené. Když váhy na hranách omezím, dostanu NP-úplný podproblém (jde na něj převést HK).

3-ROZDĚLENÍ je silně NP-úplné. Problém: máme a1,a3m,bN ⁣ a_1,\dots a_{3m},b\in \mathbb{N}\,\! takové, že j:14baj12b ⁣ \forall j:\frac{1}{4}b\leq a_j\leq\frac{1}{2}b\,\! a navíc j=13maj=mb ⁣ \sum_{j=1}^{3m} a_j = mb\,\!. Existuje S1,Sm ⁣ S_1,\dots S_m\,\! disjunktní rozdělení množiny {1,,3m} ⁣ \{1,\dots,3m\}\,\! takové, že i:jSiaj=b ⁣ \forall i:\sum_{j\in S_i} a_j = b\,\!?

Důkaz se provádí převodem z 3DM (třídimenzionální párování na tripartitních grafech), všechna čísla konstruovaná pro převod jsou polynomiálně velká vzhledem ke G ⁣ |G|\,\! (v převodu VPSP ⁣ VP\propto SP\,\! byla exponenciálně velká).

{{Statnice I3}}