From: Martin Mares Date: Sat, 14 Jan 2012 22:05:19 +0000 (+0100) Subject: APX: Prepsan uvod, NZmna ve stromech a castecne aproximace batohu X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=594509b64e8589dbfa1201dd05e4f3ae2bd3ee6f;p=ads2.git APX: Prepsan uvod, NZmna ve stromech a castecne aproximace batohu --- diff --git a/8-prevody/8-prevody.tex b/8-prevody/8-prevody.tex index 8c15db4..960ffcc 100644 --- a/8-prevody/8-prevody.tex +++ b/8-prevody/8-prevody.tex @@ -6,10 +6,6 @@ \def\inp{\s{Vstup problému:} } \def\outp{\s{Výstup problému:} } -\def\cc#1{\hbox{\setfonts[CMSans/]\bf #1}} -\def\P{\cc{P}} -\def\NP{\cc{NP}} - V¹echny úlohy, které jsme zatím potkali, jsme umìli vyøe¹it algoritmem s~polynomiální èasovou slo¾itostí. V~prvním pøiblí¾ení mù¾eme øíci, ¾e polynomialita docela dobøe vystihuje praktickou pou¾itelnost algoritmu.% diff --git a/9-apx/9-apx.tex b/9-apx/9-apx.tex index 4763c7f..450cf67 100644 --- a/9-apx/9-apx.tex +++ b/9-apx/9-apx.tex @@ -1,59 +1,78 @@ \input lecnotes.tex -\prednaska{9}{Aproximaèní algoritmy}{} +\prednaska{9}{Co si poèít s tì¾kým problémem}{} -\>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ù. +V~pøedchozí kapitole jsme zjistili, ¾e mnohé problémy, které v~¾ivotì +potkáme, jsou \NP-úplné, tak¾e není pravdìpodobné, ¾e bychom pro nì +umìli nalézt polynomiální algoritmus. Ale co naplat, èasto je potøebujeme +vyøe¹it. Na¹tìstí situace není zase tak beznadìjná. Nabízejí se tyto +mo¾nosti, co si poèít: -\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. +\:{\I Spokojit se s~málem.} Nejsou vstupy, pro které problém potøebujeme + øe¹it, dostateènì malé, abychom si mohli dovolit pou¾ít algoritmus + s~exponenciální slo¾itostí? Zvlá¹» kdy¾ takový algoritmus vylep¹íme + proøezáváním neperspektivních vìtví výpoètu a tøeba ho i paralelizujeme. +\:{\I Vyøe¹it speciální pøípad.} Nemají na¹e vstupy nìjaký speciální + tvar, kterého bychom mohli vyu¾ít? Grafové problémy jsou èasto v~\P{} + tøeba pro stromy nebo i obecnìji pro bipartitní grafy. U~èíselných + problémù zase nìkdy pomù¾e, jsou-li èísla na vstupu dostateènì malá. +\:{\I Øe¹ení aproximovat.} Pokud chceme nalézt nejlep¹í objekt s~danou + vlastností (tøeba nejvìt¹í nezávislou mno¾inu), nestaèil by nám o~nìco + hor¹í? Èasto existuje polynomiální algoritmus, který nalezne nejhùøe + $c$-krát hor¹í øe¹ení ne¾ je optimum pro nìjakou konstantu~$c$. +\:{\I Pou¾ít heuristiku.} Neumíme-li nic lep¹ího, mù¾eme sáhnout po~nìkteré + z~mnoha heuristických technik, které sice nic nezaruèují, ale obvykle + nìjaké uspokojivé øe¹ení najdou. Hodit se mohou tøeba genetické algoritmy. +\:{\I Kombinace pøístupù.} Èasto lze vý¹e zmínìné pøístupy kombinovat: + napøíklad mù¾eme pou¾ít aproximaèní algoritmus a poté jeho výsledek + je¹tì heuristicky vylep¹ovat. Tak získáme øe¹ení, které zaruèenì není + moc daleko od optima, a~pokud budeme mít ¹tìstí, bude k~nìmu velmi blízko. \endalgo -\h{První zpùsob: Speciální pøípad} +\>Nyní si nìkteré z~tìchto technik pøedvedeme na konkrétních pøíkladech. -\>È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. +\h{Nejvìt¹í nezávislá mno¾ina ve stromu} -\>Uká¾eme si dva takové pøípady (budeme øe¹ení hledat, nejen rozhodovat, zda existuje) +Uká¾eme, ¾e hledání nejvìt¹í nezávislé mno¾iny je pro stromy velmi snadné. -\s{Problém: Maximální nezávislá mno¾ina ve~stromì (ne rozhodovací)} +\s{Lemma:} Buï~$T$ zakoøenìný strom a $\ell$ jeho libovolný list. Pak alespoò jedna +z~nejvìt¹ích nezávislých mno¾in obsahuje~$\ell$. -\>{\I Vstup:} Zakoøenìný strom~$T$. +\proof +Mìjme nejvìt¹í nezávislou mno¾inu~$M$, která list~$\ell$ neobsahuje. Podívejme +se na otce~$p$ listu~$\ell$ (kdyby neexistoval, je celý strom jednovrcholový +a tvrzení triviální). Le¾í~$p$ v~$M$? Pokud ne, mohli bychom do~$M$ pøidat +list~$\ell$ a dostali bychom vìt¹í nezávislou mno¾inu. V~opaèném pøípadì z~$M$ +odebereme otce~$p$ a nahradíme ho listem~$\ell$, èím¾ dostaneme stejnì velkou +nezávislou mno¾inu obsahující~$\ell$. +\qed -\>{\I Výstup:} Maximální (co do~poètu vrcholù) nezávislá mno¾ina vrcholù~$M$~v~$T$. +Algoritmus bude pøímoèaøe pou¾ívat toto lemma. Dostane na vstupu strom, +ten zakoøení a zvolí libovolný list. Tento list umístí do nezávislé mno¾iny +a jeho otce odebere, proto¾e se nemù¾e v~nezávislé mno¾inì vyskytovat. +Toto bude opakovat, dokud nìjaké vrcholy zbývají. (Graf se v~prùbìhu mù¾e +rozpadnout na více komponent, ale to nevadí.) -\>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. +Tento algoritmus jistì pracuje v~polynomiálním èase. ©ikovnou implementací +mù¾eme slo¾itost sní¾it a¾ na lineární. Napøíklad tak, ¾e budeme udr¾ovat seznam +listù. My si uká¾eme jinou lineární implementaci zalo¾enou na prohledávání do hloubky. +Bude pracovat s~polem znaèek~$M$, v~nìm¾ na poèátku bude v¹ude \ a postupnì +obdr¾í \ v¹echny prvky hledané nezávislé mno¾iny. -\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))$. +\algin Strom~$T$ s~koøenem~$v$, pole znaèek~$M$. +\:$M[v] \= \$. +\:Pokud je~$v$ list, skonèíme. +\:Pro v¹echny syny~$w$ vrcholu~$v$: +\::Zavoláme se rekurzivnì na podstrom s~koøenem~$w$. +\::Pokud $M[w]=\$, polo¾íme $M[v] \= \$. \endalgo -\>{\I Poznámka:} Toto doká¾eme naprogramovat v~$\O(n)$ (udr¾ujeme si frontu listù). -\s{Problém: Batoh} +\h{Barvení intervalového grafu} + +FIXME + +\h{Problém batohu s~malými èísly} \>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 @@ -110,12 +129,7 @@ v 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$. +\h{Aproximace problému obchodního cestujícího} \s{Problém: Obchodní cestující} @@ -223,63 +237,69 @@ n \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}$). +\def\cmax{c_{\rm max}} + +Oznaèíme si $\cmax$ maximum z~cen~$c_i$. Zvolíme si nìjaké pøirozené èíslo~$M < \cmax$ +a zobrazíme interval cen $[0, \cmax]$ na $[0,M]$ (tedy ka¾dou cenu znásobíme +$M/\cmax$). 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.} +ceny zaokrouhlili na~násobky èísla $\cmax/M$ (prvky z intervalu +$[i\cdot \cmax/M,(i+1)\cdot \cmax/M)$ se zobrazí na stejný prvek). Ka¾dé $c_i$ jsme tím +tedy zmìnili o~nejvý¹e $\cmax/M$, celkovou cenu libovolné podmno¾iny pøedmìtù pak +nejvý¹e o~$n\cdot \cmax/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 $\\ge \cmax$, +tak¾e chyba v~souètu je nejvý¹e $n\cdot \/M$. Má-li tato chyba být shora omezena +$\varepsilon\cdot \$, 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$. +\:Spoèítáme $\cmax=\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/\cmax \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 +\s{Analýza:} +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$): +Nech» pùvodní úloha má nìjaké optimální øe¹ení~$P$ s~cenou $c(P)$. Rozmysleme +si, jakou cenu $\hat{c}(P)$ bude tato mno¾ina pøedmìtù mít v~nakvantovaném zadání: $$ \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 +\hat{c}(P) &= \sum_{i\in P} \hat{c}_i = +\sum_i \left\lfloor c_i\cdot {M\over \cmax} \right\rfloor \ge +\sum_i \left( c_i\cdot {M\over \cmax} - 1 \right) \ge \cr &\ge -\biggl(\sum_i c_i \cdot {M\over c_{max}}\biggr) - n = -OPT \cdot {M\over c_{max}} - n. +\biggl(\sum_i c_i \cdot {M\over \cmax}\biggr) - n = +c(P) \cdot {M\over \cmax} - n. } $$ -Nyní spoèítejme, jak dopadne optimální øe¹ení~$Q$ nakvantovaného problému pøi pøepoètu +Nyní naopak 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}. +c(Q) &= \sum_{i\in Q} c_i \ge +\sum_i \hat{c}_i \cdot {\cmax\over M} = +\biggl(\sum_i \hat{c}_i\biggr) \cdot {\cmax\over M} \ge +\hat{c}(P) \cdot {\cmax\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$: +Poslední nerovnost platí proto, ¾e $\sum_{i\in Q} \hat{c}_i$ je optimální øe¹ení +kvantované úlohy, zatímco $\sum_{i\in P} \hat{c}_i$ je nìjaké dal¹í øe¹ení té¾e úlohy, +které nemù¾e být lep¹í.% +\foot{Zde nás zachraòuje, ¾e aèkoliv u~obou úloh le¾í optimum obecnì jinde, obì mají +stejnou mno¾inu {\I pøípustných øe¹ení,} tedy tìch, která se vejdou do batohu. Kdybychom +místo cen kvantovali hmotnosti, nebyla by to pravda a algoritmus by nefungoval.} +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. +c(Q) &\ge \biggl( { c(P) \cdot M\over \cmax} - n\biggr) \cdot {\cmax\over M} \ge +c(P) - {n\cdot \cmax\over n / \varepsilon} \ge c(P) - \varepsilon \cmax \ge \cr +&\ge c(P) - \varepsilon c(P) = (1-\varepsilon)\cdot c(P). } $$ Algoritmus tedy v¾dy vydá øe¹ení, které je nejvý¹e $(1-\varepsilon)$-krát hor¹í ne¾ optimum, diff --git a/lecnotes.tex b/lecnotes.tex index 627497b..9606a84 100644 --- a/lecnotes.tex +++ b/lecnotes.tex @@ -142,6 +142,11 @@ % Matematicke symboly \def\symdiff{\mathop{\Delta}} +% Slozitostni tridy +\def\cc#1{\hbox{\setfonts[CMSans/]\bf #1}} +\def\P{\cc{P}} +\def\NP{\cc{NP}} + %%% Cislovani verzi %%% \def\currentversion{%