From: Martin Mares Date: Wed, 14 Dec 2011 19:52:32 +0000 (+0100) Subject: Aproximace: Oziveno X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=bccad1e294fb4a98f92b4b8412eed747c5138c98;p=ads2.git Aproximace: Oziveno --- diff --git a/9-apx/9-apx.tex b/9-apx/9-apx.tex new file mode 100644 index 0000000..4763c7f --- /dev/null +++ b/9-apx/9-apx.tex @@ -0,0 +1,298 @@ +\input lecnotes.tex +\prednaska{9}{Aproximaèní algoritmy}{} + +\>Na~minulých pøedná¹kách jsme se zabývali rùznými tì¾kými rozhodovacími +problémy. Tato se zabývá postupy, jak se v~praxi vypoøádat s~øe¹ením tìchto +problémù. + +\h{Co dìlat, kdy¾ potkáme NP-úplný problém} +\algo +\:Nepanikaøit. +\:Spokojit se s~málem. +\:Rozmyslet, jestli opravdu potøebujeme obecný algoritmus. Mnohdy potøebujeme pouze +speciálnìj¹í pøípady, které mohou být øe¹itelné v~polynomiálním èase. +\:Spokojit se s~pøibli¾ným øe¹ením, (pou¾ít aproximaèní algoritmus). +\:Pou¾ít heuristiku -- napøíklad genetické algoritmy nebo randomizované algoritmy. +Velmi pomoci mù¾e i jen výhodnìj¹í poøadí pøi~prohledávání èi oøezávání nìkterých +napohled nesmyslných vìtví výpoètu. +\endalgo + +\h{První zpùsob: Speciální pøípad} + +\>Èasto si vystaèíme s~vyøe¹ením speciálního pøípadu NP-úplného problému, který +le¾í v~$P$. Napøíklad pøi øe¹ení grafové úlohy nám mù¾e staèit øe¹ení +pro~speciální druh grafù (stromy, bipartitní grafy, \dots). Barvení grafu je lehké +napø. pro~dvì barvy èi pro intervalové grafy. 2-SAT, jako speciální pøípad SATu, +se dá øe¹it v~lineárním èase. + +\>Uká¾eme si dva takové pøípady (budeme øe¹ení hledat, nejen rozhodovat, zda existuje) + +\s{Problém: Maximální nezávislá mno¾ina ve~stromì (ne rozhodovací)} + +\>{\I Vstup:} Zakoøenìný strom~$T$. + +\>{\I Výstup:} Maximální (co do~poètu vrcholù) nezávislá mno¾ina vrcholù~$M$~v~$T$. + +\>BÚNO mù¾eme pøedpokládat, ¾e v~$M$ jsou v¹echny listy $T$. Pokud by nìkterý +list $l$ v~$M$ nebyl, tak se podíváme na~jeho otce: +\itemize\ibull +\:Pokud otec není v~$M$, tak list $l$ pøidáme do~$M$, èím¾ se nezávislost +mno¾iny zachovala a velikost stoupla o~1. +\:Pokud tam otec je, tak ho z~$M$ vyjmeme a na~místo nìho vlo¾íme $l$. +Nezávislost ani velikost $M$ se nezmìnily. +\endlist +\>Nyní listy spolu s~jejich otci z~$T$ odebereme a postup opakujeme. $T$ se +mù¾e rozpadnout na~les, ale to nevadí $\to$ tentý¾ postup aplikujeme na~v¹echny stromy v~lese. + +\s{Algoritmus:} +\>MaxNz$(T)$ +\algo +\:Polo¾íme $L$:=$\{$listy stromu $T\}$. +\:Polo¾íme $O$:=$\{$otcové vrcholù z~$L\}$. +\:Vrátíme $L \cup$ MaxNz$(T\setminus(O \cup L))$. +\endalgo +\>{\I Poznámka:} Toto doká¾eme naprogramovat v~$\O(n)$ (udr¾ujeme si frontu listù). + +\s{Problém: Batoh} + +\>Je daná mno¾ina $n$~pøedmìtù s~hmotnostmi $h_1,\ldots,h_n$ +a cenami $c_1,\ldots,c_n$ a~batoh, který unese hmostnost~$H$. Najdìte takovou +podmno¾inu pøedmìtù, jejich¾ celková hmotnost je maximálnì $H$ a celková cena +je maximální mo¾ná. + +\>Tento problém je zobecnìním problému batohu z~minulé pøedná¹ky dvìma smìry: +Jednak místo rozhodovacího problému øe¹íme optimalizaèní, jednak pøedmìty +mají ceny (pøedchozí verze odpovídala tomu, ¾e ceny jsou rovny hmotnostem). +Uká¾eme si algoritmus pro øe¹ení tohoto obecného problému, jeho¾ èasová +slo¾itost bude polynomiální v~poètu pøedmìtù~$n$ a souètu v¹ech cen~$C=\sum_i +c_i$. + +\>Pou¾ijeme dynamické programování. Pøedstavme si problém omezený na~prvních~$k$ +pøedmìtù. Oznaème si $A_k(c)$ (kde $0\le c\le C$) minimální hmotnost +podmno¾iny, její¾ cena je právì~$c$. Tato $A_k$ spoèteme indukcí podle~$k$: +Pro $k=0$ je urèitì $A_0(0)=0$, $A_0(c)=infty$ pro $c>0$. Pokud ji¾ známe +$A_{k-1}$, spoèítáme $A_k$ následovnì: $A_k(c)$ odpovídá nìjaké podmno¾inì +pøedmìtù z~$1,\ldots,k$. V~této podmno¾inì jsme buïto $k$-tý pøedmìt nepou¾ili +(a pak je $A_k(c)=A_{k-1}(c)$), nebo pou¾ili a tehdy bude $A_k(c) = +A_{k-1}(c-c_k) + h_k$ (to samozøejmì jen pokud $c\ge c_k$). Z~tìchto dvou +mo¾ností si vybereme tu, která dává mno¾inu s~men¹í hmotností. Tedy: +$$ +A_k(c) = \min (A_{k-1}(c), A_{k-1}(c-c_k) + h_k). +$$ +Tímto zpùsobem v~èase $\O(C)$ spoèteme $A_k(c)$ pro fixní $k$ a v¹echna $c$, +v~èase $\O(nC)$ pak v¹echny $A_k(c)$. + +\>Podle $A_n$ snadno nalezneme maximální cenu mno¾iny, která se vejde do~batohu. +To bude nejvìt¹í~$c^*$, pro nì¾ je $A_n(c^*) \le H$. Jeho nalezení nás stojí +èas $\O(C)$. + +\>A~jak zjistit, které pøedmìty do~nalezené mno¾iny patøí? Upravíme algoritmus, +aby si pro ka¾dé $A_k(c)$ pamatoval $B_k(c)$, co¾ bude index posledního pøedmìtu, +který jsme do~pøíslu¹né mno¾iny pøidali. Pro nalezené $c^*$ tedy bude $i=B_n(c^*)$ +poslední pøedmìt v~nalezené mno¾inì, $i'=B_{i-1}(c^*-c_i)$ ten pøedposlední +a tak dále. Takto v~èase $\O(n)$ rekonstruujeme celou mno¾inu od~posledního +prvku k~prvnímu. + +\>Ukázali jsme tedy algoritmus s~èasovou slo¾itostí $\O(nC)$, který vyøe¹í +problém batohu. Jeho slo¾itost není polynomem ve~velikosti vstupu ($C$~mù¾e +být a¾ exponenciálnì velké vzhledem k~velikosti vstupu), ale pouze ve~velikosti +èísel na~vstupu. Takovým algoritmùm se øíká {\I pseudopolynomiální.} Ani takové +algoritmy ale nejsou k dispozici pro v¹echny problémy (napø. u problému obchodního +cestujícího nám vùbec nepomù¾e, ¾e váhy hran budou malá èísla). + +\s{Verze bez cen:} Na verzi s~cenami rovnými hmotnostem se dá pou¾ít +i jiný algoritmus zalo¾ený na~dynamickém programování: poèítáme mno¾iny +$Z_k$ obsahující v¹echny hmotnosti men¹í ne¾~$H$, kterých nabývá +nìjaká podmno¾ina prvních~$k$ prvkù. Pøitom $Z_0=\{0\}$, $Z_k$ +spoèteme ze~$Z_{k-1}$ --- udr¾ujme si $Z_{k-1}$ jako setøídìný spojový seznam, +výpoèet dal¹ího seznamu udìláme slitím dvou seznamù $Z_{k-1}$ a $Z_{k-1}$ se +v¹emi prvky zvý¹enými o hmotnost $k$ zahazujíce duplicitní a pøíli¹ velké hodnoty --- +a ze~$Z_n$ vyèteme výsledek. V¹echny tyto mno¾iny +mají nejvý¹e $H$ prvkù, tak¾e celková èasová slo¾itost algoritmu je~$\O(nH)$. + +\h{Druhý zpùsob: Aproximace} + +\>V pøedcházejících problémech jsme se zamìøili na~speciální pøípady. Obèas v¹ak +takové ¹tìstí nemáme a musíme vyøe¹it celý NP-úplný problém. Mù¾eme si v¹ak +pomoct tím, ¾e se ho nebudeme sna¾it vyøe¹it optimálnì -- namísto optimálního +øe¹ení najdeme nìjaké, které je nejvý¹e $c$-krát hor¹í pro nìjakou konstantu $c$. + +\s{Problém: Obchodní cestující} + +\>{\I Vstup:} Neorientovaný graf~$G$, ka¾dá hrana +je ohodnocená funkcí $w: E(G)\rightarrow {\bb R }^+_0$. + +\>{\I Výstup:} Hamiltonovská kru¾nice (obsahující v¹echny vrcholy grafu), a~to ta nejkrat¹í +(podle ohodnocení). + +\>Tento problém je hned na~první pohled nároèný -- u¾ sama existence +hamiltonovské kru¾nice je NP-úplná. Najdeme aproximaèní algoritmus nejprve za pøedpokladu, +¾e vrcholy splòují trojúhelníkovou nerovnost (tj. $\forall x,y,z \in V: w(xz)\le +w(xy)+w(yz)$), potom uká¾eme, ¾e v úplnì obecném pøípadé by samotná existence +aproximaèního algoritmu implikovala ${\rm P=NP }$. + +\>{\I a) trojúhelníková nerovnost:} + +Existuje pìkný algoritmus, který najde hamiltonovskou kru¾nici o délce $\leq +2\cdot opt$, kde $opt$ je délka nejkrat¹í hamiltonovské kru¾nice. +Vedle pøedpokladu trojúhelníkové +nerovnosti budeme potøebovat, aby ná¹ graf byl úplný. Souhrnnì mù¾eme +pøedpokládat, ¾e úlohu øe¹íme v nìjakém metrickém protoru, ve kterém jsou obì +podmínky podle definice splnìny. + +Najdeme nejmen¹í kostru grafu a obchodnímu cestujícímu poradíme, a» jde po~ní -- kostru +zakoøeníme a projdeme jako strom do hloubky, pøièem¾ se zastavíme a¾ v koøeni po projití +v¹ech vrcholù. Problém v¹ak je, ¾e prùchod po kostøe obsahuje +nìkteré vrcholy i hrany vícekrát, a proto musíme nahradit nepovolené vracení se. +Máme-li na nìjaký vrchol vstoupit podruhé, prostì ho ignorujeme a pøesuneme se +rovnou na dal¹í nenav¹tívený -- dovolit si to mù¾eme, graf je úplný a obsahuje +hrany mezi v¹emi dvojicemi vrcholù +(jinak øeèeno, poøadí vrcholù kru¾nice bude preorder výpis prùchodem do hloubky). +Pokud platí trojúhelníková nerovnost, tak si tìmito zkratkami neu¹kodíme. +Nech» minimální kostra má váhu~$T$. Pokud bychom pro¹li celou kostru, bude mít +sled váhu~$2T$ (ka¾dou hranou kostry jsme ¹li tam a zpátky), a pøeskakování +vrcholù celkovou váhu nezvìt¹uje (pøi pøeskoku +nahradíme cestu $xyz$ jedinou hranou $xz$, pøièem¾ z trojúhelníkové nerovnosti +máme $xz \leq xy + xz$), tak¾e váha nalezené +hamiltonovské kru¾nice bude také nanejvý¹ $2T$. + +Kdy¾ máme hamiltonovskou kru¾nici $C$ a z~ní vy¹krtneme hranu, dostaneme kostru +grafu~$G$ s~váhou men¹í ne¾ $C$ -- ale ka¾dá kostra je alespoò tak tì¾ká +jako minimální kostra $T$. Tedy optimální hamiltonovská kru¾nice je urèitì tì¾¹í +ne¾ minimální kostra $T$. Kdy¾ tyto dvì nerovnosti slo¾íme +dohromady, algoritmus nám vrátí hamiltonovskou kru¾nici $T'$ s~váhou nanejvý¹ +dvojnásobnou vzhledem k optimální hamiltonovské kru¾nici ($T' \leq 2T < 2C$). Takovéto +algoritmy se nazývají {\I 2-aproximaèní}, kdy¾ øe¹ení je maximálnì dvojnásobné +od~optimálního.\foot{Hezkým trikem se v obecných metrických prostorech umí +$1{,}5$-aproximace. Ve~nìkterých metrických prostorech (tøeba v euklidovské +rovinì) se aproximaèní pomìr dá dokonce srazit na +libovolnì blízko k 1. Zaplatíme ale na èase -- èím pøesnìj¹í výsledek +po algoritmu chceme, tím déle to bude trvat.} + +\>{\I b) bez~trojúhelníkové nerovnosti:} + +Zde se budeme naopak sna¾it ukázat, ¾e ¾ádný polynomiální aproximaèní +algoritmus neexistuje. + +\s{Vìta:} Pokud pro~libovolné~$\varepsilon>0$ existuje polynomiální +$(1+\varepsilon)$-aproximaèní algoritmus pro~problém obchodního cestujícího bez~trojúhelníkové nerovnosti, tak ${\rm P = NP }$. + +\proof Uká¾eme, ¾e v~takovém pøípadì doká¾eme v~polynomiálním èase zjistit, +zda v grafu existuje hamiltonovská kru¾nice. + +\>Dostali jsme graf~$G$, ve~kterém hledáme hamiltonovskou kru¾nici. Doplníme +$G$ na~úplný graf~$G'$ a~váhy hran~$G'$ nastavíme takto: +\itemize\ibull +\: $w(e) = 1$, kdy¾ $e \in E(G)$ +\: $w(e) = c \gg 1$, kdy¾ $e \not\in E(G)$ +\endlist +\>Konstantu $c$ potøebujeme zvolit tak velkou, abychom jasnì poznali, jestli +je ka¾dá hrana z nalezené hamiltonovské kru¾nice hranou grafu $G$ (pokud by +nebyla, bude kru¾nice obsahovat aspoò jednu hranu s váhou $c$, která vy¾ene +souèet poznatelnì vysoko). Pokud existuje hamiltonovská kru¾nice v~$G'$ slo¾ená jen +z~hran, které byly +pùvodnì v~$G$, pak optimální øe¹ení bude mít váhu~$n$, jinak bude urèitì +minimálnì $n-1+c$. Kdy¾ máme aproximaèní algoritmus s~pomìrem~$1+\varepsilon$, +musí tedy být +$$ +\eqalign{ +(1+\varepsilon)\cdot n &< n-1+c \cr +\varepsilon n+1 &< c +} +$$ +\>Kdyby takový algoritmus existoval, máme polynomiální algoritmus +na~hamiltonovskou kru¾nici. +\qed + +\s{Poznámka:} O existenci pseudopolynomiálního algoritmu +platí analogická vìta, a doká¾e se analogicky -- existující hrany budou +mít váhu 1, neexistující váhu 2. + +\h{Aproximaèní schéma pro problém batohu} + +Ji¾ víme, jak optimalizaèní verzi problému batohu vyøe¹it v~èase $\O(nC)$, +pokud jsou hmotnosti i ceny na~vstupu pøirozená èísla a $C$ je souèet v¹ech cen. +Jak si poradit, pokud je~$C$ obrovské? Kdybychom mìli ¹tìstí a v¹echny +ceny byly dìlitelné nìjakým èíslem~$p$, mohli bychom je tímto èíslem +vydìlit. Tím bychom dostali zadání s~men¹ími èísly, jeho¾ øe¹ením by byla +stejná mno¾ina pøedmìtù jako u~zadání pùvodního. + +Kdy¾ nám ¹tìstí pøát nebude, mù¾eme pøesto zkusit ceny vydìlit a výsledky +nìjak zaokrouhlit. Øe¹ení nové úlohy pak sice nebude pøesnì odpovídat optimálnímu +øe¹ení té pùvodní, ale kdy¾ nastavíme parametry správnì, bude alespoò jeho dobrou aproximací. + +\s{Základní my¹lenka:} + +Oznaèíme si $c_{max}$ maximum z~cen~$c_i$. Zvolíme si nìjaké pøirozené èíslo~$M < c_{max}$ +a zobrazíme interval cen $[0, c_{max}]$ na $[0,M]$ (tedy ka¾dou cenu znásobíme +$M/c_{max}$). +Jak jsme tím zkreslili výsledek? V¹imnìme si, ¾e efekt je stejný, jako kdybychom jednotlivé +ceny zaokrouhlili na~násobky èísla $c_{max}/M$ (prvky z intervalu +$[i\cdot c_{max}/M,(i+1)\cdot c_{max}/M)$ se zobrazí na stejný prvek). Ka¾dé $c_i$ jsme tím +tedy zmìnili o~nejvý¹e $c_{max}/M$, celkovou cenu libovolné podmno¾iny pøedmìtù pak +nejvý¹e o~$n\cdot c_{max}/M$. Teï si je¹tì v¹imnìme, ¾e pokud ze~zadání odstraníme +pøedmìty, které se samy nevejdou do~batohu, má optimální øe¹ení pùvodní úlohy cenu $OPT\ge c_{max}$, +tak¾e chyba v~souètu je nejvý¹e $n\cdot OPT/M$. Má-li tato chyba být shora omezena +$\varepsilon\cdot OPT$, musíme zvolit $M\ge n/\varepsilon$.\foot{Pøipomìòme, ¾e toto je¹tì není dùkaz, nebo» velkoryse pøehlí¾íme chyby dané zaokrouhlováním. Dùkaz provedeme ní¾e.} + +\s{Algoritmus:} +\algo +\:Odstraníme ze~vstupu v¹echny pøedmìty tì¾¹í ne¾~$H$. +\:Spoèítáme $c_{max}=\max_i c_i$ a zvolíme $M=\lceil n/\varepsilon\rceil$. +\:Kvantujeme ceny: $\forall i: \hat{c}_i \leftarrow \lfloor c_i \cdot M/c_{max} \rfloor$. +\:Vyøe¹íme dynamickým programováním problém batohu pro upravené ceny $\hat{c}_1, \ldots, \hat{c}_n$ +a pùvodní hmotnosti i kapacitu batohu. +\:Vybereme stejné pøedmìty, jaké pou¾ilo optimální øe¹ení kvantovaného zadání. +\endalgo + +\>Kroky 1--3 a 5 jistì zvládneme v~èase $\O(n)$. Krok~4 øe¹í problém batohu +se souètem cen $\hat{C}\le nM = \O(n^2/\varepsilon)$, co¾ stihne v~èase $\O(n\hat{C})=\O(n^3/\varepsilon)$. +Zbývá dokázat, ¾e výsledek na¹eho algoritmu má opravdu relativní chybu nejvý¹e~$\varepsilon$. + +Nejprve si rozmyslíme, jakou cenu budou mít pøedmìty které daly optimální øe¹ení +v pùvodním zadání (tedy mají v pùvodním zadání dohromady cenu $OPT$), +kdy¾ jejich ceny nakvantujeme (mno¾inu indexù tìchto pøedmìtù si oznaèíme~$Y$): +$$ +\eqalign{ +\widehat{OPT} &= \sum_{i\in Y} \hat{c}_i = +\sum_i \left\lfloor c_i\cdot {M\over c_{max}} \right\rfloor \ge +\sum_i \left( c_i\cdot {M\over c_{max}} - 1 \right) \ge \cr +&\ge +\biggl(\sum_i c_i \cdot {M\over c_{max}}\biggr) - n = +OPT \cdot {M\over c_{max}} - n. +} +$$ +Nyní spoèítejme, jak dopadne optimální øe¹ení~$Q$ nakvantovaného problému pøi pøepoètu +na~pùvodní ceny (to je výsledek na¹eho algoritmu): +$$ +\eqalign{ +ALG &= \sum_{i\in Q} c_i \ge +\sum_i \hat{c}_i \cdot {c_{max}\over M} = +\biggl(\sum_i \hat{c}_i\biggr) \cdot {c_{max}\over M} \ge^* +\widehat{OPT} \cdot {c_{max}\over M}. +} +$$ +Nerovnost $\ge^*$ platí proto, ¾e $\sum_{i\in Q} \hat{c}_i$ je optimální øe¹ení +kvantované úlohy, zatímco $\sum_{i\in Y} \hat{c}_i$ je nìjaké dal¹í øe¹ení té¾e úlohy, +které nemù¾e být lep¹í. Teï u¾ staèí slo¾it obì nerovnosti a dosadit za~$M$: +$$ +\eqalign{ +ALG &\ge \biggl( { OPT \cdot M\over c_{max}} - n\biggr) \cdot {c_{max}\over M} \ge +OPT - {n\cdot c_{max}\over n / \varepsilon} \ge OPT - \varepsilon c_{max} \ge \cr +&\ge OPT - \varepsilon OPT = (1-\varepsilon)\cdot OPT. +} +$$ +Algoritmus tedy v¾dy vydá øe¹ení, které je nejvý¹e $(1-\varepsilon)$-krát hor¹í ne¾ optimum, +a~doká¾e to pro libovolné~$\varepsilon$ v~èase polynomiálním v~$n$. Takovému algoritmu øíkáme +{\I polynomiální aproximaèní schéma} (jinak té¾ PTAS\foot{Polynomial-Time Approximation Scheme}). +V~na¹em pøípadì je dokonce slo¾itost polynomiální i v~závislosti na~$1/\varepsilon$, tak¾e +schéma je {\I plnì polynomiální} (øeèené té¾ FPTAS\foot{Fully Polynomial-Time Approximation +Scheme}). U nìkterých problémù se stává, ¾e aproximaèní schéma závisí na +$1/\varepsilon$ exponenciálnì, co¾ tak pøíjemné není. Shròme, co jsme zjistili, do následující vìty: + +\s{Vìta:} +Existuje algoritmus, který pro ka¾dé $\varepsilon > 0$ nalezne +{\I $(1 - \varepsilon)$-aproximaci} problému batohu s $n$ pøedmìty v èase +$\O(n^3/\varepsilon)$. + +\bye diff --git a/9-apx/Makefile b/9-apx/Makefile new file mode 100644 index 0000000..97d729b --- /dev/null +++ b/9-apx/Makefile @@ -0,0 +1,3 @@ +P=9-apx + +include ../Makerules diff --git a/old/12-apx/12-apx.tex b/old/12-apx/12-apx.tex deleted file mode 100644 index d2583f3..0000000 --- a/old/12-apx/12-apx.tex +++ /dev/null @@ -1,299 +0,0 @@ -\input lecnotes.tex -\prednaska{12}{Aproximaèní algoritmy}{\vbox{\hbox{(F. Ha¹ko, J. Menda, M. Mare¹,} - \hbox{ Michal Kozák, Vojta Tùma)}}} - -\>Na~minulých pøedná¹kách jsme se zabývali rùznými tì¾kými rozhodovacími -problémy. Tato se zabývá postupy, jak se v~praxi vypoøádat s~øe¹ením tìchto -problémù. - -\h{Co dìlat, kdy¾ potkáme NP-úplný problém} -\algo -\:Nepanikaøit. -\:Spokojit se s~málem. -\:Rozmyslet, jestli opravdu potøebujeme obecný algoritmus. Mnohdy potøebujeme pouze -speciálnìj¹í pøípady, které mohou být øe¹itelné v~polynomiálním èase. -\:Spokojit se s~pøibli¾ným øe¹ením, (pou¾ít aproximaèní algoritmus). -\:Pou¾ít heuristiku -- napøíklad genetické algoritmy nebo randomizované algoritmy. -Velmi pomoci mù¾e i jen výhodnìj¹í poøadí pøi~prohledávání èi oøezávání nìkterých -napohled nesmyslných vìtví výpoètu. -\endalgo - -\h{První zpùsob: Speciální pøípad} - -\>Èasto si vystaèíme s~vyøe¹ením speciálního pøípadu NP-úplného problému, který -le¾í v~$P$. Napøíklad pøi øe¹ení grafové úlohy nám mù¾e staèit øe¹ení -pro~speciální druh grafù (stromy, bipartitní grafy, \dots). Barvení grafu je lehké -napø. pro~dvì barvy èi pro intervalové grafy. 2-SAT, jako speciální pøípad SATu, -se dá øe¹it v~lineárním èase. - -\>Uká¾eme si dva takové pøípady (budeme øe¹ení hledat, nejen rozhodovat, zda existuje) - -\s{Problém: Maximální nezávislá mno¾ina ve~stromì (ne rozhodovací)} - -\>{\I Vstup:} Zakoøenìný strom~$T$. - -\>{\I Výstup:} Maximální (co do~poètu vrcholù) nezávislá mno¾ina vrcholù~$M$~v~$T$. - -\>BÚNO mù¾eme pøedpokládat, ¾e v~$M$ jsou v¹echny listy $T$. Pokud by nìkterý -list $l$ v~$M$ nebyl, tak se podíváme na~jeho otce: -\itemize\ibull -\:Pokud otec není v~$M$, tak list $l$ pøidáme do~$M$, èím¾ se nezávislost -mno¾iny zachovala a velikost stoupla o~1. -\:Pokud tam otec je, tak ho z~$M$ vyjmeme a na~místo nìho vlo¾íme $l$. -Nezávislost ani velikost $M$ se nezmìnily. -\endlist -\>Nyní listy spolu s~jejich otci z~$T$ odebereme a postup opakujeme. $T$ se -mù¾e rozpadnout na~les, ale to nevadí $\to$ tentý¾ postup aplikujeme na~v¹echny stromy v~lese. - -\s{Algoritmus:} -\>MaxNz$(T)$ -\algo -\:Polo¾íme $L$:=$\{$listy stromu $T\}$. -\:Polo¾íme $O$:=$\{$otcové vrcholù z~$L\}$. -\:Vrátíme $L \cup$ MaxNz$(T\setminus(O \cup L))$. -\endalgo -\>{\I Poznámka:} Toto doká¾eme naprogramovat v~$\O(n)$ (udr¾ujeme si frontu listù). - -\s{Problém: Batoh} - -\>Je daná mno¾ina $n$~pøedmìtù s~hmotnostmi $h_1,\ldots,h_n$ -a cenami $c_1,\ldots,c_n$ a~batoh, který unese hmostnost~$H$. Najdìte takovou -podmno¾inu pøedmìtù, jejich¾ celková hmotnost je maximálnì $H$ a celková cena -je maximální mo¾ná. - -\>Tento problém je zobecnìním problému batohu z~minulé pøedná¹ky dvìma smìry: -Jednak místo rozhodovacího problému øe¹íme optimalizaèní, jednak pøedmìty -mají ceny (pøedchozí verze odpovídala tomu, ¾e ceny jsou rovny hmotnostem). -Uká¾eme si algoritmus pro øe¹ení tohoto obecného problému, jeho¾ èasová -slo¾itost bude polynomiální v~poètu pøedmìtù~$n$ a souètu v¹ech cen~$C=\sum_i -c_i$. - -\>Pou¾ijeme dynamické programování. Pøedstavme si problém omezený na~prvních~$k$ -pøedmìtù. Oznaème si $A_k(c)$ (kde $0\le c\le C$) minimální hmotnost -podmno¾iny, její¾ cena je právì~$c$. Tato $A_k$ spoèteme indukcí podle~$k$: -Pro $k=0$ je urèitì $A_0(0)=0$, $A_0(c)=infty$ pro $c>0$. Pokud ji¾ známe -$A_{k-1}$, spoèítáme $A_k$ následovnì: $A_k(c)$ odpovídá nìjaké podmno¾inì -pøedmìtù z~$1,\ldots,k$. V~této podmno¾inì jsme buïto $k$-tý pøedmìt nepou¾ili -(a pak je $A_k(c)=A_{k-1}(c)$), nebo pou¾ili a tehdy bude $A_k(c) = -A_{k-1}(c-c_k) + h_k$ (to samozøejmì jen pokud $c\ge c_k$). Z~tìchto dvou -mo¾ností si vybereme tu, která dává mno¾inu s~men¹í hmotností. Tedy: -$$ -A_k(c) = \min (A_{k-1}(c), A_{k-1}(c-c_k) + h_k). -$$ -Tímto zpùsobem v~èase $\O(C)$ spoèteme $A_k(c)$ pro fixní $k$ a v¹echna $c$, -v~èase $\O(nC)$ pak v¹echny $A_k(c)$. - -\>Podle $A_n$ snadno nalezneme maximální cenu mno¾iny, která se vejde do~batohu. -To bude nejvìt¹í~$c^*$, pro nì¾ je $A_n(c^*) \le H$. Jeho nalezení nás stojí -èas $\O(C)$. - -\>A~jak zjistit, které pøedmìty do~nalezené mno¾iny patøí? Upravíme algoritmus, -aby si pro ka¾dé $A_k(c)$ pamatoval $B_k(c)$, co¾ bude index posledního pøedmìtu, -který jsme do~pøíslu¹né mno¾iny pøidali. Pro nalezené $c^*$ tedy bude $i=B_n(c^*)$ -poslední pøedmìt v~nalezené mno¾inì, $i'=B_{i-1}(c^*-c_i)$ ten pøedposlední -a tak dále. Takto v~èase $\O(n)$ rekonstruujeme celou mno¾inu od~posledního -prvku k~prvnímu. - -\>Ukázali jsme tedy algoritmus s~èasovou slo¾itostí $\O(nC)$, který vyøe¹í -problém batohu. Jeho slo¾itost není polynomem ve~velikosti vstupu ($C$~mù¾e -být a¾ exponenciálnì velké vzhledem k~velikosti vstupu), ale pouze ve~velikosti -èísel na~vstupu. Takovým algoritmùm se øíká {\I pseudopolynomiální.} Ani takové -algoritmy ale nejsou k dispozici pro v¹echny problémy (napø. u problému obchodního -cestujícího nám vùbec nepomù¾e, ¾e váhy hran budou malá èísla). - -\s{Verze bez cen:} Na verzi s~cenami rovnými hmotnostem se dá pou¾ít -i jiný algoritmus zalo¾ený na~dynamickém programování: poèítáme mno¾iny -$Z_k$ obsahující v¹echny hmotnosti men¹í ne¾~$H$, kterých nabývá -nìjaká podmno¾ina prvních~$k$ prvkù. Pøitom $Z_0=\{0\}$, $Z_k$ -spoèteme ze~$Z_{k-1}$ --- udr¾ujme si $Z_{k-1}$ jako setøídìný spojový seznam, -výpoèet dal¹ího seznamu udìláme slitím dvou seznamù $Z_{k-1}$ a $Z_{k-1}$ se -v¹emi prvky zvý¹enými o hmotnost $k$ zahazujíce duplicitní a pøíli¹ velké hodnoty --- -a ze~$Z_n$ vyèteme výsledek. V¹echny tyto mno¾iny -mají nejvý¹e $H$ prvkù, tak¾e celková èasová slo¾itost algoritmu je~$\O(nH)$. - -\h{Druhý zpùsob: Aproximace} - -\>V pøedcházejících problémech jsme se zamìøili na~speciální pøípady. Obèas v¹ak -takové ¹tìstí nemáme a musíme vyøe¹it celý NP-úplný problém. Mù¾eme si v¹ak -pomoct tím, ¾e se ho nebudeme sna¾it vyøe¹it optimálnì -- namísto optimálního -øe¹ení najdeme nìjaké, které je nejvý¹e $c$-krát hor¹í pro nìjakou konstantu $c$. - -\s{Problém: Obchodní cestující} - -\>{\I Vstup:} Neorientovaný graf~$G$, ka¾dá hrana -je ohodnocená funkcí $w: E(G)\rightarrow {\bb R }^+_0$. - -\>{\I Výstup:} Hamiltonovská kru¾nice (obsahující v¹echny vrcholy grafu), a~to ta nejkrat¹í -(podle ohodnocení). - -\>Tento problém je hned na~první pohled nároèný -- u¾ sama existence -hamiltonovské kru¾nice je NP-úplná. Najdeme aproximaèní algoritmus nejprve za pøedpokladu, -¾e vrcholy splòují trojúhelníkovou nerovnost (tj. $\forall x,y,z \in V: w(xz)\le -w(xy)+w(yz)$), potom uká¾eme, ¾e v úplnì obecném pøípadé by samotná existence -aproximaèního algoritmu implikovala ${\rm P=NP }$. - -\>{\I a) trojúhelníková nerovnost:} - -Existuje pìkný algoritmus, který najde hamiltonovskou kru¾nici o délce $\leq -2\cdot opt$, kde $opt$ je délka nejkrat¹í hamiltonovské kru¾nice. -Vedle pøedpokladu trojúhelníkové -nerovnosti budeme potøebovat, aby ná¹ graf byl úplný. Souhrnnì mù¾eme -pøedpokládat, ¾e úlohu øe¹íme v nìjakém metrickém protoru, ve kterém jsou obì -podmínky podle definice splnìny. - -Najdeme nejmen¹í kostru grafu a obchodnímu cestujícímu poradíme, a» jde po~ní -- kostru -zakoøeníme a projdeme jako strom do hloubky, pøièem¾ se zastavíme a¾ v koøeni po projití -v¹ech vrcholù. Problém v¹ak je, ¾e prùchod po kostøe obsahuje -nìkteré vrcholy i hrany vícekrát, a proto musíme nahradit nepovolené vracení se. -Máme-li na nìjaký vrchol vstoupit podruhé, prostì ho ignorujeme a pøesuneme se -rovnou na dal¹í nenav¹tívený -- dovolit si to mù¾eme, graf je úplný a obsahuje -hrany mezi v¹emi dvojicemi vrcholù -(jinak øeèeno, poøadí vrcholù kru¾nice bude preorder výpis prùchodem do hloubky). -Pokud platí trojúhelníková nerovnost, tak si tìmito zkratkami neu¹kodíme. -Nech» minimální kostra má váhu~$T$. Pokud bychom pro¹li celou kostru, bude mít -sled váhu~$2T$ (ka¾dou hranou kostry jsme ¹li tam a zpátky), a pøeskakování -vrcholù celkovou váhu nezvìt¹uje (pøi pøeskoku -nahradíme cestu $xyz$ jedinou hranou $xz$, pøièem¾ z trojúhelníkové nerovnosti -máme $xz \leq xy + xz$), tak¾e váha nalezené -hamiltonovské kru¾nice bude také nanejvý¹ $2T$. - -Kdy¾ máme hamiltonovskou kru¾nici $C$ a z~ní vy¹krtneme hranu, dostaneme kostru -grafu~$G$ s~váhou men¹í ne¾ $C$ -- ale ka¾dá kostra je alespoò tak tì¾ká -jako minimální kostra $T$. Tedy optimální hamiltonovská kru¾nice je urèitì tì¾¹í -ne¾ minimální kostra $T$. Kdy¾ tyto dvì nerovnosti slo¾íme -dohromady, algoritmus nám vrátí hamiltonovskou kru¾nici $T'$ s~váhou nanejvý¹ -dvojnásobnou vzhledem k optimální hamiltonovské kru¾nici ($T' \leq 2T < 2C$). Takovéto -algoritmy se nazývají {\I 2-aproximaèní}, kdy¾ øe¹ení je maximálnì dvojnásobné -od~optimálního.\foot{Hezkým trikem se v obecných metrických prostorech umí -$1{,}5$-aproximace. Ve~nìkterých metrických prostorech (tøeba v euklidovské -rovinì) se aproximaèní pomìr dá dokonce srazit na -libovolnì blízko k 1. Zaplatíme ale na èase -- èím pøesnìj¹í výsledek -po algoritmu chceme, tím déle to bude trvat.} - -\>{\I b) bez~trojúhelníkové nerovnosti:} - -Zde se budeme naopak sna¾it ukázat, ¾e ¾ádný polynomiální aproximaèní -algoritmus neexistuje. - -\s{Vìta:} Pokud pro~libovolné~$\varepsilon>0$ existuje polynomiální -$(1+\varepsilon)$-aproximaèní algoritmus pro~problém obchodního cestujícího bez~trojúhelníkové nerovnosti, tak ${\rm P = NP }$. - -\proof Uká¾eme, ¾e v~takovém pøípadì doká¾eme v~polynomiálním èase zjistit, -zda v grafu existuje hamiltonovská kru¾nice. - -\>Dostali jsme graf~$G$, ve~kterém hledáme hamiltonovskou kru¾nici. Doplníme -$G$ na~úplný graf~$G'$ a~váhy hran~$G'$ nastavíme takto: -\itemize\ibull -\: $w(e) = 1$, kdy¾ $e \in E(G)$ -\: $w(e) = c \gg 1$, kdy¾ $e \not\in E(G)$ -\endlist -\>Konstantu $c$ potøebujeme zvolit tak velkou, abychom jasnì poznali, jestli -je ka¾dá hrana z nalezené hamiltonovské kru¾nice hranou grafu $G$ (pokud by -nebyla, bude kru¾nice obsahovat aspoò jednu hranu s váhou $c$, která vy¾ene -souèet poznatelnì vysoko). Pokud existuje hamiltonovská kru¾nice v~$G'$ slo¾ená jen -z~hran, které byly -pùvodnì v~$G$, pak optimální øe¹ení bude mít váhu~$n$, jinak bude urèitì -minimálnì $n-1+c$. Kdy¾ máme aproximaèní algoritmus s~pomìrem~$1+\varepsilon$, -musí tedy být -$$ -\eqalign{ -(1+\varepsilon)\cdot n &< n-1+c \cr -\varepsilon n+1 &< c -} -$$ -\>Kdyby takový algoritmus existoval, máme polynomiální algoritmus -na~hamiltonovskou kru¾nici. -\qed - -\s{Poznámka:} O existenci pseudopolynomiálního algoritmu -platí analogická vìta, a doká¾e se analogicky -- existující hrany budou -mít váhu 1, neexistující váhu 2. - -\h{Aproximaèní schéma pro problém batohu} - -Ji¾ víme, jak optimalizaèní verzi problému batohu vyøe¹it v~èase $\O(nC)$, -pokud jsou hmotnosti i ceny na~vstupu pøirozená èísla a $C$ je souèet v¹ech cen. -Jak si poradit, pokud je~$C$ obrovské? Kdybychom mìli ¹tìstí a v¹echny -ceny byly dìlitelné nìjakým èíslem~$p$, mohli bychom je tímto èíslem -vydìlit. Tím bychom dostali zadání s~men¹ími èísly, jeho¾ øe¹ením by byla -stejná mno¾ina pøedmìtù jako u~zadání pùvodního. - -Kdy¾ nám ¹tìstí pøát nebude, mù¾eme pøesto zkusit ceny vydìlit a výsledky -nìjak zaokrouhlit. Øe¹ení nové úlohy pak sice nebude pøesnì odpovídat optimálnímu -øe¹ení té pùvodní, ale kdy¾ nastavíme parametry správnì, bude alespoò jeho dobrou aproximací. - -\s{Základní my¹lenka:} - -Oznaèíme si $c_{max}$ maximum z~cen~$c_i$. Zvolíme si nìjaké pøirozené èíslo~$M < c_{max}$ -a zobrazíme interval cen $[0, c_{max}]$ na $[0,M]$ (tedy ka¾dou cenu znásobíme -$M/c_{max}$). -Jak jsme tím zkreslili výsledek? V¹imnìme si, ¾e efekt je stejný, jako kdybychom jednotlivé -ceny zaokrouhlili na~násobky èísla $c_{max}/M$ (prvky z intervalu -$[i\cdot c_{max}/M,(i+1)\cdot c_{max}/M)$ se zobrazí na stejný prvek). Ka¾dé $c_i$ jsme tím -tedy zmìnili o~nejvý¹e $c_{max}/M$, celkovou cenu libovolné podmno¾iny pøedmìtù pak -nejvý¹e o~$n\cdot c_{max}/M$. Teï si je¹tì v¹imnìme, ¾e pokud ze~zadání odstraníme -pøedmìty, které se samy nevejdou do~batohu, má optimální øe¹ení pùvodní úlohy cenu $OPT\ge c_{max}$, -tak¾e chyba v~souètu je nejvý¹e $n\cdot OPT/M$. Má-li tato chyba být shora omezena -$\varepsilon\cdot OPT$, musíme zvolit $M\ge n/\varepsilon$.\foot{Pøipomìòme, ¾e toto je¹tì není dùkaz, nebo» velkoryse pøehlí¾íme chyby dané zaokrouhlováním. Dùkaz provedeme ní¾e.} - -\s{Algoritmus:} -\algo -\:Odstraníme ze~vstupu v¹echny pøedmìty tì¾¹í ne¾~$H$. -\:Spoèítáme $c_{max}=\max_i c_i$ a zvolíme $M=\lceil n/\varepsilon\rceil$. -\:Kvantujeme ceny: $\forall i: \hat{c}_i \leftarrow \lfloor c_i \cdot M/c_{max} \rfloor$. -\:Vyøe¹íme dynamickým programováním problém batohu pro upravené ceny $\hat{c}_1, \ldots, \hat{c}_n$ -a pùvodní hmotnosti i kapacitu batohu. -\:Vybereme stejné pøedmìty, jaké pou¾ilo optimální øe¹ení kvantovaného zadání. -\endalgo - -\>Kroky 1--3 a 5 jistì zvládneme v~èase $\O(n)$. Krok~4 øe¹í problém batohu -se souètem cen $\hat{C}\le nM = \O(n^2/\varepsilon)$, co¾ stihne v~èase $\O(n\hat{C})=\O(n^3/\varepsilon)$. -Zbývá dokázat, ¾e výsledek na¹eho algoritmu má opravdu relativní chybu nejvý¹e~$\varepsilon$. - -Nejprve si rozmyslíme, jakou cenu budou mít pøedmìty které daly optimální øe¹ení -v pùvodním zadání (tedy mají v pùvodním zadání dohromady cenu $OPT$), -kdy¾ jejich ceny nakvantujeme (mno¾inu indexù tìchto pøedmìtù si oznaèíme~$Y$): -$$ -\eqalign{ -\widehat{OPT} &= \sum_{i\in Y} \hat{c}_i = -\sum_i \left\lfloor c_i\cdot {M\over c_{max}} \right\rfloor \ge -\sum_i \left( c_i\cdot {M\over c_{max}} - 1 \right) \ge \cr -&\ge -\biggl(\sum_i c_i \cdot {M\over c_{max}}\biggr) - n = -OPT \cdot {M\over c_{max}} - n. -} -$$ -Nyní spoèítejme, jak dopadne optimální øe¹ení~$Q$ nakvantovaného problému pøi pøepoètu -na~pùvodní ceny (to je výsledek na¹eho algoritmu): -$$ -\eqalign{ -ALG &= \sum_{i\in Q} c_i \ge -\sum_i \hat{c}_i \cdot {c_{max}\over M} = -\biggl(\sum_i \hat{c}_i\biggr) \cdot {c_{max}\over M} \ge^* -\widehat{OPT} \cdot {c_{max}\over M}. -} -$$ -Nerovnost $\ge^*$ platí proto, ¾e $\sum_{i\in Q} \hat{c}_i$ je optimální øe¹ení -kvantované úlohy, zatímco $\sum_{i\in Y} \hat{c}_i$ je nìjaké dal¹í øe¹ení té¾e úlohy, -které nemù¾e být lep¹í. Teï u¾ staèí slo¾it obì nerovnosti a dosadit za~$M$: -$$ -\eqalign{ -ALG &\ge \biggl( { OPT \cdot M\over c_{max}} - n\biggr) \cdot {c_{max}\over M} \ge -OPT - {n\cdot c_{max}\over n / \varepsilon} \ge OPT - \varepsilon c_{max} \ge \cr -&\ge OPT - \varepsilon OPT = (1-\varepsilon)\cdot OPT. -} -$$ -Algoritmus tedy v¾dy vydá øe¹ení, které je nejvý¹e $(1-\varepsilon)$-krát hor¹í ne¾ optimum, -a~doká¾e to pro libovolné~$\varepsilon$ v~èase polynomiálním v~$n$. Takovému algoritmu øíkáme -{\I polynomiální aproximaèní schéma} (jinak té¾ PTAS\foot{Polynomial-Time Approximation Scheme}). -V~na¹em pøípadì je dokonce slo¾itost polynomiální i v~závislosti na~$1/\varepsilon$, tak¾e -schéma je {\I plnì polynomiální} (øeèené té¾ FPTAS\foot{Fully Polynomial-Time Approximation -Scheme}). U nìkterých problémù se stává, ¾e aproximaèní schéma závisí na -$1/\varepsilon$ exponenciálnì, co¾ tak pøíjemné není. Shròme, co jsme zjistili, do následující vìty: - -\s{Vìta:} -Existuje algoritmus, který pro ka¾dé $\varepsilon > 0$ nalezne -{\I $(1 - \varepsilon)$-aproximaci} problému batohu s $n$ pøedmìty v èase -$\O(n^3/\varepsilon)$. - -\bye diff --git a/old/12-apx/Makefile b/old/12-apx/Makefile deleted file mode 100644 index 11f9d14..0000000 --- a/old/12-apx/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -P=12-apx - -include ../Makerules