''Tohle je poněkud obšírnější výcuc ke [[Státnice|státnicovým okruhům]] ze [[Státnice_-_Informatika_-_Složitost_(obory_Matematická_lingvistika_a_Softwarové_systémy)|složitosti]] pro obory [[Státnice_-_Informatika_-_I3:_Matematická_lingvistika|Matematická lingvistika]] a [[Státnice_-_Informatika_-_I2:_Softwarové_systémy|Softwarové systémy]], pocházející ze zápisků z předmětu [[Složitost I]] -- [[User:Tuetschek|Tuetschek]] 22:44, 16 Aug 2010 (CEST)''
==Aproximační algoritmy==
====Definice (Aproximační algoritmus)====
''Aproximační algoritmus'' běží v polynomiálním čase a vrací řešení "blízká" optimu. Je nutné mít nějakou míru kvality řešení. Označme:
* <math> C^{*}\,\!</math> hodnotu optimálního řešení
* <math> C\,\!</math> hodnotu nalezenou aproximačním algoritmem A předpokládejme nezáporné hodnoty řešení.
====Definice (Poměrová chyba)====
Řekneme, že algoritmus řeší problém s ''poměrovou chybou'' <math> \rho(n)\,\!</math>, pokud pro každé zadání velikosti <math> n\,\!</math> platí:
:<math>\max\{\frac{C^{*}}{C},\frac{C}{C^{*}}\}\leq \rho(n)\,\!</math>
====Definice (Relativní chyba)====
Řekneme, že algoritmus řeší problém s ''relativní chybou'' <math> \varepsilon(n)\,\!</math>, pokud pro každé zadání velikosti <math> n\,\!</math> platí:
:<math>\frac{|C-C^{*}|}{C^{*}}\leq \varepsilon(n)\,\!</math>
====Poznámka (O převodu chyb)====
Z jedné chyby se dá vyjádřit druhá:
* V případě maximalizační úlohy: <math> \varepsilon(n) = \frac{C-C^{*}}{C^{*}}=\frac{C}{C^{*}}-1=\rho(n)-1\,\!</math>
* V případě minimalizační úlohy: <math> \varepsilon(n) = \frac{C^{*}-C}{C^{*}}==1-\frac{1}{\rho(n)}\,\!</math>
====Příklad====
Aproximační algoritmy pro vrcholové pokrytí:
* "Brát vrcholy od nejvyššího stupně, dokud nemám celé pokrytí" nemá konstantní relativní chybu -- ex. protipříklad, kdy <math> \rho(k)\leq a\cdot\ln k\,\!</math>
* "Vzít libovolnou hranu, dát do pokrytí její dva konce, odstranit její incidentní hrany a projít tak celé <math> E\,\!</math>" má relativní chybu <math> 2\,\!</math> -- žádné 2 hrany nemají společný vrchol, tj. mám pokrytí o velikosti <math> 2\times|\,\!</math>mn. disj. hran<math> |\,\!</math>. Každé vrcholové pokrytí je ale <math> \geq|\,\!</math>mn. disj. hran<math> |\,\!</math>.
====Příklad====
Aproximační algoritmy pro TSP
* ''Omezení na trojúhelníkovou nerovnost'' -- pořád je NP (převod HK<math> \to\,\!</math>TSP zachovával trojúhelníkovou nerovnost). Algoritmus:
# Najdi minimální kostru <math> T\,\!</math>
# Zvol lib. vrchol a pomocí DFS nad <math> T\,\!</math> (slajdy: chyba) v PRE-ORDERu očísluj vrcholy.
# Cesta (s opakováním) po kostře <math> T\,\!</math> přes všechny vrcholy <math> := X\,\!</math>. Pak <math> w(X)=2 w(T)\,\!</math> (každou hranou kostry jdu tam a zpět).
# Výslednou HK <math> H\,\!</math> vyrobím zkrácením cesty (vypouštěním již navštívených vrcholů), z trojúhelníkové nerovnosti <math> w(H)\leq w(X)\,\!</math>. Celkem tedy dává <math> w(H)\leq w(X)\leq 2w(H^{*})\,\!</math>, protože <math> w(T)\leq w(H^{*})\,\!</math> (<math> H^{*}\,\!</math> je kostra, bez jedné hrany).
* ''Bez omezení'' -- pro žádné konstantní <math> \rho\,\!</math> neexistuje polynomiální algoritmus, řešící obecný TSP s poměrovou chybou <math> \rho\,\!</math>. Mohu totiž mít HK v grafu <math> G=(V,E)\,\!</math>, pak zadání TSP zkonstruovat jako <math> K_{|V|}(V,V\times V)\,\!</math>, kde <math>w(e)=\begin{cases}1 & e\in E \\ n\rho & e\notin E\end{cases}\,\!</math>. Pak by aproximační algoritmus s chybou <math> \rho\,\!</math> musel určitě vždy vrátit přesné řešení, takže by musel být NP-těžký.
==Aproximační schémata==
====Definice (Aproximační schéma)====
''Aproximační schéma'' pro optimalizační úlohu je aproximační algoritmus, který má jako vstup instanci dané úlohy a číslo <math> \varepsilon\geq 0\,\!</math>, a který pro libovolné <math> \varepsilon\,\!</math> pracuje jako aproximační algoritmus s relativní chybou <math> \varepsilon\,\!</math>. Doba běhu může být exponenciální jak vzhledem <math> n\,\!</math> -- velikosti vstupní instance, tak vzhledem k <math> \frac{1}{\varepsilon}\,\!</math>.
====Definice (Polynomiální aproximační schéma)====
''Polynomiální aproximační schéma'' je takové aproximační schéma, které pro každé pevné <math> \varepsilon\geq 0\,\!</math> běží v polynomiálním čase vzhledem k <math> n\,\!</math> (ale stále může být exponenciální vzhledem k <math> \frac{1}{\varepsilon}\,\!</math>.
====Definice (Úplně polynomiální aproximační schéma)====
''Úplně polynomiální aproximační schéma'' je polynomiální aprox. schéma, běžící také v polynomiálním čase vzhledem k <math> \frac{1}{\varepsilon}\,\!</math> (tj. algoritmus s konstantně-krát menší relativní chybou běží v konstantně-krát delším čase).
{{TODO|APPROX-SP}}