There are exactly two cars of each type somewhere in the line.
The aim is to color one of these two cars red and the other blue.
It is hard to change the current color in the paint shop
It is expensive to switch the current color in the paint shop
so for a given sequence of cars we would like to minimize the number of color changes.
Input of the task are types of cars in the line and output is the coloring of theses cars.
This task is known to be NP-hard, and under specific conditions, it defies polynomial time approximations.
Therefore, it is a good idea to find some algorithms which behave well on randomly generated input.
In this thesis is introduced new algorithm based on semidefinite programming
which considered to madden test on random inputs reach solutions near to 0.34 times number of car types.
Therefore, it is a good idea to find some algorithms which behave well on a randomly generated input.
This thesis introduces an algorithm based on semidefinite programming. Experiments on random inputs show it reaches solutions near to 0.34 times the number of car types.
We proved that for each input this algorithm returns a solution with expected deviation from optimum of at most 0.212 times the number of car types.
V řadě je $2n$ aut $n$ různých typů -- od každého typu dvě.
Chtěli bychom od každého typu nabarvit jedno auto červeně a druhé modře.
Auta však na barvicí linku vjíždí v pořadí, v jakém jsou v řadě.
Barvící linka je optimalizovaná na barvení velkého počtu aut jednou barvou.
Barvicí linka je optimalizovaná na barvení velkého počtu aut jednou barvou.
Tedy měnit barvu, kterou se barví, je složitá a drahá záležitost.
Chceme tedy nají obarvení aut tak, aby od každého typu bylo jedno červené a jedno modré, přitom počet změn barev v řadě byl co nejmenší.
Chceme tedy najít obarvení aut tak, aby od každého typu bylo jedno červené a jedno modré, přitom počet změn barev v řadě byl co nejmenší.
:::
Počet změn barev řešení považujeme za skóre algoritmu.
Relativní skóre pak je poměr skóre a počtu typů aut.
Počet změn barev řešení považujeme za _skóre_ algoritmu.
_Relativní skóre_ pak je poměr skóre a počtu typů aut.
Problém můžeme chápat buď jako optimalizační problém, kde účelová funkce je počet změn v řešení a snažíme se ji minimalizovat,
nebo jako rozhodovací problém, kde se ptáme, jestli existuje řešení s nejvýše nějakým zadaným počtem změn.
...
...
@@ -126,13 +119,13 @@ Dále se pokusíme porovnat již známé algoritmy.
Struktura práce
---------------
Nejprve si zavedeme notaci potřebnou pro pohodlnou práci s BPS
a definujeme si aproximační algoritmy.
Dále následují shrnutí doposud známých algoritmů a jiných výsledků ohledně BPS.
V následující kapitole je představen princip semidefinitního programování,
které má uplatnění v algoritmu představeném o kapitolu dál.
Poslední kapitola se věnuje praktické implementaci tohoto algoritmu
a naměřeným datům o něm.
Nejprve zavedeme notaci potřebnou pro pohodlnou práci s BPS
a definujeme aproximační algoritmy.
Kapitola 2 obsahuje shrnutí doposud známých algoritmů a jiných výsledků ohledně BPS.
V kapitole 3 je představen princip semidefinitního programování,
které má uplatnění v algoritmu představeném o kapitole 4.
Kapitola 5 se věnuje praktické implementacím algoritmů
a naměřeným datům o nich.
Notace
------
...
...
@@ -172,14 +165,14 @@ stejně jako u variant s algoritmem, jen skóre daného algoritmu nahradíme za
Definice aproximačních algoritmů
--------------------------------
Protože ne na všechny problémy známe polynomiální algoritmus, co je schopný je vyřešit,
Protože ne pro všechny problémy známe polynomiální algoritmus, který je schopný je vyřešit,
zajímavý výsledek může být, i když se k řešení zvládneme jen v nějakém smyslu alespoň přiblížit.
Na to nejprve musíme říct, co pro nás znamená, že nějaké řešení je několikrát horší než jiné. To nám poskytne obecná definice optimalizačního problému.
::: {c=box t=def name="Optimalizační problém"}
Problém je _optimalizační_, pokud pro každý vstup $I$, existuje množina
přípustných řešení $F(I)$.
Dále existuje účelová funkce$f$, která pro každý vstup a jeho přípustné řešení určuje reálné nezáporné číslo -- jeho hodnotu.
Dále existuje účelová funkce$f$, která pro každý vstup a jeho přípustné řešení určuje reálné nezáporné číslo -- jeho hodnotu.
Pokud se jedná o minimalizační problém, tak pod pojmem _optimum_ daného vstupu (značíme $\opt(I)$) myslíme infimum hodnot účelové funkce přes všechna přípustná řešení, tedy $\inf f[F(i)]$.
Pro maximalizační problém analogicky použijeme supremum.
...
...
@@ -198,9 +191,9 @@ aproximace, kde $g(n)$ je konstantní funkce rovna $c$.
U maximalizačních problémů je drobný problém v terminologii,
protože není shoda na tom, jestli má platit
$f(A(I)) \ge g(|I|) \cdot \opt(I)$
$f(\alg(I)) \ge g(|I|) \cdot \opt(I)$
nebo
$f(A(I)) \ge {1\over g(|I|)} \cdot \opt(I)$.
$f(\alg(I)) \ge {1\over g(|I|)} \cdot \opt(I)$.
Naštěstí podle kontextu jde snadno rozhodnout, která definice se používá,
protože je potřeba násobit optimum číslem menším rovno jedné (jinak by pro
kladné hodnoty účelové funkce nemohl existovat žádný vyhovující algoritmus).
...
...
@@ -223,14 +216,14 @@ Navíc chceme, aby všechna přípustná řešení měla omezenou délku nějak
Snadno nahlédneme, že za takovýchto podmínek je rozhodovací verze,
jestli je optimum alespoň zadané číslo, v $\NP$.
Pro takovou úlohu většinou hledáme polynomiální aproximační algoritmus.
Binární paint shop vyhovuje všem těchto podmínkám.
Binární paint shop vyhovuje všem těmto podmínkám.
Pokud existuje $(1-\varepsilon)$-aproximační algoritmus pro každé $\varepsilon > 0$, říkáme, že máme aproximační schéma.
Pokud existuje $(1+\varepsilon)$-aproximační algoritmus pro každé $\varepsilon > 0$, říkáme, že máme aproximační schéma.
Doposud známé výsledky
======================
Bonsmaa, Epping, a Hochstättler [@apx] dokázali, že optimalizační verze BPS je $\APX$-těžký problém,
Bonsmaa, Epping a Hochstättler [@apx] dokázali, že optimalizační verze BPS je $\APX$-těžký problém,
což je silnější tvrzení, než že rozhodovací verze je $\NP$-těžká.
Za předpokladu $\P\neq \NP$ víme, že kromě polynomiálního algoritmu na rozhodovací verzi nemůže existovat
ani polynomiální aproximační schéma na optimalizační verzi.
...
...
@@ -290,14 +283,14 @@ Graf střední hodnoty rel. skóre hladového řešení $\delta_{\algo g}(n)$ v
:::
U hladového řešení je tedy střední hodnota skóre přes uniformně náhodný vstup přesně vyčíslená.
Pro nás je zejména důležité, že ji jsme schopni shora odhadnout.
Pro nás je zejména důležité, že jsme ji schopni shora odhadnout.
Střední hodnotu totiž můžeme považovat za ukazatel kvality algoritmu (čím menší je, tím se jedná o lepší algoritmus) a tedy horní odhad nám dává záruku kvality algoritmu.
Zajímavé je pro nás zkoumat chování algoritmů na velkých vstupech, tedy dává
smysl uvažovat limitu střední hodnoty do nekonečna.
Ovšem s narůstajícím počtem aut narůstá i počet potřebných změn, takže
samotná limita střední hodnoty moc nedává smysl, protože by byla nekonečná.
Místo ní budeme uvažovat $\lim_{n\to\infty} {\gamma_{\alg}(n)) / n} = \lim_{n\to\infty}\delta_{\alg}(n)$.
Místo ní budeme uvažovat $\lim_{n\to\infty} {\gamma_{\alg}(n) / n} = \lim_{n\to\infty}\delta_{\alg}(n)$.
O ní víme, že pro libovolný algoritmus (pokud existuje) bude v intervalu $[0, 2]$,
protože maximální počet změn musí být mezi $0$ a $2n-1$.
...
...
@@ -354,7 +347,7 @@ a pokud budeme přidávat auto do okolí evidované dvojice tak, že
prohození barev dané dvojice by pomohlo, prohodíme její barvy.
Budeme pracovat nad rozšířenou abecedou barev o znak "$*$" reprezentující neurčenou barvu.
Při rekurzi budeme udržovat invariant, že pro každý typ obě auta buď budou označeny $*$ a nebo ani jedno z nich nebude označeno $*$ a pak nutně budou mít různé barvy.
Při rekurzi budeme udržovat invariant, že pro každý typ obě auta buď budou označena $*$ a nebo ani jedno z nich nebude označeno $*$ a pak nutně budou mít různé barvy.
Navíc bude platit, že $*$ nikdy není na okrajích a nejsou dvě vedle sebe.
Specificky tedy na $*$ budeme přebarvovat dvojici aut v momentě, kdy získá všechny sousedy.
...
...
@@ -368,7 +361,7 @@ Ze vstupu odebereme auta typu $t_0$ a zarekurzíme se na zbytek.
Tím získáme nějaké obarvení, které může použít na původní vstup s tím,
že auta typu $t_0$ zatím nebudou obarvená, ty dobarvíme dle následujících pravidel:
A) Když $o_0 = 2$ a $n>1$ nastavíme $c(1)=c(2)$.
A) Když $o_0 = 1$ a $n>1$ nastavíme $c(1)=c(2)$.
B) Když $o_0=2n-1$ nastavíme $c(0) = 1$.
C) Když $N(o_0) = \{t,t\}$ pro nějaké $t\in\{0,1\}$, nastavíme i $c(o_0) = t$.
D) Když $N(o_0) = \{0,1\}$, nastavíme $c(0) = c(1)$.
...
...
@@ -377,7 +370,7 @@ F) Když $N(o_0) = \{c(1), *\}$, nastavíme $c(0) = c(1)$ a přenastavíme $*$ v
A druhé auto typu $t_0$ obarvíme zbývající barvou.
Pokud auta typu $t_{1}$ spolu nesousedí, $*\not\in N(1) \cap N(o_1)$
Pokud auta typu $t_{1}$ spolu nesousedí, $*\not\in N(1) \cup N(o_1)$
a prohození barev aut typu $t_1$ by zachovalo počet změn, přenastavíme jejich barvy na $*$.
Po návratu ze všech rekurzí zbylé dvojice aut $*$ přebarvíme na dvě různé barvy.
...
...
@@ -466,14 +459,14 @@ Pro nás bude důležitý následující fakt z lineární algebry:
::: {c=box t=fact}
Nechť $X \in \SYM_n$. Následující tvrzení jsou ekvivalentní definice pozitivně semidefinitní matice:
- Všechny vlastní čísla matice $X$ jsou nezáporná.
- Všechna vlastní čísla matice $X$ jsou nezáporná.
- Pro každý vektor $\vec{x} \in \R^n$ platí $\vec{x}^{\rm T} X\vec{x}\ge 0$.
- Existuje matice $Y \in \R^{n\times n}$ taková, že $X = Y^{\rm T} Y$.
:::
Pro nás bude důležitá zejména třetí podmínka,
protože navíc platí, že ze semidefinitní matice $X$ zvládneme zkonstruovat $Y$
pomocí Choleského dekompozice a to v čase $\O(n^3)$.
v čase $\O(n^3)$ pomocí tzv. Choleského dekompozice.
Navíc pro libovolnou reálnou matici $Y$ je $Y^{\rm T} Y$ symetrická.
Tedy semidefinitní programování můžeme chápat jako optimalizační úlohu na $Y\in \R^{n\times n}$.
...
...
@@ -494,7 +487,7 @@ Představíme si pravděpodobnostní aproximační algoritmus založený na semi
::: {c=box t=task}
Nechť $G=(V, E)$ je graf s hranami ohodnocenými nezápornými čísly dle $h: E \rightarrow \R^+_0$.
Řezem grafu rozumíme rozdělení vrcholů na dvě disjunktní množiny $A \cup B = V$.
Hodnotou daného řezu je pak součet cen hran vedoucích mezi$A$ a $B$. Tedy:
Hodnotou daného řezu je pak součet cen hran vedoucích mezi$A$ a $B$. Tedy:
$$
H(A,B) = \sum_{\{u,v\}\in E\atop u\in A, v\in B} h({u,v})
$$
...
...
@@ -503,7 +496,7 @@ Cílem je maximalizovat hodnotu řezu.
Problém maximálního řezu (resp. rozhodovací verze, kde se ptáme na existenci řezu alespoň dané velikosti)
je NP-úplný [@maxcut-np], proto
se u něj zkoumají aproximační algoritmy a pravděpodobností aproximační algoritmy.
se u něj zkoumají aproximační algoritmy a pravděpodobnostní aproximační algoritmy.
Nejprve si ukážeme triviální $0.5$-aproximační pravděpodobnostní algoritmus:
...
...
@@ -512,12 +505,12 @@ Každý vrchol uniformně náhodně přiřaď do množiny $A$ nebo $B$.
:::
::: {c=box t=theorem}
Triviální algoritmus je $0.5$aproximační pravděpodobnostní algoritmus.
Triviální algoritmus je $0.5$-aproximační pravděpodobnostní algoritmus.
:::
::: {c=proof}
Každá hrana bude v řezu s pravděpodobností $1/2$ -- při umisťování druhého vrcholu dané hrany
máme pravděpodobnost $1/2$, že ho umístíme do stejné množiny a tedy hrna nebude součásti řezu
máme pravděpodobnost $1/2$, že ho umístíme do stejné množiny a tedy hrana nebude součásti řezu
a pravděpodobnost $1/2$ že do opačné a tedy bude součástí řezu.
Součet hran v řezu je součtem indikátorů jevů přítomnosti jednotlivých hran v řezu vynásobený jejich hodnotou.
Z linearity střední hodnoty tedy střední hodnota součtu vah hran v řezu je $1/2$ celkového součtu vah hran, což je alespoň $1/2$ optima.
...
...
@@ -584,7 +577,7 @@ spočítat skalární součin se $\vec{z}$ a podle znaménka víme,
do kterého poloprostoru patří.
Pokud vybereme uniformně náhodný jednotkový vektor, tak jsme uniformně náhodně vybrali nadrovinu.
Jednotkový vektor můžeme generovat tak, že vygenerujeme náhodný vektor nezávisle po složkách z normálního rozdělení, a pak ho znormujeme.
Povšimne si, že normalizace ani není potřeba,
Povšimněme si, že normalizace ani není potřeba,
protože to na znaménku součinů nic nemění.
Nyní pojďme precizněji spočítat pravděpodobnost toho, že se dvojice bodů (vektorů) $\vec{y_u}$,
Distribuce skalárních součinů $100$ běhů algoritmu pro $n=200$.
:::
Z grafu jde vidět, že skoro nikdy semidefinitní program neumístí sousední body do protilehlých částí. Drobnou výjimku tvoří hodnota skalárního součinu okolo $-1$, kterých semidefinitní program
Z grafu je vidět, že skoro nikdy semidefinitní program neumístí sousední body do protilehlých částí. Drobnou výjimku tvoří hodnota skalárního součinu okolo $-1$, kterých semidefinitní program
za $100$ běhů vyrobil zhruba $100$.
K tomuto mohl být donucen existencí dvojic aut stejného typu hned vedle sebe, kdy nemá jinou možnost než mezi nimi mít skalární součin $-1$.
...
...
@@ -1019,7 +1008,7 @@ Semidefinitní program rozmísťuje vektory do $n-1$ dimenzionální sféry.
Z naměřených dat však vychází, že semidefinitní program většinou generuje řešení, které
má mnohem menší dimenzi. Přesněji řečeno, pro řešení často platí, že
všechny vektory v něm mají několik prvních souřadnic velké hodnoty
a ve zbylých souřadnic mají hodnoty blízké nule.
a ve zbylých souřadnicích mají hodnoty blízké nule.
Tedy kdybychom vektory promítli na méně dimenzionální sféru (vzali místo nich nejbližší bod na ní), tak se účelová funkce moc nezmění.
Světlá barva bodu značí bod na zadní straně sféry.
Černé čáry spojují sousední auta a šedé jsou jim středově simetrické (protože dvojice aut, jejichž druhá auta stejného typu jsou vedle sebe, je také přitahována k sobě).
Černé čáry spojují sousední auta a šedé jsou jim středově symetrické (protože dvojice aut, jejichž druhá auta stejného typu jsou vedle sebe, je také přitahována k sobě).
Vizualizace jednoho z řešení pro $n=50$, které se vejde do 3D.
:::
...
...
@@ -1119,7 +1108,7 @@ Proto je na místě změřit, jak rychlé řešení jsou.
Testování probíhalo na stroji s procesorem AMD Ryzen 5 7600.
Programům bylo poskytnuto $16\,{\rm GB}$ operační paměti
a běh byl omezen na jedno jádro procesoru.
Během výpočtu na stoji neběželo nic kromě výpočtu a základních funkcí operačního systému.
Během výpočtu na stroji neběželo nic kromě výpočtu a základních funkcí operačního systému.
::: {#tmp2 c=figure}
```python {c=plotly}
...
...
@@ -1160,7 +1149,7 @@ fig.update_layout(
Závislost času řešení na velikosti vstupu.
:::
Dle výše uvedeného grafu můžeme usuzovat, že časová složitost obou algoritmů je v $\O(n^4) \cap \Omega(n^3)$.
Dle výše uvedeného grafu můžeme regresí v logaritmickém grafu usuzovat, že časová složitost obou algoritmů je v $\O(n^4) \cap \Omega(n^3)$.
Implementace pomocí SDPA-C má menší multiplikativní konstantu a navíc mnohem rychlejší čas startu, který se zejména projevuje na malých instancích.
Naměřená závislost relativního skóre řešení na velikosti vstupu.
:::
Na výše uvedeném grafu si můžeme všimnout, že s rostoucím $n$
se u všech měřených algoritmů zmenšuje rozptyl relativního skóre
navíc i naměřená střední hodnota má spíše klesající či stagnující
tendenci. Tedy pokud tento trend pokračuje i dále, algoritmy
se na větších než měřených vstupech chovají alespoň tak dobře jako na měřených.
Na výše uvedeném grafu a tabulek na následujících stranách si můžeme všimnout, že s rostoucím $n$
se u všech měřených algoritmů zmenšuje rozptyl relativního skóre.
Z grafu vidíme, že pro dostatečně velká $n$ je naměřené relativní skóre algoritmu $\algo{sdp}$ menší než $0.34$.
Z toho můžeme tedy usuzovat, že $\delta_{\algo{sdp}}(n) \le 0.34$ pro $n\in\{100, 200, 400, 566, 800, 1131, 1600, 2263\}$.
...
...
@@ -1219,12 +1206,69 @@ Z toho pak můžeme vyslovit hypotézu, že $\delta_{\algo{sdp}}(n) \le 0.34$ pr
Z naměřených dat také můžeme usuzovat, že $\algo{sdp}$ je lepší než libovolný z jiných představených algoritmů.
```python {redefine=tmp}
from bakalarka import data_lib, g
data = g.load_main_test()
import math
def row(*args):
return pf.TableRow(*(pf.TableCell(pf.Plain(*(i if isinstance(i, list) else parse_string(f"{i:0.3}") if isinstance(i, float) else parse_string(str(i))))) for i in args))
Veškeré hodnoty jsou zaokrouhleny na 3 platné číslice.
$\overline{\delta_{\alg}(n)}$ značí výběrový průměr, tedy $\frac{1}{m}\sum_{0\le i < m} r_i$, kde $m$ je počet testů a $r_i$ je relativní skóre $i$-tého z nich.
$\widehat{\delta_{\alg}(n)^2}$ značí výběrový rozptyl, tedy $\frac{1}{m-1}\sum_{0\le i < m} \left(r_i - \overline{\delta_{\alg}(n)}\right)^2$.
:::
\vfil\eject
Dolní odhad
-----------
Výstup z každého algoritmu nám dává hodní odhad na optimum daného vstupu.
Výstup z každého algoritmu nám dává horní odhad na optimum daného vstupu.
Ovšem semidefinitní programování nám navíc dává i dolní odhad na optimum, protože víme,
že optimum jednoho z ekvivalentních vyjádření účelové funkce je vždy menši rovno optimu BPS.
Použité řešiče semidefinitních programů nám navíc dají i horní odhad na optimum SDP (který se od nalezeného řešení může nepatrně lišit).
...
...
@@ -1277,13 +1321,13 @@ V této práci jsme představili algoritmus ${\bf sdp}$ na BPS založený na sem
Bohužel se nám nepodařilo dokázat žádný netriviální odhad na $\delta_{\algo{sdp}}^+$.
Nicméně dle naměřených dat můžeme soudit, že $\delta_{\algo{sdp}}^+$ se pohybuje okolo 0.34.
Místo toho jsme však dokázali, že pro libovolný vstup bude střední hodnota
(přes náhodné čísla generovaná algoritmem nikoliv přes vstup)
(přes náhodná čísla generovaná algoritmem nikoliv přes vstup)
skóre řešení nejhůře $0.212 n$ od optima, tedy, že platí $$\forall \alpha:\qquad\E[\delta_{\algo{sdp}}(\alpha)] \le \delta(\alpha) + 0.212 n.$$
Toto řešení jsme dále dokonce dvakrát implementovali s využitím
různých implementací řešení semidefinitních programů, které jsme tímto i porovnali.
Z naměřených dat jsme jednak odhadli střední hodnotu skóre algoritmu přes náhodný vstup.
A druhak jsme si všimli, že dimenze řešení semidefinitního programování je poměrně malá, což jsme zformulovali jako hypotézu.
A také jsme si všimli, že dimenze řešení semidefinitního programování je poměrně malá, což jsme zformulovali jako hypotézu.
Stále však zůstává otevřená otázka, kolik přesně je $\delta^+$ a $\delta^-$ (a případně zda se rovnají)
a jaké nejlepší $\delta^+_{\alg}$ je možno dosáhnout polynomiálním algoritmem $\alg$.