From: Martin Mares Date: Sun, 15 Jan 2012 12:58:08 +0000 (+0100) Subject: APX: Barveni intervalovych grafu X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=43ae754253889ae5e9df815123fc6b2f0cb90496;p=ads2.git APX: Barveni intervalovych grafu --- diff --git a/9-apx/9-apx.tex b/9-apx/9-apx.tex index 960766d..d8f3f49 100644 --- a/9-apx/9-apx.tex +++ b/9-apx/9-apx.tex @@ -44,7 +44,7 @@ po \h{Nejvìt¹í nezávislá mno¾ina ve stromu} -Uká¾eme, ¾e hledání nejvìt¹í nezávislé mno¾iny je pro stromy velmi snadné. +Uká¾eme, ¾e hledání nejvìt¹í nezávislé mno¾iny je snadné, pokud graf je strom. \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$. @@ -81,23 +81,64 @@ obdr \h{Barvení intervalového grafu} -FIXME +Mìjme~$n$ pøedná¹ek s~urèenými èasy zaèátku a konce. Chceme je rozvrhnout +do co~nejmen¹ího poètu poslucháren tak, aby nikdy neprobíhaly dvì pøedná¹ky +naráz v~jedné místnosti. + +Chceme tedy obarvit co nejmen¹ím poètem barev graf, jeho¾ vrcholy jsou èasové +intervaly a dvojice intervalù je spojena hranou, pokud má neprázdný prùnik. +Takovým grafùm se øíká {\I intervalové} a pro jejich barvení existuje pìkný +polynomiální algoritmus. + +Podobnì jako jsme geometrické problémy øe¹ili zametáním roviny, zde budeme +\uv{zametat pøímku bodem}, tedy procházet ji zleva doprava, a~v¹ímat si +událostí, co¾ budou zaèátky a konce intervalù. Pro jednoduchost pøedpokládejme, +¾e v¹echny souøadnice zaèátkù a koncù jsou navzájem rùzné. + +Kdykoliv interval zaène, pøidìlíme mu barvu. A¾ skonèí, o~barvì si poznamenáme, +¾e je momentálnì volná, a~dal¹ím intervalùm budeme pøednostnì pøidìlovat +volné barvy. Øeèeno v~pseudokódu: + +\algo +\algin Intervaly $\left[ x_1, y_1 \right], \ldots, \left[ x_n, y_n \right]$. +\:$b \= 0$ \cmt{poèet zatím pou¾itých barev} +\:$B \= \emptyset$ \cmt{které barvy jsou momentálnì volné} +\:Setøídíme mno¾inu v¹ech $x_i$ a $y_i$. +\:Procházíme v¹echna $x_i$ a $y_i$ ve~vzestupném poøadí: +\::Narazíme-li na $x_i$: +\:::Je-li $B\ne\emptyset$, odebereme jednu barvu z~$B$ a ulo¾íme ji do~$c_i$. +\:::Jinak $b\=b+1$ a $c_i\=b$. +\::Narazíme-li na $y_i$: +\:::Vrátíme barvu $c_i$ do~$B$. +\algout Obarvení $c_1,\ldots,c_n$. +\endalgo + +\s{Analýza:} +Tento algoritmus má èasovou slo¾itost $\O(n\log n)$ kvùli tøídìní souøadnic. +Samotné obarvování je lineární. + +Je¹tì ov¹em potøebujeme dokázat, ¾e jsme pou¾ili minimální mo¾ný poèet barev. +Uva¾ujme okam¾ik, kdy promìnná~$b$ naposledy vzroste. Tehdy zaèal interval +a mno¾ina~$B$ byla prázdná, co¾ znamená, ¾e jsme $b-1$ pøedchozích barev museli +pøidìlit intervalùm, je¾ zaèaly a dosud neskonèily. Existuje tedy $b$ rùzných +intervalù, které mají spoleèný bod (v~grafu tvoøí kliku), tak¾e ka¾dé obarvení +potøebuje alespoò~$b$ barev. \h{Problém batohu s~malými èísly} -\>Je daná mno¾ina $n$~pøedmìtù s~hmotnostmi $h_1,\ldots,h_n$ +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: +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$ +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 @@ -112,18 +153,18 @@ $$ 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. +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, +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¹í +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é @@ -150,7 +191,7 @@ je ohodnocen \>{\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 +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 @@ -205,13 +246,14 @@ $(1+\varepsilon)$-aproxima \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 +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 + +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 @@ -225,7 +267,7 @@ $$ \varepsilon n+1 &< c } $$ -\>Kdyby takový algoritmus existoval, máme polynomiální algoritmus +Kdyby takový algoritmus existoval, máme polynomiální algoritmus na~hamiltonovskou kru¾nici. \qed