]> mj.ucw.cz Git - ads2.git/commitdiff
Prednaska o aproximacich.
authorMartin Mares <mj@ucw.cz>
Sun, 10 Jan 2010 20:06:51 +0000 (21:06 +0100)
committerMartin Mares <mj@ucw.cz>
Sun, 10 Jan 2010 20:06:51 +0000 (21:06 +0100)
12-apx/12-apx.tex [new file with mode: 0644]
12-apx/Makefile [new file with mode: 0644]

diff --git a/12-apx/12-apx.tex b/12-apx/12-apx.tex
new file mode 100644 (file)
index 0000000..cb33da8
--- /dev/null
@@ -0,0 +1,288 @@
+\input lecnotes.tex
+\prednaska{11}{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 
+jejich 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. (viz aproximaèní algoritmy)
+\: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.
+
+\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$.
+
+\>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
+\>Tyto listy spolu s~jejich otci z~$T$ odebereme a postup opakujeme. $T$ se
+mù¾e rozpadnout na~les $\to$ tento postup aplikujeme na~v¹echny stromy v~lese.
+
+\s{Algoritmus:}
+\>MaxNz$(T)$
+\algo
+\:Polo¾íme $M_1$:=$\{$listy stromu $T\}$.
+\:Polo¾íme $M_2$:=$\{$otcové vrcholù z~$M_1\}$.
+\:Vrátíme $M_1 \cup$ MaxNz$(T\setminus(M_1 \cup M_2))$.
+\endalgo
+\>{\I Poznámka:} Toto doká¾eme naprogramovat v~$\O(n)$ (vrcholy procházíme
+pøes frontu).
+
+\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^*) < \infty$. 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-úlný problém. Mù¾eme si v¹ak
+pomoct tím, ¾e se ho nebudeme sna¾it vyøe¹it optimálnì -- jen v~jakémsi pomìru
+k optimálnosti ({\I aproximaci}), tj. budeme vìdìt, o~kolik maximálnì je na¹e
+øe¹ení hor¹í ne¾~optimální.
+
+\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 (v¹echny vrcholy grafu), a~to ta nejkrat¹í
+(podle ohodnocení).
+
+\>Tento problém je hned na~první pohled nároèný -- u¾ problém 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 $P=NP$.
+
+\>{\I a) trojúhelníková nerovnost:} 
+
+Existuje pìkný algoritmus, který najde Hamiltonovsku kru¾nici, která je
+maximálnì dvakrát tak velká jako optimální. Vedle pøedpokladu trojúhelníkové
+nerovnosti budeme potøebovat, aby ná¹ graf byl úplný. Souhrnì 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 a obchodnímu cestujícímu poradíme, a» jde po~ní (staèí
+zakoøenit a projít do hloubky). Problém v¹ak je, ¾e daný sled obsahuje ka¾dý
+vrchol vícekrát, a proto musíme nahradit nepovolené vracení se, tj. pro~ka¾dý
+vrchol najít je¹tì nenav¹tívený vrchol v~na¹em sledu a pøejít pøímo na~nìj 
+(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$. Váha oblezlého sledu tak bude nanejvý¹ $2T$. 
+Krácení urèitì nezvìt¹uje (trojúhelníková nerovnost), 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, tak máme kostru
+grafu~$G$ s~váhou men¹í ne¾ je váha $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¾ to slo¾íme
+dohromady, algoritmus nám vrátí Hamiltonovskou kru¾nici $T'$ s~váhou nanejvý¹
+dvojnásobnou od~optimální Hamiltonovské kru¾nice ($T' \leq 2T < 2C$). Takovéto 
+algoritmy se nazývají {\I 2-aproxiaè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-aproximaènì. Ve speciálních metrických prostorech se to dá dokonce srazit na 
+libovolnì blízko k 1. Samo¾øejmì to pak zaplatíme na èase -- èím déle algoritmus 
+pracuje, tím je pøesnìj¹í.}
+
+\>{\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~algoritmus obchodního cestujícího bez~trojúhelníkové nerovnosti, tak $P = NP$.
+
+\proof Uká¾eme, ¾e v~tom pøípadì doká¾eme v~polynomiálním èase najít
+Hamiltonovskou kru¾nici.
+
+\>Dostali jsme graf~$G$, v~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). Pokuï existuje Hamiltonovská kru¾nice v~$G'$ slo¾ená jen
+z~hran, které byli
+pùvodnì v~$G$, tak 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í být
+$$
+\eqalign{
+(1+\varepsilon)\cdot n &< n-1+c \cr
+\varepsilon n+1 &< c
+}
+$$
+\>Kdyby takový algoritmus existoval, tak máme polynomiální algoritmus
+na~Hamiltonovsku kru¾nici. O existenci pseudopolynomiálního algoritmu 
+platí analogická vìta, a doká¾e se analogicky -- existující hrany budou 
+mít hranu 1, neexistující váhu 2.
+\qed
+
+\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
+zmìnili o~nejvý¹e $c_{max}/M$, celkovou cenu libovolné podmno¾iny pøedmìtù tedy
+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 není dùkaz, nebo» nepoèítáme s chybami danými 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 = \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 \le 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, jak dopadne optimální øe¹ení $OPT$ pùvodního zadání,
+kdy¾ ceny v~nìm pou¾itých pøedmìtù 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í naopak spoèítejme, jak dopadne ø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í.
+
+\s{Vìta:}
+Existuje algoritmus, který $\forall \varepsilon > 0$ nalezneme
+{\I $(1 - \varepsilon)$-aproximaci} problému batohu s $n$ pøedmìty v èase
+$\O(n^3/\varepsilon)$.
+
+\bye
diff --git a/12-apx/Makefile b/12-apx/Makefile
new file mode 100644 (file)
index 0000000..11f9d14
--- /dev/null
@@ -0,0 +1,3 @@
+P=12-apx
+
+include ../Makerules