Po čtyřech TSP lekcích střih: dnešní důkaz je maximalizační — jediný v kapitole. V [L3.1] jsme definici r-aproximace pro maximalizaci citovali přesně z dnešního slidu 6 a slíbili, že vzor „horní mez $B \ge J^*$ a $J^A \ge B/2$“ uvidíš v akci. Je to krátký důkaz za jisté body: u zkoušky doložen 24. 5. 2011 („2-aproximační algoritmus pro Knapsack“) a v testech z přednášky 2014/2015 chodil v jedné sadě s Bratleym a Christofidesem [L3.10].
Knapsack problem (problém batohu) znáš modelově: binární rozhodnutí „vzít / nevzít“ [L0.8]. Slide 3 (EN 1:1):
Instance: Nonnegative integers $n, c_1, \ldots, c_n, w_1, \ldots, w_n, W$, where $n$ represents the number of items, $c_1, \ldots, c_n$ represents the cost of each item, $w_1, \ldots, w_n$ represents the weight of each item and $W$ is the maximum weight to be carried in the knapsack.
Goal: Find a subset $S \subseteq \{1, \ldots, n\}$ such that $\sum_{j \in S} w_j \le W$ and $\sum_{j \in S} c_j$ is the maximum.
It is one of the “easiest” NP-hard problems. Sometimes it is called 0/1 Knapsack problem.
„Easiest NP-hard“ není básnická licence: batoh není silně NP-těžký [L3.5] — má pseudopolynomiální DP (propočítáš v [L7.1]) a dokonce aproximační schéma. Dnešní 2-aproximace je nejhrubší a nejrychlejší stupeň té škály.
Tou s největším poměrem $c_j/w_j$ — cenou za kilogram. Když se dá řezat, nezáleží na tom, jak se položky „skládají“ do zbylé kapacity (žádné kombinatorické přemýšlení o dírách): každé kilo kapacity prostě obsadíš nejdražším dostupným kilem. Přesně tahle relaxace dělá z NP-těžkého problému snadný.
Formálně povolíme zlomky — z binární proměnné [L0.8] se stane spojitá. Slide 4 (EN 1:1):
While relaxing on the indivisibility of each item, we formulate a new problem:
Instance: stejná jako výše.
Goal: Find the rational numbers $x_1, \ldots, x_j, \ldots, x_n$ such that $0 \le x_j \le 1$ and $\sum_{j=1}^{n} x_j \cdot w_j \le W$ and $\sum_{j=1}^{n} x_j \cdot c_j$ is the maximum.
Since the items can be divided (continuous variable $x_j$), we can solve this problem in polynomial time.
Jednu drobnost si podtrhni hned: každé 0/1 řešení je přípustné i frakčně (jedničky a nuly splňují $0 \le x_j \le 1$). Označíme-li $J^*_F$ optimum frakčního batohu (vlastní značení, slidy ho nepojmenovávají), platí $J^*_F \ge J^*$. Za chvíli z toho bude horní mez.
Položka $h$ — první, která se celá nevejde — je hlavní postava celé lekce. Zapamatuj si ji.
Vezmi libovolné přípustné frakční řešení $x$, které se od greedy řešení liší. Protože $\sum w_j > W$, můžeme předpokládat, že $x$ využívá celou kapacitu $W$ (doplnění nikdy neuškodí, ceny jsou nezáporné). Pak ale existuje dvojice indexů $i < j$ (tedy $c_i/w_i \ge c_j/w_j$), kde $x_i < 1$ a $x_j > 0$: lepší položka není plná, a přesto vezeme kus horší. Výměna: přesuň malé množství váhy $\varepsilon > 0$ z položky $j$ na položku $i$ — přípustnost se nezmění (celková váha zůstává) a cena se změní o $\varepsilon\,(c_i/w_i - c_j/w_j) \ge 0$, takže se nezhorší. Opakováním výměn převedeš $x$ na greedy tvar (plný prefix + jeden řez + nuly) beze ztráty ceny ⇒ greedy řešení je optimální. (Vlastní rozepsání — slide optimalitu jen konstatuje.)
Celý běh na příkladu ze slidu 6 — $c = (6, 20, 2)$, $w = (2, 10, 8)$, $W = 10$:
Teď zpátky k nedělitelnému batohu. Z [L3.1] víš, jak se dokazuje faktor u maximalizace: potřebuješ vypočitatelnou horní mez $B \ge J^*$ a pak ukázat $J^A \ge B/r$. Otázka za celou lekci: kde vzít $B$?
Krok 1 (relaxace): každé 0/1 řešení je přípustné i frakčně, takže $J^* \le J^*_F$. Krok 2 (tvar frakčního optima): Dantzig říká přesně, kolik $J^*_F$ je — plný prefix plus kus položky $h$: $J^*_F = \sum_{i=1}^{h-1} c_i + x_h c_h$. A protože $x_h \le 1$, je to nanejvýš $\sum_{i=1}^{h} c_i$. Dohromady:
$$J^* \;\le\; J^*_F \;=\; \sum_{i=1}^{h-1} c_i + x_h c_h \;\le\; \sum_{i=1}^{h} c_i.$$Tohle je mez $B = \sum_{i=1}^{h} c_i$ — spočítáš ji v $\mathcal{O}(n)$, optimum znát nemusíš. Proto jsme se učili frakční batoh: je to stroj na horní mez. Na příkladu: $J^* = 20 \le J^*_F = 22 \le B = 26$.
Mez máme. Zbývá najít přípustné 0/1 řešení, které z ní vytěží aspoň polovinu. První nápad zní: „vezmi všechno, co se vešlo celé“, tedy prefix $\{1, \dots, h-1\}$.
$c = (2, 100)$, $w = (1, 100)$, $W = 100$. Poměry $2 \ge 1$ — seřazeno. Kumulativní váhy $1$, $101 > 100$ ⇒ $h = 2$. Prefix $\{1\}$ má cenu 2, ale $J^* = 100$ (vzít položku 2). Nafouknutím (100 → libovolné $W$) je poměr $J^A/J^*$ libovolně blízko nule — prefix sám není aproximační algoritmus, stejná diagnóza jako u nearest neighbor v [L3.1] T02. Všimni si, kdo za to může: skoro celá hodnota meze $B$ sedí v ceně $c_h$ uříznuté položky.
Ne. Deset položek s $c_j = 1$, $w_j = 1$, plus jedenáctá s $c_{11} = 2$, $w_{11} = 10$; $W = 10$. Poměry $1 \ge \dots \ge 1 \ge 0{,}2$. Prvních deset váží přesně $10 = W$ (to ještě není „přes“), takže $h = 11$. Kandidát $\{h\}$ má cenu 2, ale prefix $\{1,\dots,10\}$ má cenu $10 = J^*$. Tentokrát hodnota meze sedí v prefixu. Pointa: každý kandidát sám o sobě selhává — ale ceny obou v součtu dají $\sum_{i=1}^{h-1} c_i + c_h = B \ge J^*$. Dvě čísla se součtem $\ge J^*$ nemohou být obě menší než $J^*/2$…
A to je celý algoritmus. Slide 6 (EN 1:1) — definici r-aproximace pro maximalizaci už znáš z [L3.1], slide ji opakuje:
r-approximation algorithm for maximization: Algorithm $A$ for objective function $J$ maximization is called $r$-approximation if there exists a number $r \ge 1$ such that $J^A(I) \ge \frac{1}{r} J^*(I)$ for all instances $I$ of this problem.
Theorem. Let $n, c_1, \ldots, c_n, w_1, \ldots, w_n, W, h$ are nonnegative integers that satisfy:
Then choosing the better of the two solutions $\{1, \ldots, h-1\}$ or $\{h\}$ is 2-approximation alg. for the Knapsack with the time complexity $\mathcal{O}(n)$.
Example: $c = (6, 20, 2)$, $w = (2, 10, 8)$, $W = 10$.
Pro libovolná čísla $a, b \ge 0$ platí $\max\{a, b\} \ge \frac{a+b}{2}$ (větší z dvojice je aspoň průměr). Dosaď $a = \sum_{i=1}^{h-1} c_i$ (cena prefixu) a $b = c_h$:
$$J^A(I) \;=\; \max\Big\{ \sum_{i=1}^{h-1} c_i,\; c_h \Big\} \;\ge\; \frac{\sum_{i=1}^{h-1} c_i + c_h}{2} \;=\; \frac{\sum_{i=1}^{h} c_i}{2} \;\ge\; \frac{J^*(I)}{2}.$$To je přesně $J^A \ge \frac{1}{r} J^*$ s $r = 2$ — podle definice z [L3.1] je výběr lepšího z obou kandidátů 2-aproximační algoritmus. Oba kandidáti jsou přípustní: prefix váží $\sum_{i=1}^{h-1} w_i \le W$ (z definice $h$) a $\{h\}$ váží $w_h \le W$ (první předpoklad věty!).
Slide 7 (EN 1:1) říká totéž — všimni si, jak první dvě odrážky „splácejí“ předpoklady věty:
Drobnost k poctivosti (vlastní komentář): ostrá nerovnost na konci platí, když $c_h > 0$ (pak $J^*_F = \sum_{i=1}^{h-1} c_i + x_h c_h$ je díky $x_h < 1$ ostře pod mezí $B$); pro faktor 2 každopádně stačí neostré $\ge \tfrac12 J^*$. A k složitosti: $\mathcal{O}(n)$ ve větě je za seřazené položky (řazení je v předpokladech) — kompletní postup od syrového vstupu stojí $\mathcal{O}(n \log n)$ za sort, jako Dantzig.
Běh na příkladu ze slidu 6 (pokračování frakčního stepperu):
$w_j \le W$: přípustnost kandidáta $\{h\}$ — bez ní by $\max$ porovnával s nepřípustným řešením a celý důkaz padá; proto proof začíná vyhozením těžkých položek (těch se nedotkne ani optimum, vyhodit je smíme). $\sum_i w_i > W$: existence $h$ — jinak se vejde všechno a vracíš celou množinu, což je optimum (druhá odrážka proofu). Seřazení: bez něj „prefix“ a $h$ nic neznamenají — horní mez $B \ge J^*$ stojí na Dantzigově optimalitě, a ta na pořadí podle $c/w$. Nezápornost: ve výměnném argumentu (doplňování kapacity neuškodí) a v $\max\{a,b\} \ge \frac{a+b}{2}$ pro $a, b \ge 0$. Srovnej s TSP důkazy [L3.9]/[L3.10]: tam inventura hlídala metriku, tady hlídá přípustnost kandidátů.
2-aproximace není u batohu konec, ale začátek: slide 12 ji používá jako krok 1 aproximačního schématu (FPTAS) — její výstup $c(S_1)$ kalibruje zaokrouhlení cen a horní mez DP tabulky, výsledkem je $(1+\epsilon)$-aproximace v $\mathcal{O}(n^2 \cdot \frac{1}{\epsilon})$ pro libovolně malé $\epsilon$. Detaily ve volitelné [L7.2]; samotnou DP tabulku (přesné řešení, pseudopolynomiálně) propočítáš v [L7.1]. Pro 15. 6. je jádro dnešek: mez + dva kandidáti + $\max$.
State the greedy algorithm for the fractional knapsack problem, explain why sorting by $c_j/w_j$ is optimal, and give the time complexity.
Tři podúkoly: (1) vyslovit Dantzigův algoritmus (seřazení, $h$, řez), (2) zdůvodnit optimalitu greedy pořadí — to je jediná „důkazová“ část, slidy ji nerozepisují, (3) složitost. Typická ústní opora ke 2-aproximaci: kdo neumí frakční batoh, nemá z čeho vyrobit horní mez.
Algoritmus odvyprávěj přes tři role: seřazení (cena za kilogram), plný prefix, řez položky $h$. U optimality nehledej indukci — hledej výměnu: „kdyby optimum vezlo kus horší položky, zatímco lepší není plná…“. U složitosti rozliš sort a lineární průchod.
Algoritmus. Pokud $\sum_{j=1}^n w_j \le W$, vrať $x_j = 1$ pro všechna $j$ (triviální případ). Jinak seřaď a přeindexuj položky podle relativní ceny $\frac{c_1}{w_1} \ge \frac{c_2}{w_2} \ge \dots \ge \frac{c_n}{w_n}$, najdi první nevejdoucí položku $h := \min\{ j : \sum_{i=1}^{j} w_i > W \}$ a polož $x_j := 1$ pro $j = 1, \dots, h-1$; $x_h := \frac{W - \sum_{i=1}^{h-1} w_i}{w_h}$; $x_j := 0$ pro $j > h$.
Proč je seřazení podle $c_j/w_j$ optimální (výměnný argument, vlastní). Poměr $c_j/w_j$ je cena za jednotku váhy. Vezmi optimální frakční řešení $x^*$; protože $\sum w_j > W$ a ceny jsou nezáporné, lze předpokládat $\sum_j x^*_j w_j = W$. Kdyby $x^*$ nemělo greedy tvar, existují $i < j$ s $x^*_i < 1$ a $x^*_j > 0$. Přesun váhy $\varepsilon > 0$ z $j$ na $i$ zachová přípustnost a změní cenu o $\varepsilon(c_i/w_i - c_j/w_j) \ge 0$ — nezhorší ji. Konečně mnoha výměnami dostaneme greedy řešení se stejnou nebo vyšší cenou ⇒ greedy je optimální. (Intuice: každé kilo kapacity má nést co nejdražší kilo nákladu; řezání to dovolí bez kombinatorických ohledů.)
Složitost. Sort $\mathcal{O}(n \log n)$; nalezení $h$ a dopočet $x$ lineární skenování $\mathcal{O}(n)$ — celkem $\mathcal{O}(n \log n)$. Slide dodává: redukcí na Weighted Median problem to jde i v $\mathcal{O}(n)$ ([1] str. 440).
Ilustrace (instance ze slidu 6): $c = (6,20,2)$, $w = (2,10,8)$, $W = 10$; poměry $3 \ge 2 \ge 0{,}25$, $h = 2$, $x = (1;\, 0{,}8;\, 0)$, $J^*_F = 6 + 0{,}8 \cdot 20 = 22$.
The source theorem assumes nonnegative integers $n, c_1, \ldots, c_n, w_1, \ldots, w_n, W, h$ satisfying
$$w_j \le W \quad j = 1, \ldots, n,$$ $$\sum_{i=1}^{n} w_i > W,$$ $$\frac{c_1}{w_1} \ge \frac{c_2}{w_2} \ge \cdots \ge \frac{c_n}{w_n},$$ $$h = \min \left\{ j \in \{1, \ldots, n\} : \sum_{i=1}^{j} w_i > W \right\}.$$Then choosing the better of the two solutions $\{1, \ldots, h-1\}$ and $\{h\}$ is a 2-approximation algorithm for the knapsack problem with time complexity $\mathcal{O}(n)$.
Study task: Prove the theorem. In particular, show why $\sum_{i=1}^{h} c_i$ is an upper bound on the optimum value and why the better of the two candidate solutions achieves at least half of this upper bound.
Hlavní úloha lekce — maximalizační obdoba TSP důkazů: věta je darovaná, tvoje práce je důkaz se dvěma jádry, která zadání výslovně jmenuje: (1) proč je $\sum_{i=1}^{h} c_i$ horní mez $J^*$ (přes frakční relaxaci) a (2) proč lepší z kandidátů dosáhne aspoň poloviny ($\max \ge$ průměr). K tomu patří přípustnost obou kandidátů a role předpokladů.
Piš ve třech blocích. Blok 0 — předpoklady: proč smíme předpokládat $w_j \le W$ a $\sum w_i > W$ (první dvě odrážky slidu 7: těžké položky vyhoď, jinak vrať vše). Blok 1 — mez: řetízek $J^* \le J^*_F \le \sum_{i=1}^{h} c_i$; nezapomeň říct, odkud znáš $J^*_F$ (Dantzig). Blok 2 — polovina: přípustnost obou kandidátů (tady se použije $w_h \le W$!) a $\max\{a,b\} \ge \frac{a+b}{2}$. Nakonec jedna věta o složitosti.
0) Příprava instance. Položky s $w_j > W$ nemohou být v žádném přípustném řešení (ani v optimu) — vyhodíme je, tím zajistíme první předpoklad. Pokud po vyčištění $\sum_{i=1}^{n} w_i \le W$, je celá množina položek přípustná, a protože ceny jsou nezáporné, je optimální — vrátíme ji a jsme hotovi. Jinak platí $\sum_i w_i > W$, položky seřadíme podle $c_j/w_j$ a index $h$ (první nevejdoucí položka) existuje.
1) $\sum_{i=1}^{h} c_i$ je horní mez optima. Každé přípustné 0/1 řešení je přípustné i pro frakční batoh ($x_j \in \{0,1\}$ splňuje $0 \le x_j \le 1$), takže $J^* \le J^*_F$. Frakční optimum známe přesně z Dantzigova algoritmu (T01): $J^*_F = \sum_{i=1}^{h-1} c_i + x_h c_h$ s $x_h = \frac{W - \sum_{i<h} w_i}{w_h} \in [0, 1)$. Tedy
$$J^* \;\le\; J^*_F \;=\; \sum_{i=1}^{h-1} c_i + x_h c_h \;\le\; \sum_{i=1}^{h-1} c_i + c_h \;=\; \sum_{i=1}^{h} c_i.$$2) Lepší kandidát dosáhne aspoň poloviny meze. Oba kandidáti jsou přípustní: prefix $\{1, \dots, h-1\}$ váží $\sum_{i=1}^{h-1} w_i \le W$ (z definice $h$ jako prvního nevejdoucího indexu) a $\{h\}$ váží $w_h \le W$ (předpoklad věty — proto se těžké položky vyhazovaly). Pro nezáporná čísla platí $\max\{a, b\} \ge \frac{a+b}{2}$, tedy
$$J^A(I) = \max\Big\{ \sum_{i=1}^{h-1} c_i,\; c_h \Big\} \;\ge\; \frac{\sum_{i=1}^{h} c_i}{2} \;\ge\; \frac{1}{2} J^*(I).$$(Slide píše na konci ostrou nerovnost — platí pro $c_h > 0$, kdy $x_h c_h < c_h$; pro faktor stačí $\ge$.) Podle definice r-aproximace pro maximalizaci je algoritmus 2-aproximační.
3) Složitost. Nad seřazenými položkami jeden lineární průchod (nalezení $h$, dva součty, $\max$): $\mathcal{O}(n)$, jak tvrdí věta; od syrového vstupu $\mathcal{O}(n \log n)$ kvůli řazení. $\blacksquare$
Kontrola na příkladu slidu 6: $c=(6,20,2)$, $w=(2,10,8)$, $W=10$: $h=2$, kandidáti $\{1\}$ za 6 a $\{2\}$ za 20 → $J^A = 20$; mez $B = 26$, $20 \ge 13 = B/2$; enumerací $J^* = 20$ — zde dokonce optimum.