====== IN14 Složitost ======
===== Zadání ====
(časová a prostorová složitost, hierarchie tříd složitosti a vztahy mezi nimi. NP-těžké a NP-úplné úlohy. Polynomiální redukce. Příklady NP-těžkých a NP-úplných úloh. Metody důkazu NP-těžkosti.)
===== Vypracování =====
==== Základní informace ====
Pro tuto otázku se předpokládá základní znalost [[home:inf:in12|Turingových strojů]], [[home:inf:in13|redukce]] a algebry (měla by stačit v rozsahu [[home:inf:ap1|AP1,IN1 Množiny a relace]]).
Hlavní sdělení teorie složitosti:
* Některé z řešených problémů nejsou prakticky řešitelné v rozumném čase
* Klasifikace a možnost porovnání složitosti algoritmicky řešitelných i neřešitelných problémů
* Problémy lze řešit nekonečně mnoha programy, existují mezi nimi nejjednodušší?
==== Časová a prostorová složitost ====
Časovou složitost chápeme jako počet kroků výpočtu algoritmu (Turingova stroje), závisí na velikosti vstupu, proto provádíme analýzu nejhoršího případu tzv. horní odhad (s analýzou nejlepšího případu se setkáváme zřídka).
Nechť **//M//** je daný deterministrický TS(DTS), který zastaví pro každý vstup. Časová složitost stroje **//M//** je funkce **//TimeM:N->N//** definována takto:
//
**TimeM(n) = max{ StepsM(x) | |x|=n }**//
kde StepsM(x) je počet kroků, které provede stroj **//M//** pro vstup //**x**// a //**|x|**// je délka vstupu TS
Nechť **//M//** je daný nedeterministrický TS(NDTS) takový, že pro každý stup má výpočetní strom všechny výpočetní cesty konečné. Čas výpočtu (//**RunTimeM(x)**//) stroje **//M//** je pro vstup //**x**// je roven maximální délce výpočetní cesty (t.j. maximálnímu počtu kroků, které provede stroj //**M**// pro vstup //**x**//). Časová složitost stroje **//M//** je funkce **//TimeM:N->N//** definovaná takto:
//**TimeM(n) = max{ RunTimeM(x) | |x|=n }**// ((slidy Složitost výpočtů a problému, Přednáška č. 6 str 5, definice 1 a 2))
Prostorová složitost je obecně brána jako počet paměťových buněk potřebných k výpočtu algoritmu. U TS je to počet políček pásky. Často se liší s rozdílnou délkou vstupu, provádíme analýzu nejhoršího případu (s analýzou nejlepšího případu se setkáváme zřídka).
Nechť **//M//** je daný deterministrický TS(DTS), který zastaví pro každý vstup. Řekneme, že **//M//** má prostorovou složitost **//SpaceM:N->N//**, jestliže **//SpaceM(n)//** je maximální počet políček pásky čtený strojem **//M//**, kde maximum se bere přes všechny vstupy délky **//n//**
Nechť **//M//** je daný nedeterministrický TS(NDTS) takový, že pro každý stup má výpočetní strom všechny výpočetní cesty konečné. Prostorová složitost stroje **//M//** je funkce **//SpaceM:N->N//** taková, že **//SpaceM(n)//** je maximální počet políček čtený strojem **//M//**, kde maximum se bere přes všechny vstupy délky //**n**// a pro každý vstup //**n**// přes všechny výpočetní cesty. ((slidy Složitost výpočtů a problému, Přednáška č. 6 str 23 a 24, definice 8 a 9))
Dále potřebujeme mít nějaký nástroj, který nám pomůže říct, která funkce je obecně složitější, nebo zda jsou dvě funkce podobně složité. Zajímá nás především růst řádu funkce, nikoliv konkrétní složitost v konkrétním případě. Při použití růstu řádu je možné se odprostit od konkrétních podrobností funkce a zdůrazníme tím asymptotické chování t.j. **O kolik se výpočet zpomalí pro velmi velký vstup.**
Nechť Položme
Pro říkáme, že //**r**// neroste asymptoticky rychleji než //**f**//.
Položme
Pro říkáme, že //**r**// roste asymptoticky alespoň tak rychle jako //**f**//.
Položme . Pro říkáme, že //**g**// a //**f**// jsou asymptoticky ekvivalentní (mají stejný řád růstu)
Nechť . Jestliže
Pak řekneme, že //**g**// roste asymptoticky rychleji než //**f**// a píšeme
((slidy Složitost výpočtů a problému, Přednáška č. 6 str 9 a 1, definice 3))
==== Hierarchie tříd složitosti ====
Základní rozdělení je dle toho, zda je problém řešitelný v polynomickém čase DTS, nebo TS.
Následně podle složitosti výpočtu máme třídy logaritmické, polynomické a exponenciální
Nechť //**f:N->R+**//
((slidy Složitostní třídy, přednáška č. 7, str. 1))Příklady problémů z P:
* PATH (hledání nejkratší cesty)
* RELPRIME = { | x a y jsou relativní prvočísla} (2 čísla jsou relativní prvočísla, když jejich NSD je roven 1), v P vypočítáme například pomocí Euklidova algoritmu
* Každý CFL in P (důkaz pomocí dynamického programování)
Nechť //**f:N->R+**//
((slidy Složitostní třídy, přednáška č. 7, str. 14))
Verifikátorem pro jazyk **//A//** je algoritmus **//V//** takový, že **//A//** = {//**w**// | //**V**// akceptuje /**w**//,//**c**//> pro nějaký řetězec //**c**// }((slidy Složitostní třídy, přednáška č. 7, str. 19))Verifikátor požívá dodatečnou informaci (//**c**//) k potvrzení, že //**w**// je z //**A**//. //**c**//
se nazývá svědek.
**NP** je třída jazyků, které mají polynomický verifikátor. ((slidy Složitostní třídy, přednáška č. 7, str. 20))
Idea důkazu: NTS nedeterministicky uhádne řešení problému a poté ověří v polynomickém čase (pomocí verifikátoru).
Takže problém patří do NP, jestliže umíme v polynomickém čase potvrdit správné řešení.
příklady z **NP**
* HAMPATH neorientovaný graf má hampath, jestliže existuje orientovaný cyklus, která vede přes každý vrchol právě jednou (obdobný s TSP - obchodní cestující - projít všechny body s nejkratší celkovou cestou)
* CLIQUE (//**Klika**// v neorientovaném grafu je podgraf takový, že existuje hrana mezi každými dvěma uzly. //**k-klika**// je //**klika**//, která má //**k**// vrcholů)
* další příklady viz. NP-úplné předměty
==== Vztahy mezi třídami složitosti ====
//Odůvodnění: deterministické TS jsou i nedeterministicke TS.//
Důsledek:
Nemáte o prázdninách brigádu a chcete něco solidně zaplaceného? Zkuste třeba vyřešit otázku, zda . Dostanete 1 milion dolarů a navíc budete ve skriptech, a to se vyplatí. Více informací naleznete na stránkách [[http://www.claymath.org/millennium/|Clay Mathematics Institute]]. Jde o otevřený problém, který zatím nikdo nevyřešil. Obecně se věří v nerovnost. Pokud by se třídy rovnaly, mělo by to zásadní dopad na současné fungování např. kryptografie.
Nejlepší dosud možný způsob, jak řešit problémy z NP na deterministických strojích, je použít exponenciální algoritmus. Umíme dokázat, že:
//**P**// obsahuje právě všechny prakticky řešitelné problémy
Pouze teze, podobně jako Churchova, je pro ni méně indicií, než pro Churchovu tezi, ale v současnosti se věří, že platí(t.j., že ).
Další známé vztahy mezi složitostními třídami:
Nechť (složitost musí být alespoň logaritmická, při konstantní složitosti budou vztahy "hezčí").
Pak
-
-
-
-
Odůvodnění 3. a 4. části - lze dokázat, že (N)DTS může být upraven tak, aby skončil po krocích a přitom akceptoval stejný jazyk. Důkaz viz slidy((Slidy - vztahy mezi složitostními třídami, přednáška č.9 str 4,5))
Nechť . Pak
-
-
Odůvodnění: Provedeme DFS TODO na výpočetním stromu NTS //**M**// a vytvoříme strom postupně. Akceptujeme, jakmile narazíme na akceptující konfiguraci. Důkaz 1. i 2. části viz slidy((Slidy - vztahy mezi složitostními třídami, přednáška č.9 str 6,7))
Odůvodnění: Nedeterministický stroj o složitosti //**n**// lze simulovat deterministickým strojem, který bude potřebovat maximálně **//n2//** prostoru (což je pro nás obojí polynomické). Detailní důkaz viz slidy((Slidy - vztahy mezi složitostními třídami, přednáška č.9 str 10-13)) nebo skripta
Mnohem důležitější je však důsledek této věty:
Celková klasifikace:
==== Polynomiální redukce ====
Pro lepší pochopení jsem redukci zařadil před np-úplné problémy.
Nechť , Řekneme, že **A** se polynomicky redukuje na **B**, píšeme právě když a redukční funkce , je vyčíslitelná TS **M**, který je časově omezen polynomem. (**f** je vyčíslitelná v polynomickém čase a taková, že pro každé platí: ((slidy Složitostní třídy, přednáška č. 7, str. 8))
Definici doufám naleznete [[home:inf:in13|zde]]
Lidově řečeno: Pokud máme problém **//A//** a dokážeme vymyslet alogritmus(fkce **f**), který nám tento problém převede na problém **//B//** a složitost toho algoritmu je maximálně polynomická, tak se **//A//** polynomicky redukuje na **//B//**
Relace je reflexivní, transitivní, t.j. je kvaziuspořádání.
//to by měl každý umět dokázat na požádání, pro jistotu://
* reflexivita - libovolný problém dokážeme převést na ten stejný problém v polynomickém čase
* transitivita - pokud máme alg. //**f**// který redukuje problém //**A**// na problém //**B**// a algoritmus //**g**// který redukuje problém //**B**// na problém //**C**//, pak máme i algoritmus, který převede //**A**// na //**C**// (tím že na problém použijeme nejprve algoritmus //**f**// a následně //**g**//, pokud jejich složitost byla polynomická, bude i výsledná složitost součtem dvou polynomických složitostí, t.j. také polynomická)
==== NP-těžké úlohy a NP-úplné úlohy====
Místo //**co-P**// uvažujeme problémy, které jsou stejně těžké, jako ostatní problémy v NP
Jazyk **//B//** je **NP-úplný**, jestliže:
1.
2. pro každý jazyk platí
Pokud **//B//** splňuje pouze druhou podmínku, pak se nazývá **NP-těžký**.((skripta Složitost, str. 16))
Jestliže **//B//** je NP-úplný a , pak (z definice)Pokud jste vzali tip na brigádu vážně, tak vám určitě došlo, že abychom dokázali, že **P = NP** stačí najít problém z P, který je zároveň NP-úplný. (pokud vám to nedošlo, tak hledejte brigádu radši [[http://brigady.prace.cz/index.php?page=result&branch%5B%5D=7&branch%5B%5D=5&branch%5B%5D=6&locality=1&work_kind=|tady]])
NP-úplné problémy hrají podobnou roli jako problém zastavení ve vyčíslitelnosti.
==== Příklady NP-těžkých a NP-úplných úloh ====
Mějme výrokovou formuli **F** (v [[home:inf:ap4|CNF]])
Formule **F** je splnitelná, jestliže existuje přiřazení hodnot 0,1 proměnným ve výrokové formuli tak, že je formule pravdivá (1).
Je dán kód formule **F**, a ptáme se Je **F** splnitelná?
Tuto úlohu nazýváme **SAT**
SAT(problém splnitelnosti) je NP-úplný//Idea důkazu NP-úplnosti SAT//
Nechť //**M**// je nedeterministický TS takový, že //**L(M) = A**//. Nechť //**w**// je vstupní slovo pro //**M**//. Sestrojíme výrokovou formuli //**X**// takovou, že //**M**// akceptuje //**w**// právě, když //**X**// je splnitelná. Konstrukce formule //**X**// bude polynomická.
**3SAT**
Obdoba SAT, ale každá formule má právě 3 členy
**CLIQUE**
Ptáme se zda má zadaný graf n-kliku.
**HAMPATH**
Nalezení hamiltonské cesty v grafu
Ale pozor, funkce co-CLIQUE nepatří do NP. Verifikace toho, že něco není přítomno se zdá být obtížnější. Takovéto problémy patří do co-NP. Nevíme, zda se co-NP a NP liší.
==== Metody důkazu NP-těžkosti ====
Problémy dokazujeme redukcí problému, který víme, že je NP-těžký, respektive NP-úplný (např. SAT) na zadaný problém.
Příklady:
SAT se polynomicky redukuje na 3SAT
3SAT se polynomicky redukuje na CLIQUE //viz řešené příklady//
//nezapomeňte že polynomická redukce je transitivní//
===== Předměty =====
* [[https://is.muni.cz/auth/predmety/predmet.pl?obdobi=3724;kod=IB107|FI:IB107]] Vyčíslitelnost a složitost (podzim 2007), prof. RNDr. Luboš Brim, CSc.
* [[https://is.muni.cz/auth/predmety/predmet.pl?id=427574|FI:IA012]] Složitost (jaro 2008), prof. RNDr. Ivana Černá, CSc. (pozn. magisterský předmět)
===== Použitá literatura =====
* prof. RNDr. Luboš Brim, CSc., [[http://www.fi.muni.cz/usr/brim/IB107/IB107-slidy.html|slidy přednášek]] (dostupné pouze z domény muni.cz)
* prof. RNDr. Luboš Brim, CSc., [[http://www.fi.muni.cz/usr/brim/IB107/IB107-texty.html|staré nebo nové učební text]] (dostupné pouze z domény muni.cz)
* [[http://www.fi.muni.cz/usr/brim/PS/IB107/cviceni_zadani.ps|příklady cvičení]] (dostupné pouze z domény muni.cz)
===== Vypracoval =====
Gizmo - Marek Babák ICQ: 67179550 zpracuji do 25.5.2008
stav - 99% z mé strany hotovo, pokud chcete někdo něco doplnit, do toho.
FIXME Je potřeba ještě zapracovat [[http://statnice.dqd.cz/tmp/slozitost.pdf|poznámky od Jitky Pospíšilové]].
~~DISCUSSION~~