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

prace: Zapracování korektur

parent ab9ff695
No related branches found
No related tags found
No related merge requests found
......@@ -22,6 +22,14 @@ ft:
``` {c=cmt}
velka tecka
float mezery
Algoritmus na Maximáľní řez: rozčlenit na věty a podobné
```
::: {only=html}
$\def\progline#1#2#3{\hbox{#1}\hskip 1cm\relax #2 \hskip 1cm\relax #3}$
:::
``` {=tex}
\def\progline#1#2#3{\hbox to 3cm{#1\hfil}\hbox to 5cm{\hfil$\displaystyle #2$\hfil}\hbox to 4cm{$\displaystyle #3$\hfil}}
```
::: {c=head}
......@@ -47,10 +55,10 @@ který je dobrý v průměrném případě (pro náhodný vstup).
Zadání
------
Nejprve si pojďme představit zadání binární paint shop problému:
Nejprve si pojďme představit zadání binárního paint shop problému:
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.
Auto však na barvící linky vjíždí v pořadí, v jakém jsou v řadě.
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.
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ší.
......@@ -69,7 +77,7 @@ a $p_i$ bude značit, jestli se jedná o první nebo druhé auto daného typu (t
Protože někdy bude výhodnější zacházet se znaménky, zavedeme ještě $P_i = -1+2 p_i$, které bude nabývat hodnot $-1$ a $1$.
Také rozšíříme notaci o $a_{i, -1} = a_{i,0}$.
Nakonec ještě zavedeme zkratku indexu druhého auta stejného typu jako na pozici $i$: $o_i = a_{t_i,-P_i}$.
Nakonec ještě zavedeme zkratku indexu druhého auta stejného typu jako je auto na pozici $i$: $o_i = a_{t_i,-P_i}$.
:::: {c=cmt}
......@@ -320,15 +328,13 @@ Nakonec ozmačme skutečnost, že je matice $X$ pozitivně semidefinitní (bude
Úloha semidefinitního programování je optimalizační úloha (podobně jako lineární programování) následujícího formátu:
$$ \hbox{maximalizuj}\qquad C \bullet X $$
$$ \hbox{za podmínek}\qquad \forall i \in \{0,\dots, m-1\}: A_i \bullet X = b_i$$
$$X \succeq 0.$$
TODO vysázet jako tabulku
$$\progline{maximalizuj}{C \bullet X}{}$$
$$\progline{za podmínek}{A_i \bullet X = b_i}{0 \le i < m-1}$$
$$\progline{}{X \succeq 0.}{}$$
Vstupem programu je tedy velikost matice $n$, počet podmínek $m \in \N$
a pak pro každou podmínku matice $A_i \in \SYM_n$ a číslo $b_i \in \R$.
Výstupem je pak $X\in \SYM_n$ splňujíci výše uvedené podmínky.
Výstupem je pak $X\in \SYM_n$ splňující výše uvedené podmínky.
Pro nás bude důležitý následující fakt z lineární algebry:
......@@ -348,30 +354,31 @@ pomocí Choleského dekompozice a to v čase $\O(n^3)$.
Ještě poznamenejme, že pro libovolnou 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}$.
Pojďme se zamyslet nad tím, co v takovémto pohledu znamenají podmínky a účelová funkce.
Matici $Y$ můžeme považivat za $n$ sloupcových vektorů $\vec{y_0}, \dots, \vec{y_{n-1}}$ vedle sebe. (TODO sazba větší šipky nad vektorem)
Matici $Y$ můžeme považovat za $n$ sloupcových vektorů $\vec{y_0}, \dots, \vec{y_{n-1}}$ vedle sebe. (TODO sazba větší šipky nad vektorem)
Matice $Y^{\rm T}$ pak odpovídá těmto vektorům zapsaných v řádcích pod sebou.
Matice $X = Y^{\rm T} Y$ tedy na pozici $i,j$ obsahuje skalární součin vektorů $y_i$ a $y_j$.
Účelová funkce tedy je lineární kombinací skalárních součinů a podmínky
odpovídají vynucení rovnosti lineární kombinace skalárních součinů vektorů a konstanty.
Speciálně tedy můžeme mít podmínku na délku vektoru: $|\vec{y_i}| = \sqrt{\vec{y_i}^{\rm T}\vec{y_i}} = C$.
Semidefinitní programování v tomto tvaru bude nazývat semidefinitní programování _v dekompomovaném tvaru_.
Speciálně tedy můžeme mít podmínku na délku vektoru: $|\vec{y_i}|^2 = \vec{y_i}^{\rm T}\vec{y_i} = C$.
Semidefinitní programování v tomto tvaru budeme nazývat semidefinitní programování _v dekomponovaném tvaru_.
Maximální řez
-------------
Představíme aproximační algoritmus založený na semidefinitním programování na následující problém:
Představíme si pravděpodobnostní aproximační algoritmus založený na semidefinitním programování na následující problém:
::: {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ím 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:
$$
H(A,B) = \sum_{\{u,v\}\in E, u\in A, v\in B} h({u,v})
H(A,B) = \sum_{\{u,v\}\in E\atop u\in A, v\in B} h({u,v})
$$
Cílem je maximalizovat hodnotu řezu.
:::
Problém maximálního řezu je NP-úplný TODO Citace, proto
Problém maximálního řezu (resp. rozhodovací verze, kde se ptáme na existenci řezu alespoň dané velikosti)
je NP-úplný TODO Citace, proto
se u něj zkoumají aproximační algoritmy a pravděpodobností aproximační algoritmy.
......@@ -405,8 +412,8 @@ Povšimněme si, že triviální algoritmus dosáhl poměrně zajímavého aprox
a to se ani nedíval na vstup.
Lepšího aproximačního poměru můžeme dosáhnout pomocí
Goemans-Williamsonova algoritmu [@semidef] založeného na semidefinitním
Lepšího aproximačního poměru můžeme dosáhnout
Goemans-Williamsonovým algoritmem [@semidef] založeným na semidefinitním
programování.
Naivní implementace je, že si pro každý vrchol $u$
......@@ -428,9 +435,8 @@ Tím jsme vyrobili relaxaci výše uvedeného programu, protože za těchto podm
i jiných poloh než $(\pm 1,0,\dots,0)$.
Získali jsme tedy následující program:
$$ \hbox{maximalizuj}\qquad \sum_{uv \in E} -h(u,v)\vec{y_u}^{\rm T} \vec{y_v}$$
$$ \hbox{ za podmínek}\qquad \forall y_i: |y_i| = 1$$
TODO vysázet jako tabulku
$$\progline{maximalizuj}{\sum_{uv \in E} -h(u,v)\vec{y_u}^{\rm T} \vec{y_v}}{}$$
$$\progline{za podmínek}{|y_i| = 1}{\forall i}$$
To si lze představit jako umísťování $n$ bodů na
$n-1$ dimenzionální sféru v $\R^n$.
......@@ -548,6 +554,7 @@ Pro dostatečně malé $\varepsilon$ se tedy jedná o $0.878$ pravděpodobnostn
Řešení semidefinitních programů
-------------------------------
TODO
......@@ -556,7 +563,7 @@ Pro dostatečně malé $\varepsilon$ se tedy jedná o $0.878$ pravděpodobnostn
Řešení vychází z Goemans-Williamsonova algoritmu na maximální řez.
Pro každé auto nám bude semidefinitní program umísťovat bod/vektor na jednotkovou sféru.
Poté náhodně rozřízneme nadrovinou sférou na dvě poloviny
Poté náhodně rozřízneme nadrovinou sféru na dvě poloviny
a podle toho, do které poloviny auto patří, zvolíme jeho barvu.
Rozdílné barvy aut $i, j$ stejného typu zařídíme tak, že
......@@ -564,18 +571,18 @@ vynutíme $\vec{y_i} = -\vec{y_j}$. Na to nám stačí jediná podmínka -- ří
Účelovou funkcí pak řekneme, že sousední auta mají preferovat stejnou barvu, tedy jejich body na sféře mají být blízko sebe, což znamená, že skalární součin má být co největší.
Finální semidefinitní program v dekompomovaném tvaru tedy vypadá takto:
Finální semidefinitní program v dekomponovaném tvaru tedy vypadá takto:
$$ \hbox{maximalizuj}\qquad \sum_i^{2n-1} \vec{y_i}^{\rm T} \vec{y_{i+1}} $$
$$ \hbox{za podmínek}\qquad \sum_i^{n} \vec{y_{a_{i,0}}} = -\vec{y_{a_{i,1}}}$$
$$ \forall y_i: |y_i| = 1$$
$$\progline{maximalizuj}{\sum_{0\le i<2n-1} \vec{y_i}^{\rm T} \vec{y_{i+1}}}{}$$
$$\progline{za podmínek}{\vec{y_{a_{i,0}}} = -\vec{y_{a_{i,1}}}}{0\le i < n}$$
$$\progline{}{|y_i| = 1}{0\le i < 2n}$$
Pro každou dvojici tedy do účelové funkce přičteme číslo mezi $-1$ a $1$, kde $1$ značí, že vektory jsou stejné,
a $-1$, že jsou protilehlé.
Účelovou funkci můžeme ekvivalentně zapsat jako
$$ \hbox{minimalizuj}\qquad \sum_i^{2n-1} \frac{1}{2} - \frac{\vec{y_i}^{\rm T} \vec{y_{i+1}}}{2} = \frac{2n-1}2 - \frac12 \sum_i^{2n-1} \vec{y_i}^{\rm T} \vec{y_{i+1}} $$
Nyní tedy pro každou dvojici sousedních aut sčítáme číslo mezi $0$ a $1$, kde $0$ jsou stejné vektory
Nyní tedy pro každou dvojici sousedních aut sčítáme číslo mezi $0$ a $1$, kde $0$ nastane pro stejné vektory
mezi nimiž nikdy nebude změna barvy a $1$ nastane v případě opačných vektorů, mezi nimiž se nutně barva změní.
Účelovou funkci se snažíme minimalizovat.
......@@ -586,7 +593,7 @@ Toto je validní řešení semidefinitního programu.
Nyní by se hodilo odhadnout střední hodnotu počtu změn barev stejně jako u maximální řezu.
Jeho důkaz vycházel z pozorování ohledně poměru pravděpodobností výběru a účelové funkce.
Přesněji řečeno z toho, že tento poměr umíme zdola odhadnou.
Přesněji řečeno z toho, že tento poměr umíme zdola odhadnout.
Ovšem v našem případě místo maximalizace děláme minimalizaci účelové funkce a pravděpodobnosti.
Tedy abychom mohli tvrdit, že pravděpodobnost je menší než nějaký násobek účelové funkce,
potřebovali bychom horní odhad poměru. Ovšem tento poměr je neomezený (viz obrázky [](#gw-func) a [](#gw-frac)).
......@@ -614,7 +621,7 @@ $$ -0.1053 \le \frac{\arccos x}{\pi} - \left(\frac{1}{2} - \frac{x}{2}\right) \l
Jedná se o spojitou funkci na kompaktním intervalu, takže maximum a minimum může nabývat jen v krajních bodech a v místech s nulovou derivací.
V obou krajních bodech je však její hodnota $0$, zbývá tedy prověřit nulové derivace.
Zderivováním získáme:
$$f'(x) = - \frac{1}{\pi \sqrt{-x^2 +1}} + \frac12 .$$
$$f'(x) = - \frac{1}{\pi \sqrt{-x^2 +1}} + \frac12 ,$$
::: {#sdp-derivative c=figure}
```python {c=sage}
......@@ -624,18 +631,18 @@ r = plot(derivative(arccos(x)/pi - (1/2 - x/2)), xmin=-1, xmax=1, ymin=-1, ymax=
Derivace $f$
:::
Což má dva kořeny $x = \pm \sqrt{\pi^2 - 4}/\pi$.
A hodnota $h$ v nich je přibližné $\pm 0.105256$.
což má dva kořeny $x = \pm \sqrt{\pi^2 - 4}/\pi$,
a hodnota $h$ v nich je přibližně $\pm 0.105256$.
::::::
Označme tuto konstantu $d = 0.1053$.
Označme konstantu z předchozího lemmatu jako $d = 0.1053$.
Tedy když je účelová funkce pro sousední dvojici aut je $r$, tak pravděpodobnost změny barev je nejvýše $d + r$.
Sečtením přes všechny hrany (z linearity středních hodnot) tedy získáme, že
střední hodnota součtu změn je nejvýše $c(2n-1) + R$, kde $R = \sum_i^{2n-1} \frac{1}{2} - \frac{\vec{y_i}^{\rm T} \vec{y_{i+1}}}{2}$, tedy jedno z ekvivalentních vyjádření účelové funkce.
Celkově tedy víme:
$$ \hskip -2pt \E[\hbox{Řeš. BPS}] \le 2dn + \hbox{Řeš. SDP} \le 2dn + (1-\varepsilon)\cdot\,\hbox{Opt. SDP} \le 2dn + (1-\varepsilon)\cdot\,\hbox{Opt. MC}\hskip -2pt$$
$$ \hskip -2pt \E[\hbox{Řeš. BPS}] \le 2dn + \hbox{Řeš. SDP} \le 2dn + (1-\varepsilon)\,\hbox{Opt. SDP} \le 2dn + (1-\varepsilon)\,\hbox{Opt. BPS}\hskip -2pt$$
Pro vhodně zvolené $\varepsilon$ tedy víme, že střední hodnota počtu změn v řešení je nejvýše o $0.212n$ horší než optimum.
Na rozdíl od jiných řešení binárního paint shop problému,
......@@ -658,10 +665,11 @@ Tím jednak čtyřikrát zmenšíme matici a navíc jsme odebrali $n$ podmínek.
Výsledný program vypadá takto:
$$ \hbox{maximalizuj}\qquad \sum_i^{2n-1} \vec{y_{t_i}}^{\rm T} \vec{y_{t_{i+1}}} P_{i} P_{i+1}$$
$$ \hbox{za podmínek}\qquad \forall y_i: |y_i| = 1$$
$$\progline{maximalizuj}{\sum_{0\le i < 2n-1} \vec{y_{t_i}}^{\rm T} \vec{y_{t_{i+1}}} P_{i} P_{i+1}}{}$$
$$\progline{za podmínek}{|y_i| = 1}{0 \le i < n}$$
Výhodou je, že je potřeba poloviční počet proměnných.
Výhodou je, že je potřeba poloviční počet proměnných,
proto v implementační části práce jsem využíval této formy programu.
Měření SDP řešení
=================
......@@ -714,7 +722,7 @@ Střední hodnota indikátoru souslednosti aut daného typu je tedy ${2n-1 \over
Z linearity střední hodnoty tedy počet sousedících aut stejného typu je $n/n = 1$.
:::
Ve 100 vstupech by tedy sousedních aut stejného typu mělo být ve střední hodnotě zhruba 100, což z části vysvětluje pozorovanou anomalit.
Ve 100 vstupech by tedy sousedních aut stejného typu mělo být ve střední hodnotě zhruba 100, což z části vysvětluje pozorovanou anomalitu.
Není však vyloučeno, že hodnoty skalárního součinu $-1$ nebo blízké program dosáhne i jinak.
......@@ -727,7 +735,7 @@ Z naměřených dat však vychází, že semidefinitní program většinou gener
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.
Tedy kdybychom vektory promítly na méně dimenzionální sféru (vzali místo nich nejbližší bod na ní), tak se účelová funkce moc nezmění.
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í.
::: {#max_coords_200 c=figure floatpage=200}
```python {c=plotly}
......@@ -808,7 +816,7 @@ Bohužel kvalita dostupných řešitelů semidefinitních programů je poměrně
### SDPA-C
Jedním z použitých programů byl SDPA-C [@sdpa-web].
Jedná se o knihovnu c C++ (TODO sazba)
založenou na metodě vnitřvích bodů v primárním a duálním problému. Dle autorů projektu [@sdpa-web]:
založenou na metodě vnitřních bodů v primárním a duálním problému. Dle autorů projektu [@sdpa-web]:
::: {.group lang=cs}
> SDPA (SemiDefinite Programming Algorithm) is one of the most efficient and stable software packages for solving SDPs based on the primal-dual interior-point method. It fully exploits the sparsity of given problems.
......@@ -863,7 +871,7 @@ line 193 in sdpa_linear.cpp
Tedy během výpočtu program něco spočte špatně a jako mezivýsledek mu vyjde matice, co není semidefinitní, se kterou již dále nejde pokračovat.
Příčinu této chyby se mi bohužel nepodařilo odhalit, protože na rozdíl od předchozího problému vůbec není jasné, kde začít hledat.
Detekce nesemidefinitnost matice totiž může být v úplně jiné části kódu, než kde nastane chyba.
Detekce nesemidefinitnosti matice totiž může být v úplně jiné části kódu, než kde nastane chyba.
Problém se projevuje například na vstupu s $n=5$ a seedem $19$.
......@@ -897,7 +905,7 @@ vstupem semidefiního programu je polynomiálně mnoho čísel konstantní velik
Řešení založená na semidefiním programování nemůže být moc rychlé.
Již samotný vstup pro řešič semidefinitních programů má kubickou složitost vzhledem k délce vstupu Binárního paint shop problému.
Program totiž obsahuje $n$ podínek na délku vektoru
Program totiž obsahuje $n$ podmínek na délku vektoru
a každá z nich se zapisuje pomocí matice $n \times n$.
......@@ -922,7 +930,9 @@ fig.update_layout(
showlegend=False
)
```
Závislost skóre SDP řešení na velikosti vstupu.
TODO možná lépe říct, co měříme
:::
::: {#tmp2 c=figure}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment