Skip to content
Snippets Groups Projects
Commit a7dd05ef authored by Jiří Kalvoda's avatar Jiří Kalvoda
Browse files

prace: Další korektury

parent 76750619
No related branches found
No related tags found
No related merge requests found
...@@ -85,7 +85,7 @@ Obsah {-} ...@@ -85,7 +85,7 @@ Obsah {-}
V této práci představíme binární paint shop problem. V této práci představíme binární paint shop problem.
Jedná se o úlohu, kterou neumíme efektivně řešit (protože je $\NP$ úplná) Jedná se o úlohu, kterou neumíme efektivně řešit (protože je $\NP$ úplná)
a ani aproximovat (za předpokladu Unique games conjecture je $c$-aproximace také $\NP$ těžká), a ani aproximovat (za předpokladu Unique games conjecture je konstantní aproximace také $\NP$ těžká),
takže mimo jiné probíhá aktivní výzkum snažící se najít algoritmus, takže mimo jiné probíhá aktivní výzkum snažící se najít algoritmus,
který je dobrý v průměrném případě (pro náhodný vstup). který je dobrý v průměrném případě (pro náhodný vstup).
...@@ -202,17 +202,20 @@ Bohužel někdy asi ani s aproximačními algoritmy nevystačíme a proto zavede ...@@ -202,17 +202,20 @@ Bohužel někdy asi ani s aproximačními algoritmy nevystačíme a proto zavede
pravděpodobnostní relaxaci. pravděpodobnostní relaxaci.
::: {c=box t=def name="Pravděpodobnostní aproximační algoritmus"} ::: {c=box t=def name="Pravděpodobnostní aproximační algoritmus"}
Algoritmus $\alg$ je pravděpodobnostně $g(n)$-aproximační, existuje-li konstanta $p \in (0,1)$, taková, že pro každý vstup $I$ algoritmus vrátí přípustně řešení, Náhodný algoritmus $\alg$ je pravděpodobnostně $g(n)$-aproximační na minimalizačním problému,
pro které s pravděpodobností alespoň $p$ platí, že $f(\alg(I)) \le g(|I|) \cdot \opt(I)$. pokud pro každý vstup $I$ algoritmus vždy vrátí přípustné řešení $\alg(I)$, pro které platí, že $\E[f(\alg(I))] \le g(|I|) \cdot \opt(I)$.
::: :::
Všimněme si, že na konstantě $p$ příliš nezáleží. Snadným důsledkem definice je, že pro každé $\varepsilon > 1$ pravděpodobnostně $g(n)$-aproximační algoritmus
vrátí s pravděpodobností zdola omezenou konstantou $1- {1\over \varepsilon} \in (0,1)$ řešení s hodnotou nejvýše $\varepsilon \cdot g(n)\cdot \opt(I)$.
Všimněme si, že na hodnotě $1-{1\over \varepsilon}$ příliš nezáleží.
Opakovaným spouštěním algoritmu a pak vybráním nejlepšího Opakovaným spouštěním algoritmu a pak vybráním nejlepšího
z dodaných řešení zvládneme $p$ libovolně těsně přiblížit k jedné. z dodaných řešení zvládneme pravděpodobnost libovolně těsně přiblížit k jedné.
Pokud řešíme složitost algoritmů a úloh, Pokud řešíme složitost algoritmů a úloh,
většinou vyžadujeme, aby účelová funkce i rozhodování přípustnosti řešení byly vyčíslitelné v polynomiálním čase. většinou vyžadujeme, aby účelová funkce i rozhodování přípustnosti řešení byly vyčíslitelné v polynomiálním čase.
Navíc chceme, aby všechna přípustná řešení měla omezenou délku nějakým polynomem v délce vstupu. Navíc chceme, aby všechna přípustná řešení měla délku omezenou nějakým polynomem v délce vstupu.
Snadno nahlédneme, že za takovýchto podmínek je rozhodovací verze, Snadno nahlédneme, že za takovýchto podmínek je rozhodovací verze,
jestli je optimum alespoň zadané číslo, v $\NP$. jestli je optimum alespoň zadané číslo, v $\NP$.
Pro takovou úlohu většinou hledáme polynomiální aproximační algoritmus. Pro takovou úlohu většinou hledáme polynomiální aproximační algoritmus.
...@@ -438,7 +441,7 @@ V této kapitole si představíme princip semidefinitního programování (dále ...@@ -438,7 +441,7 @@ V této kapitole si představíme princip semidefinitního programování (dále
z něhož vychází algoritmus na binary paint shop. z něhož vychází algoritmus na binary paint shop.
Nejprve zavedeme a připomeneme notaci důležitou v této kapitole. Nejprve zavedeme a připomeneme notaci důležitou v této kapitole.
Nechť $\R^{n\times m}$ značí množinu $n$ řádkových $m$ sloupcových matic Nechť $\R^{n\times m}$ značí množinu $n$-řádkových $m$-sloupcových matic
složených z reálných čísel. složených z reálných čísel.
Řádky i sloupce indexujeme od $0$, Řádky i sloupce indexujeme od $0$,
tedy matice $A\in \R^{n\times m}$ obsahuje prvky $A_{i,j}$ pro všechna $0\le i < n$ a $0 \le j < m$. tedy matice $A\in \R^{n\times m}$ obsahuje prvky $A_{i,j}$ pro všechna $0\le i < n$ a $0 \le j < m$.
...@@ -529,7 +532,7 @@ programování a proto popsaného mimo jiné v již dříve zmíněném úvodu d ...@@ -529,7 +532,7 @@ programování a proto popsaného mimo jiné v již dříve zmíněném úvodu d
Naivní implementace je, že si pro každý vrchol $u$ Naivní implementace je, že si pro každý vrchol $u$
vyrobíme proměnnou $x_u$, která může nabývat hodnot $\pm 1$, která bude říkat, do jaké množiny máme vrchol umístit. vyrobíme proměnnou $x_u$, která může nabývat hodnot $\pm 1$, která bude říkat, do jaké množiny máme vrchol umístit.
Do optimalizační funkce pak zakódujeme graf. Do účelové funkce pak zakódujeme graf.
Účelová funkce bude Účelová funkce bude
$$ \sum_{uv \in E} h(u,v)\cdot\left(- \frac{x_u x_v}{2} + \frac{1}{2}\right) = \frac{F}{2} + \frac{1}{2} \sum_{uv \in E} -h(u,v)x_u x_v ,$$ $$ \sum_{uv \in E} h(u,v)\cdot\left(- \frac{x_u x_v}{2} + \frac{1}{2}\right) = \frac{F}{2} + \frac{1}{2} \sum_{uv \in E} -h(u,v)x_u x_v ,$$
kde $F=\sum_{uv\in E} h(u,v)$ značí součet hodnot všech hran. kde $F=\sum_{uv\in E} h(u,v)$ značí součet hodnot všech hran.
...@@ -663,9 +666,9 @@ $$\frac{\arccos x}{\pi} / \frac{1-x}{2} > 0.8785 $$ ...@@ -663,9 +666,9 @@ $$\frac{\arccos x}{\pi} / \frac{1-x}{2} > 0.8785 $$
Označme tuto hodnotu $c = 0.8785$. Označme tuto hodnotu $c = 0.8785$.
Tedy když je optimalizační funkce $h(u,v)r$, tak pravděpodobnost výběru hrany do řezu bude alespoň $cr$. Tedy když je účelová funkce dané hrany $h(u,v)r$, tak pravděpodobnost výběru hrany do řezu bude alespoň $cr$.
Sečtením přes všechny hrany (z linearity středních hodnot) tedy získáme, že Sečtením přes všechny hrany (z linearity středních hodnot) tedy získáme, že
střední hodnota součtu hran v řešení je $cR$, kde $R = \sum_{uv \in E} h(u,v)\cdot\left(\frac 12 střední hodnota součtu hran v řešení je alespoň $cR$, kde $R = \sum_{uv \in E} h(u,v)\cdot\left(\frac 12
- \frac{\vec{y_u}^{\rm T}\vec{y_v}}2\right)$, tedy jedno z ekvivalentních vyjádření účelové funkce. - \frac{\vec{y_u}^{\rm T}\vec{y_v}}2\right)$, tedy jedno z ekvivalentních vyjádření účelové funkce.
Pokud tedy najdeme dobré řešení semidefinitního programu, ve střední hodnotě Pokud tedy najdeme dobré řešení semidefinitního programu, ve střední hodnotě
...@@ -682,7 +685,7 @@ Přesněji řečeno, pro každé $\varepsilon > 0$ jsme schopní najít řešen ...@@ -682,7 +685,7 @@ Přesněji řečeno, pro každé $\varepsilon > 0$ jsme schopní najít řešen
Ovšem musí platit, že všechna přípustná řešení jsou dostatečně malá. Ovšem musí platit, že všechna přípustná řešení jsou dostatečně malá.
Přesněji řečeno, musí platit, že Frobeniova norma všech přípustných matic je omezena konstantou s polynomiální délkou zápisu. Přesněji řečeno, musí platit, že Frobeniova norma všech přípustných matic je omezena konstantou s polynomiální délkou zápisu.
Tohoto výsledku jde dosáhnout pomocí elipsoidové metody, která má nejlepší teoretické výsledky. V praxi se však často používají jiné algoritmy. Tohoto výsledku jde dosáhnout pomocí elipsoidové metody, která má nejlepší teoretické výsledky. V praxi se však často používají jiné algoritmy.
Všechny naše programy budou splňovat podmínky na řešení, protože každá z hodnot hledané matice nutně bude ležet v intervalu $[-1, -1]$. Všechny naše programy budou splňovat podmínky na řešení, protože každá z hodnot hledané matice nutně bude ležet v intervalu $[-1, 1]$.
::: {c=box t=theorem} ::: {c=box t=theorem}
Goemansův-Williamsonův algoritmus je pravděpodobnostní $0.878$-aproxi\-mační algoritmus. Goemansův-Williamsonův algoritmus je pravděpodobnostní $0.878$-aproxi\-mační algoritmus.
...@@ -840,7 +843,8 @@ Měření řešení BPS ...@@ -840,7 +843,8 @@ Měření řešení BPS
Součástí práce je implementace algoritmů řešících Binární paint shop problém. Součástí práce je implementace algoritmů řešících Binární paint shop problém.
Každý z nich byl následně spuštěn pro různé velikosti, pokaždé na 100 nezávisle náhodně vybraných vstupech s počtem typů aut Každý z nich byl následně spuštěn pro různé velikosti, pokaždé na 100 nezávisle náhodně vybraných vstupech s počtem typů aut
10, 20, 50, 100, 200, 400, 566, 800, 1131, 1600, 2263 a 3200 (jedna z implementací $\algo{sdp}$ -- pomocí sage vyžaduje moc paměti a proto byla spuštěna jen na vstupech do velikosti $566$). 10, 20, 50, 100, 200, 400, 566, 800, 1131, 1600, 2263 a 3200.[^2]
Jedna z implementací $\algo{sdp}$ -- pomocí sage vyžaduje moc paměti a proto byla spuštěna jen na vstupech do velikosti $566$.
Celý test běžel jednovláknově zhruba dva dny a využíval nejvýše 16 GB operační paměti. Celý test běžel jednovláknově zhruba dva dny a využíval nejvýše 16 GB operační paměti.
U $\algo{sdp}$ řešení bylo použito 10 náhodných řezů a vždy byl vybraný nejlepší z nich. U $\algo{sdp}$ řešení bylo použito 10 náhodných řezů a vždy byl vybraný nejlepší z nich.
Gitový repozitář s implementací i naměřenými daty je k dispozici na <https://gitlab.kam.mff.cuni.cz/jirikalvoda/binary-paint-shop-problem>. Gitový repozitář s implementací i naměřenými daty je k dispozici na <https://gitlab.kam.mff.cuni.cz/jirikalvoda/binary-paint-shop-problem>.
...@@ -850,6 +854,9 @@ Pro reprodukovatelnost byly vstupy generovány deterministicky ze seedů. ...@@ -850,6 +854,9 @@ Pro reprodukovatelnost byly vstupy generovány deterministicky ze seedů.
Se stejným seedem se tedy vždy vygeneruje stejný vstup a ideálně i stejné řešení. Se stejným seedem se tedy vždy vygeneruje stejný vstup a ideálně i stejné řešení.
Pro různé algoritmy a velikosti vstupů byly použité různé seedy. Pro různé algoritmy a velikosti vstupů byly použité různé seedy.
[^2]: Hodnoty, co nejsou hezká čísla jsou zhruba $\sqrt{2}$-násobky předešlé hodnoty,
tedy v polovině mezi okolními hodnotami na logaritmické stupnici.
Praktické řešení semidef. programů Praktické řešení semidef. programů
----------------------------------------- -----------------------------------------
...@@ -930,6 +937,7 @@ Toto se stává například na seedu $18$ pro $n = 150$. ...@@ -930,6 +937,7 @@ Toto se stává například na seedu $18$ pro $n = 150$.
Vzhledem k výše uvedeným problémům dává smysl se porozhlédnout po alternativách. Vzhledem k výše uvedeným problémům dává smysl se porozhlédnout po alternativách.
\vfil\eject
### Sage ### Sage
SageMath je dle oficiálních stránek [@sagemath] open-source software pro matematické výpočty založený na rozšířené syntaxi pythonu, SageMath je dle oficiálních stránek [@sagemath] open-source software pro matematické výpočty založený na rozšířené syntaxi pythonu,
...@@ -1171,26 +1179,32 @@ from bakalarka import g, data_lib ...@@ -1171,26 +1179,32 @@ from bakalarka import g, data_lib
data = g.load_main_test() data = g.load_main_test()
shift_unit = 1.06
fig = go.Figure(data=[go.Box( fig = go.Figure(data=[go.Box(
x=[i.n for i in d], x=[i.n * shift for i in d],
y=[i.score/i.n for i in d], y=[i.score/i.n for i in d],
name=name name=name
) for d,name in [ ) for d,name, shift in [
[data.pipelines["semidef_prog(10)"], "sdp – SDPA-C"], [data.pipelines["greedy"], "g", 1/shift_unit],
[data.pipelines["semidef_prog_sage.sage(10, CVXOPT)"], "sdp – Sage"], [data.pipelines["rg"], "rg", shift_unit],
[data.pipelines["greedy"], "g"], [data.pipelines["rsg"], "rsg", 1/shift_unit],
[data.pipelines["rg"], "rg"], [data.pipelines["semidef_prog_sage.sage(10, CVXOPT)"], "sdp – Sage", 1/shift_unit],
[data.pipelines["rsg"], "rsg"], [data.pipelines["semidef_prog(10)"], "sdp – SDPA-C", shift_unit],
]]) ]])
fig.add_hline(y=0.34, fig.add_hline(y=0.34,
annotation_text="0.34", annotation_position="top left", annotation_text="0.34", annotation_position="top left",
fillcolor="green") fillcolor="green")
fig.update_traces(width=0.05)
fig.update_layout( fig.update_layout(
xaxis_title="Počet typů aut (logaritmická stupnice)", xaxis_title="Počet typů aut (logaritmická stupnice)",
yaxis_title="Relativní skóre", yaxis_title="Relativní skóre",
xaxis=dict(showgrid=False, type="log"), xaxis=dict(showgrid=False, type="log"),
yaxis=dict(range=[0, 1]), yaxis=dict(range=[0, 1]),
xaxis_title_standoff = 0,
margin_b = 15,
legend=dict(orientation="h"),
) )
``` ```
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment