]> mj.ucw.cz Git - ads2.git/blob - 12-apx/12-apx.tex
Dinic: Preznaceni obrazku (s,t -> z,s)
[ads2.git] / 12-apx / 12-apx.tex
1 \input lecnotes.tex
2 \prednaska{12}{Aproximaèní algoritmy}{\vbox{\hbox{(F. Ha¹ko, J. Menda, M. Mare¹,}
3         \hbox{ Michal Kozák, Vojta Tùma)}}}
4
5 \>Na~minulých pøedná¹kách jsme se zabývali rùznými tì¾kými rozhodovacími
6 problémy. Tato se zabývá postupy, jak se v~praxi vypoøádat s~øe¹ením tìchto
7 problémù.
8
9 \h{Co dìlat, kdy¾ potkáme NP-úplný problém}
10 \algo
11 \:Nepanikaøit.
12 \:Spokojit se s~málem.
13 \:Rozmyslet, jestli opravdu potøebujeme obecný algoritmus. Mnohdy potøebujeme pouze
14 speciálnìj¹í pøípady, které mohou být øe¹itelné v~polynomiálním èase.
15 \:Spokojit se s~pøibli¾ným øe¹ením, (pou¾ít aproximaèní algoritmus).
16 \:Pou¾ít heuristiku -- napøíklad genetické algoritmy nebo randomizované algoritmy.
17 Velmi pomoci mù¾e i jen výhodnìj¹í poøadí pøi~prohledávání èi oøezávání nìkterých
18 napohled nesmyslných vìtví výpoètu.
19 \endalgo
20
21 \h{První zpùsob: Speciální pøípad}
22
23 \>Èasto si vystaèíme s~vyøe¹ením speciálního pøípadu NP-úplného problému, který
24 le¾í v~$P$. Napøíklad pøi øe¹ení grafové úlohy nám mù¾e staèit øe¹ení
25 pro~speciální druh grafù (stromy, bipartitní grafy, \dots). Barvení grafu je lehké
26 napø. pro~dvì barvy èi pro intervalové grafy. 2-SAT, jako speciální pøípad SATu,
27 se dá øe¹it v~lineárním èase.
28
29 \>Uká¾eme si dva takové pøípady (budeme øe¹ení hledat, nejen rozhodovat, zda existuje)
30
31 \s{Problém: Maximální nezávislá mno¾ina ve~stromì (ne rozhodovací)}
32
33 \>{\I Vstup:} Zakoøenìný strom~$T$.
34
35 \>{\I Výstup:} Maximální (co do~poètu vrcholù) nezávislá mno¾ina vrcholù~$M$~v~$T$.
36
37 \>BÚNO mù¾eme pøedpokládat, ¾e v~$M$ jsou v¹echny listy $T$. Pokud by nìkterý
38 list $l$ v~$M$ nebyl, tak se podíváme na~jeho otce:
39 \itemize\ibull
40 \:Pokud otec není v~$M$, tak list $l$ pøidáme do~$M$, èím¾ se nezávislost
41 mno¾iny zachovala a velikost stoupla o~1.
42 \:Pokud tam otec je, tak ho z~$M$ vyjmeme a na~místo nìho vlo¾íme $l$.
43 Nezávislost ani velikost $M$ se nezmìnily.
44 \endlist
45 \>Nyní listy spolu s~jejich otci z~$T$ odebereme a postup opakujeme. $T$ se
46 mù¾e rozpadnout na~les, ale to nevadí $\to$ tentý¾ postup aplikujeme na~v¹echny stromy v~lese.
47
48 \s{Algoritmus:}
49 \>MaxNz$(T)$
50 \algo
51 \:Polo¾íme $L$:=$\{$listy stromu $T\}$.
52 \:Polo¾íme $O$:=$\{$otcové vrcholù z~$L\}$.
53 \:Vrátíme $L \cup$ MaxNz$(T\setminus(O \cup L))$.
54 \endalgo
55 \>{\I Poznámka:} Toto doká¾eme naprogramovat v~$\O(n)$ (udr¾ujeme si frontu listù).
56
57 \s{Problém: Batoh}
58
59 \>Je daná mno¾ina $n$~pøedmìtù s~hmotnostmi $h_1,\ldots,h_n$
60 a cenami $c_1,\ldots,c_n$ a~batoh, který unese hmostnost~$H$. Najdìte takovou
61 podmno¾inu pøedmìtù, jejich¾ celková hmotnost je maximálnì $H$ a celková cena
62 je maximální mo¾ná.
63
64 \>Tento problém je zobecnìním problému batohu z~minulé pøedná¹ky dvìma smìry:
65 Jednak místo rozhodovacího problému øe¹íme optimalizaèní, jednak pøedmìty
66 mají ceny (pøedchozí verze odpovídala tomu, ¾e ceny jsou rovny hmotnostem).
67 Uká¾eme si algoritmus pro øe¹ení tohoto obecného problému, jeho¾ èasová
68 slo¾itost bude polynomiální v~poètu pøedmìtù~$n$ a souètu v¹ech cen~$C=\sum_i
69 c_i$.
70
71 \>Pou¾ijeme dynamické programování. Pøedstavme si problém omezený na~prvních~$k$
72 pøedmìtù. Oznaème si $A_k(c)$ (kde $0\le c\le C$) minimální hmotnost
73 podmno¾iny, její¾ cena je právì~$c$. Tato $A_k$ spoèteme indukcí podle~$k$:
74 Pro $k=0$ je urèitì $A_0(0)=0$, $A_0(c)=\infty$ pro $c>0$. Pokud ji¾ známe
75 $A_{k-1}$, spoèítáme $A_k$ následovnì: $A_k(c)$ odpovídá nìjaké podmno¾inì
76 pøedmìtù z~$1,\ldots,k$. V~této podmno¾inì jsme buïto $k$-tý pøedmìt nepou¾ili
77 (a pak je $A_k(c)=A_{k-1}(c)$), nebo pou¾ili a tehdy bude $A_k(c) =
78 A_{k-1}(c-c_k) + h_k$ (to samozøejmì jen pokud $c\ge c_k$). Z~tìchto dvou
79 mo¾ností si vybereme tu, která dává mno¾inu s~men¹í hmotností. Tedy:
80 $$
81 A_k(c) = \min (A_{k-1}(c), A_{k-1}(c-c_k) + h_k).
82 $$
83 Tímto zpùsobem v~èase $\O(C)$ spoèteme $A_k(c)$ pro fixní $k$ a v¹echna $c$,
84 v~èase $\O(nC)$ pak v¹echny $A_k(c)$.
85
86 \>Podle $A_n$ snadno nalezneme maximální cenu mno¾iny, která se vejde do~batohu.
87 To bude nejvìt¹í~$c^*$, pro nì¾ je $A_n(c^*) < \infty$. Jeho nalezení nás stojí
88 èas $\O(C)$.
89
90 \>A~jak zjistit, které pøedmìty do~nalezené mno¾iny patøí? Upravíme algoritmus,
91 aby si pro ka¾dé $A_k(c)$ pamatoval $B_k(c)$, co¾ bude index posledního pøedmìtu,
92 který jsme do~pøíslu¹né mno¾iny pøidali. Pro nalezené $c^*$ tedy bude $i=B_n(c^*)$
93 poslední pøedmìt v~nalezené mno¾inì, $i'=B_{i-1}(c^*-c_i)$ ten pøedposlední
94 a tak dále. Takto v~èase $\O(n)$ rekonstruujeme celou mno¾inu od~posledního
95 prvku k~prvnímu.
96
97 \>Ukázali jsme tedy algoritmus s~èasovou slo¾itostí $\O(nC)$, který vyøe¹í
98 problém batohu. Jeho slo¾itost není polynomem ve~velikosti vstupu ($C$~mù¾e
99 být a¾ exponenciálnì velké vzhledem k~velikosti vstupu), ale pouze ve~velikosti
100 èísel na~vstupu. Takovým algoritmùm se øíká {\I pseudopolynomiální.} Ani takové
101 algoritmy ale nejsou k dispozici pro v¹echny problémy (napø. u problému obchodního
102 cestujícího nám vùbec nepomù¾e, ¾e váhy hran budou malá èísla).
103
104 \s{Verze bez cen:} Na verzi s~cenami rovnými hmotnostem se dá pou¾ít
105 i jiný algoritmus zalo¾ený na~dynamickém programování: poèítáme mno¾iny
106 $Z_k$ obsahující v¹echny hmotnosti men¹í ne¾~$H$, kterých nabývá
107 nìjaká podmno¾ina prvních~$k$ prvkù. Pøitom $Z_0=\{0\}$, $Z_k$
108 spoèteme ze~$Z_{k-1}$ --- udr¾ujme si $Z_{k-1}$ jako setøídìný spojový seznam,
109 výpoèet dal¹ího seznamu udìláme slitím dvou seznamù $Z_{k-1}$ a $Z_{k-1}$ se
110 v¹emi prvky zvý¹enými o hmotnost $k$ zahazujíce duplicitní a pøíli¹ velké hodnoty ---
111 a ze~$Z_n$ vyèteme výsledek. V¹echny tyto mno¾iny
112 mají nejvý¹e $H$ prvkù, tak¾e celková èasová slo¾itost algoritmu je~$\O(nH)$.
113
114 \h{Druhý zpùsob: Aproximace}
115
116 \>V pøedcházejících problémech jsme se zamìøili na~speciální pøípady. Obèas v¹ak
117 takové ¹tìstí nemáme a musíme vyøe¹it celý NP-úplný problém. Mù¾eme si v¹ak
118 pomoct tím, ¾e se ho nebudeme sna¾it vyøe¹it optimálnì -- namísto optimálního
119 øe¹ení najdeme nìjaké, které je nejvý¹e $c$-krát hor¹í pro nìjakou konstantu $c$.
120
121 \s{Problém: Obchodní cestující}
122
123 \>{\I Vstup:} Neorientovaný graf~$G$, ka¾dá hrana
124 je ohodnocená funkcí $w: E(G)\rightarrow {\bb R }^+_0$.
125
126 \>{\I Výstup:} Hamiltonovská kru¾nice (obsahující v¹echny vrcholy grafu), a~to ta nejkrat¹í
127 (podle ohodnocení).
128
129 \>Tento problém je hned na~první pohled nároèný -- u¾ sama existence
130 hamiltonovské kru¾nice je NP-úplná. Najdeme aproximaèní algoritmus nejprve za pøedpokladu,
131 ¾e vrcholy splòují trojúhelníkovou nerovnost (tj. $\forall x,y,z \in V: w(xz)\le
132 w(xy)+w(yz)$), potom uká¾eme, ¾e v úplnì obecném pøípadé by samotná existence
133 aproximaèního algoritmu implikovala ${\rm P=NP }$.
134
135 \>{\I a) trojúhelníková nerovnost:}
136
137 Existuje pìkný algoritmus, který najde hamiltonovskou kru¾nici o délce $\leq
138 2\cdot opt$, kde $opt$ je délka nejkrat¹í hamiltonovské kru¾nice.
139 Vedle pøedpokladu trojúhelníkové
140 nerovnosti budeme potøebovat, aby ná¹ graf byl úplný. Souhrnnì mù¾eme
141 pøedpokládat, ¾e úlohu øe¹íme v nìjakém metrickém protoru, ve kterém jsou obì
142 podmínky podle definice splnìny.
143
144 Najdeme nejmen¹í kostru grafu a obchodnímu cestujícímu poradíme, a» jde po~ní -- kostru
145 zakoøeníme a projdeme jako strom do hloubky, pøièem¾ se zastavíme a¾ v koøeni po projití
146 v¹ech vrcholù. Problém v¹ak je, ¾e prùchod po kostøe obsahuje
147 nìkteré vrcholy i hrany vícekrát, a proto musíme nahradit nepovolené vracení se.
148 Máme-li na nìjaký vrchol vstoupit podruhé, prostì ho ignorujeme a pøesuneme se
149 rovnou na dal¹í nenav¹tívený -- dovolit si to mù¾eme, graf je úplný a obsahuje
150 hrany mezi v¹emi dvojicemi vrcholù
151 (jinak øeèeno, poøadí vrcholù kru¾nice bude preorder výpis prùchodem do hloubky).
152 Pokud platí trojúhelníková nerovnost, tak si tìmito zkratkami neu¹kodíme.
153 Nech» minimální kostra má váhu~$T$. Pokud bychom pro¹li celou kostru, bude mít
154 sled váhu~$2T$ (ka¾dou hranou kostry jsme ¹li tam a zpátky), a pøeskakování
155 vrcholù celkovou váhu nezvìt¹uje (pøi pøeskoku
156 nahradíme cestu $xyz$ jedinou hranou $xz$, pøièem¾ z trojúhelníkové nerovnosti
157 máme $xz \leq xy + xz$), tak¾e váha nalezené
158 hamiltonovské kru¾nice bude také nanejvý¹ $2T$.
159
160 Kdy¾ máme hamiltonovskou kru¾nici $C$ a z~ní vy¹krtneme hranu, dostaneme kostru
161 grafu~$G$ s~váhou men¹í ne¾ $C$ -- ale ka¾dá kostra je alespoò tak tì¾ká
162 jako minimální kostra $T$. Tedy optimální hamiltonovská kru¾nice je urèitì tì¾¹í
163 ne¾ minimální kostra $T$. Kdy¾ tyto dvì nerovnosti slo¾íme
164 dohromady, algoritmus nám vrátí hamiltonovskou kru¾nici $T'$ s~váhou nanejvý¹
165 dvojnásobnou vzhledem k optimální hamiltonovské kru¾nici ($T' \leq 2T < 2C$). Takovéto
166 algoritmy se nazývají {\I 2-aproximaèní}, kdy¾ øe¹ení je maximálnì dvojnásobné
167 od~optimálního.\foot{Hezkým trikem se v obecných metrických prostorech umí
168 $1{,}5$-aproximace. Ve~nìkterých metrických prostorech (tøeba v euklidovské
169 rovinì) se aproximaèní pomìr dá dokonce srazit na
170 libovolnì blízko k 1. Zaplatíme ale na èase -- èím pøesnìj¹í výsledek
171 po algoritmu chceme, tím déle to bude trvat.}
172
173 \>{\I b) bez~trojúhelníkové nerovnosti:}
174
175 Zde se budeme naopak sna¾it ukázat, ¾e ¾ádný polynomiální aproximaèní
176 algoritmus neexistuje.
177
178 \s{Vìta:} Pokud pro~libovolné~$\varepsilon>0$ existuje polynomiální
179 $(1+\varepsilon)$-aproximaèní algoritmus pro~problém obchodního cestujícího bez~trojúhelníkové nerovnosti, tak ${\rm P = NP }$.
180
181 \proof Uká¾eme, ¾e v~takovém pøípadì doká¾eme v~polynomiálním èase zjistit,
182 zda v grafu existuje hamiltonovská kru¾nice.
183
184 \>Dostali jsme graf~$G$, ve~kterém hledáme hamiltonovskou kru¾nici. Doplníme
185 $G$ na~úplný graf~$G'$ a~váhy hran~$G'$ nastavíme takto:
186 \itemize\ibull
187 \: $w(e) = 1$, kdy¾ $e \in E(G)$
188 \: $w(e) = c \gg 1$, kdy¾ $e \not\in E(G)$
189 \endlist
190 \>Konstantu $c$ potøebujeme zvolit tak velkou, abychom jasnì poznali, jestli
191 je ka¾dá hrana z nalezené hamiltonovské kru¾nice hranou grafu $G$ (pokud by
192 nebyla, bude kru¾nice obsahovat aspoò jednu hranu s váhou $c$, která vy¾ene
193 souèet poznatelnì vysoko). Pokud existuje hamiltonovská kru¾nice v~$G'$ slo¾ená jen
194 z~hran, které byly
195 pùvodnì v~$G$, pak optimální øe¹ení bude mít váhu~$n$, jinak bude urèitì
196 minimálnì $n-1+c$. Kdy¾ máme aproximaèní algoritmus s~pomìrem~$1+\varepsilon$,
197 musí tedy být
198 $$
199 \eqalign{
200 (1+\varepsilon)\cdot n &< n-1+c \cr
201 \varepsilon n+1 &< c
202 }
203 $$
204 \>Kdyby takový algoritmus existoval, máme polynomiální algoritmus
205 na~hamiltonovskou kru¾nici.
206 \qed
207
208 \s{Poznámka:} O existenci pseudopolynomiálního algoritmu
209 platí analogická vìta, a doká¾e se analogicky -- existující hrany budou
210 mít váhu 1, neexistující váhu 2.
211
212 \h{Aproximaèní schéma pro problém batohu}
213
214 Ji¾ víme, jak optimalizaèní verzi problému batohu vyøe¹it v~èase $\O(nC)$,
215 pokud jsou hmotnosti i ceny na~vstupu pøirozená èísla a $C$ je souèet v¹ech cen.
216 Jak si poradit, pokud je~$C$ obrovské? Kdybychom mìli ¹tìstí a v¹echny
217 ceny byly dìlitelné nìjakým èíslem~$p$, mohli bychom je tímto èíslem
218 vydìlit. Tím bychom dostali zadání s~men¹ími èísly, jeho¾ øe¹ením by byla
219 stejná mno¾ina pøedmìtù jako u~zadání pùvodního.
220
221 Kdy¾ nám ¹tìstí pøát nebude, mù¾eme pøesto zkusit ceny vydìlit a výsledky
222 nìjak zaokrouhlit. Øe¹ení nové úlohy pak sice nebude pøesnì odpovídat optimálnímu
223 øe¹ení té pùvodní, ale kdy¾ nastavíme parametry správnì, bude alespoò jeho dobrou aproximací.
224
225 \s{Základní my¹lenka:}
226
227 Oznaèíme si $c_{max}$ maximum z~cen~$c_i$. Zvolíme si nìjaké pøirozené èíslo~$M < c_{max}$
228 a zobrazíme interval cen $[0, c_{max}]$ na $[0,M]$ (tedy ka¾dou cenu znásobíme
229 $M/c_{max}$).
230 Jak jsme tím zkreslili výsledek? V¹imnìme si, ¾e efekt je stejný, jako kdybychom jednotlivé
231 ceny zaokrouhlili na~násobky èísla $c_{max}/M$ (prvky z intervalu
232 $[i\cdot c_{max}/M,(i+1)\cdot c_{max}/M)$ se zobrazí na stejný prvek). Ka¾dé $c_i$ jsme tím
233 tedy zmìnili o~nejvý¹e $c_{max}/M$, celkovou cenu libovolné podmno¾iny pøedmìtù pak
234 nejvý¹e o~$n\cdot c_{max}/M$. Teï si je¹tì v¹imnìme, ¾e pokud ze~zadání odstraníme
235 pøedmìty, které se samy nevejdou do~batohu, má optimální øe¹ení pùvodní úlohy cenu $OPT\ge c_{max}$,
236 tak¾e chyba v~souètu je nejvý¹e $n\cdot OPT/M$. Má-li tato chyba být shora omezena
237 $\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.}
238
239 \s{Algoritmus:}
240 \algo
241 \:Odstraníme ze~vstupu v¹echny pøedmìty tì¾¹í ne¾~$H$.
242 \:Spoèítáme $c_{max}=\max_i c_i$ a zvolíme $M=\lceil n/\varepsilon\rceil$.
243 \:Kvantujeme ceny: $\forall i: \hat{c}_i \leftarrow \lfloor c_i \cdot M/c_{max} \rfloor$.
244 \:Vyøe¹íme dynamickým programováním problém batohu pro upravené ceny $\hat{c}_1, \ldots, \hat{c}_n$
245 a pùvodní hmotnosti i kapacitu batohu.
246 \:Vybereme stejné pøedmìty, jaké pou¾ilo optimální øe¹ení kvantovaného zadání.
247 \endalgo
248
249 \>Kroky 1--3 a 5 jistì zvládneme v~èase $\O(n)$. Krok~4 øe¹í problém batohu
250 se souètem cen $\hat{C}\le nM = \O(n^2/\varepsilon)$, co¾ stihne v~èase $\O(n\hat{C})=\O(n^3/\varepsilon)$.
251 Zbývá dokázat, ¾e výsledek na¹eho algoritmu má opravdu relativní chybu nejvý¹e~$\varepsilon$.
252
253 Nejprve si rozmyslíme, jakou cenu budou mít pøedmìty které daly optimální øe¹ení
254 v pùvodním zadání (tedy mají v pùvodním zadání dohromady cenu $OPT$),
255 kdy¾ jejich ceny nakvantujeme (mno¾inu indexù tìchto pøedmìtù si oznaèíme~$Y$):
256 $$
257 \eqalign{
258 \widehat{OPT} &= \sum_{i\in Y} \hat{c}_i =
259 \sum_i \left\lfloor c_i\cdot {M\over c_{max}} \right\rfloor \ge
260 \sum_i \left( c_i\cdot {M\over c_{max}} - 1 \right) \ge \cr
261 &\ge
262 \biggl(\sum_i c_i \cdot {M\over c_{max}}\biggr) - n =
263 OPT \cdot {M\over c_{max}} - n.
264 }
265 $$
266 Nyní spoèítejme, jak dopadne optimální øe¹ení~$Q$ nakvantovaného problému pøi pøepoètu
267 na~pùvodní ceny (to je výsledek na¹eho algoritmu):
268 $$
269 \eqalign{
270 ALG &= \sum_{i\in Q} c_i \ge
271 \sum_i \hat{c}_i \cdot {c_{max}\over M} =
272 \biggl(\sum_i \hat{c}_i\biggr) \cdot {c_{max}\over M} \ge^*
273 \widehat{OPT} \cdot {c_{max}\over M}.
274 }
275 $$
276 Nerovnost $\ge^*$ platí proto, ¾e $\sum_{i\in Q} \hat{c}_i$ je optimální øe¹ení
277 kvantované úlohy, zatímco $\sum_{i\in Y} \hat{c}_i$ je nìjaké dal¹í øe¹ení té¾e úlohy,
278 které nemù¾e být lep¹í. Teï u¾ staèí slo¾it obì nerovnosti a dosadit za~$M$:
279 $$
280 \eqalign{
281 ALG &\ge \biggl( { OPT \cdot M\over c_{max}} - n\biggr) \cdot {c_{max}\over M} \ge
282 OPT - {n\cdot c_{max}\over n / \varepsilon} \ge OPT - \varepsilon c_{max} \ge \cr
283 &\ge OPT - \varepsilon OPT = (1-\varepsilon)\cdot OPT.
284 }
285 $$
286 Algoritmus tedy v¾dy vydá øe¹ení, které je nejvý¹e $(1-\varepsilon)$-krát hor¹í ne¾ optimum,
287 a~doká¾e to pro libovolné~$\varepsilon$ v~èase polynomiálním v~$n$. Takovému algoritmu øíkáme
288 {\I polynomiální aproximaèní schéma} (jinak té¾ PTAS\foot{Polynomial-Time Approximation Scheme}).
289 V~na¹em pøípadì je dokonce slo¾itost polynomiální i v~závislosti na~$1/\varepsilon$, tak¾e
290 schéma je {\I plnì polynomiální} (øeèené té¾ FPTAS\foot{Fully Polynomial-Time Approximation
291 Scheme}). U nìkterých problémù se stává, ¾e aproximaèní schéma závisí na
292 $1/\varepsilon$ exponenciálnì, co¾ tak pøíjemné není. Shròme, co jsme zjistili, do následující vìty:
293
294 \s{Vìta:}
295 Existuje algoritmus, který pro ka¾dé $\varepsilon > 0$ nalezne
296 {\I $(1 - \varepsilon)$-aproximaci} problému batohu s $n$ pøedmìty v èase
297 $\O(n^3/\varepsilon)$.
298
299 \bye