diff --git a/prezentace/build.sh b/prezentace/build.sh new file mode 100755 index 0000000000000000000000000000000000000000..f88d9fe8651585872de65dbb7e11e4b1b7c81557 --- /dev/null +++ b/prezentace/build.sh @@ -0,0 +1,15 @@ +#!/bin/bash +set -euo pipefail + +./gen_plotly.py + +lualatex main +biber main + + +#for i in main-*asy +#do + #asy $i +#done + +lualatex main diff --git a/prezentace/gen_plotly.py b/prezentace/gen_plotly.py new file mode 100755 index 0000000000000000000000000000000000000000..7820964e7a4f198c61097037baf4b53d4a4d7a90 --- /dev/null +++ b/prezentace/gen_plotly.py @@ -0,0 +1,169 @@ +#!/bin/env python3 + +from bakalarka import g, data_lib +import plotly as plotly_lib +import plotly.graph_objects as go +import pathlib + +d = pathlib.Path("/".join(__file__.split("/")[:-1])) + +def plotly_decorator(): + def l(f): + fig = f() + + fig.update_layout( + margin = {'l':0,'r':0,'t':0,'b':0}, + font=dict( + size=10, + ), + ) + + name = f.__name__ + file = name + ".pdf" + + plotly_lib.io.kaleido.scope.mathjax = None + plotly_lib.io.write_image(fig, file, format='pdf', width=440, height=290) + return l + + +data = g.load_main_test() +data_oponent = g.load(d/"oponent_test_log") + +shift_unit = 1.06 + +@plotly_decorator() +def score(): + fig = go.Figure(data=[go.Box( + x=[i.n * shift for i in d], + y=[i.score/i.n for i in d], + name=name + ) for d,name, shift in [ + [data.pipelines["greedy"], "g", 1/shift_unit], + [data.pipelines["rg"], "rg", shift_unit], + [data.pipelines["rsg"], "rsg", 1/shift_unit], + [data.pipelines["semidef_prog_sage.sage(10, CVXOPT)"], "sdp – Sage", 1/shift_unit], + [data.pipelines["semidef_prog(10)"], "sdp – SDPA-C", shift_unit], + ]]) + + fig.add_hline(y=0.34, + annotation_text="0.34", annotation_position="top left", + fillcolor="green") + fig.update_traces(width=0.05) + fig.update_layout( + xaxis_title="Počet typů aut (logaritmická stupnice)", + yaxis_title="Relativní skóre", + xaxis=dict(showgrid=False, type="log"), + yaxis=dict(range=[0, 1]), + xaxis_title_standoff = 0, + margin_b = 15, + legend=dict(orientation="h"), + ) + return fig + +@plotly_decorator() +def time(): + from math import log, exp + from sklearn.linear_model import LinearRegression + + def gen(d, name, minim, color, color_line): + pred_x = list(range(minim, max(i.n for i in d)+1)) + regr = LinearRegression() + regr_res = regr.fit([[log(i.n)] for i in d if i.resources_cpu_time_s and i.n>minim], [log(i.resources_cpu_time_s) for i in d if i.resources_cpu_time_s and i.n>minim]) + predict = [exp(i) for i in regr.predict([[log(i)] for i in pred_x])] + return [ + go.Box( + x=[i.n for i in d], + y=[i.resources_cpu_time_s for i in d], + name=name, + marker_color=color, + ), + go.Scatter(x=pred_x, y=predict, mode="lines", marker_color=color_line, name=f"n^{regr.coef_[0]:.3} * {exp(regr.intercept_):.1g}".replace("-0", "-")), + ] + + + data = g.load_main_test() + + fig = go.Figure(data=[ + *gen(data.pipelines["semidef_prog(10)"], "SDPA-C", 400, "blue", "lightblue"), + *gen(data.pipelines["semidef_prog_sage.sage(10, CVXOPT)"], "Sage", 100, "red", "pink"), + ]) + + fig.update_layout( + xaxis_title="Počet typů aut (logaritmická stupnice)", + yaxis_title="Čas běhu v sekundách (logaritmická stupnice)", + xaxis=dict(showgrid=False, type="log"), + yaxis=dict(type="log"), + ) + return fig + + +@plotly_decorator() +def oponent_score(): + data = data_oponent + shift_unit = 1.5 + fig = go.Figure(data=[go.Box( + x=[i.n + shift for i in d], + y=[i.score/i.n for i in d], + name=name + ) for d,name, shift in [ + [data.pipelines["greedy"], "g", -shift_unit], + [data.pipelines["rg"], "rg", shift_unit], + [data.pipelines["rsg"], "rsg", -shift_unit], + [data.pipelines["semidef_prog_sage.sage(10, CVXOPT)"], "sdp – Sage", shift_unit], + [data.pipelines["opt_int_prog.sage(GLPK)"], "opt – GLPK", -shift_unit], + [data.pipelines["opt_int_prog.sage(PPL)"], "sdp – PPL", shift_unit], + ]]) + + fig.add_hline(y=0.34, + annotation_text="0.34", annotation_position="top left", + fillcolor="green") + fig.update_traces(width=2) + fig.update_layout( + xaxis_title="Počet typů aut", + yaxis_title="Relativní skóre", + xaxis=dict(showgrid=False), + yaxis=dict(range=[0, 1]), + xaxis_title_standoff = 0, + margin_b = 15, + legend=dict(orientation="h"), + ) + return fig + +@plotly_decorator() +def oponent_time(): + data = data_oponent + from math import log, exp + from bakalarka import g, data_lib + from sklearn.linear_model import LinearRegression + + def gen(d, name, minim, color, color_line, shift): + #pred_x = list(range(minim, max(i.n for i in d)+1)) + #regr = LinearRegression() + #regr_res = regr.fit([[log(i.n)] for i in d if i.resources_cpu_time_s and i.n>minim], [log(i.resources_cpu_time_s) for i in d if i.resources_cpu_time_s and i.n>minim]) + #predict = [exp(i) for i in regr.predict([[log(i)] for i in pred_x])] + return [ + go.Box( + x=[i.n + shift for i in d], + y=[i.resources_cpu_time_s for i in d], + name=name, + marker_color=color, + ), + #go.Scatter(x=pred_x, y=predict, mode="lines", marker_color=color_line, name=f"n^{regr.coef_[0]:.3} * {exp(regr.intercept_):.1g}".replace("-0", "-")), + ] + + shift = 1.2 + + fig = go.Figure(data=[ + *gen(data.pipelines["semidef_prog(10)"], "sdp – SDPA-C", 400, "blue", None, -shift), + *gen(data.pipelines["semidef_prog_sage.sage(10, CVXOPT)"], "sdp – Sage", 100, "purple", None, shift), + *gen(data.pipelines["opt_int_prog.sage(GLPK)"], "opt – GLPK", 400, "red", None, -shift), + *gen(data.pipelines["opt_int_prog.sage(PPL)"], "opt – PPL", 100, "orange", None, shift), + ]) + + fig.update_layout( + xaxis_title="Počet typů aut", + yaxis_title="Čas běhu v sekundách (logaritmická stupnice)", + xaxis=dict(showgrid=False), + yaxis=dict(type="log"), + ) + return fig diff --git a/prezentace/main.tex b/prezentace/main.tex new file mode 100644 index 0000000000000000000000000000000000000000..7d20ca33b486e68282629141c218798819a86809 --- /dev/null +++ b/prezentace/main.tex @@ -0,0 +1,232 @@ +\documentclass[pdf]{beamer} + +\usepackage{pgfpages} +%\setbeameroption{show notes on second screen} + +\usepackage[english,czech]{babel} +\usepackage{csquotes} +\usepackage[style=iso-authoryear]{biblatex} +\addbibresource{sample.bib} + +\usepackage{graphicx} +\usepackage {mathtools} +\usepackage{utopia} %font utopia imported +\usetheme{Ilmenau} +\usepackage{amsthm} + +\newtheorem{problemTH}{Problém} +\newtheorem{notaceTH}{Notace} +\newtheorem{veta}{Věta} +\newtheorem{hipoteza}{Hypotéza} + +% set colors +\definecolor{myNewColorA}{RGB}{255,103,0} % eric orange +\definecolor{myNewColorB}{RGB}{169,169,169} +\definecolor{myNewColorC}{RGB}{255,103,0} +\setbeamercolor*{palette primary}{bg=myNewColorC} +\setbeamercolor*{palette secondary}{bg=myNewColorB, fg = white} +\setbeamercolor*{palette tertiary}{bg=myNewColorA, fg = white} +\setbeamercolor*{titlelike}{fg=myNewColorA} +\setbeamercolor*{title}{bg=myNewColorA, fg = white} +\setbeamercolor*{item}{fg=myNewColorA} +\setbeamercolor*{caption name}{fg=myNewColorA} +\usefonttheme{professionalfonts} +\usepackage{hyperref} +%------------------------------------------------------------ +%\titlegraphic{\includegraphics[height=2cm]{logo.png}} + +\setbeamerfont{title}{size=\large} +\setbeamerfont{subtitle}{size=\small} +\setbeamerfont{author}{size=\small} +\setbeamerfont{date}{size=\small} +\setbeamerfont{institute}{size=\small} +\title{Binární paint shop problém} +\author[]{Jiří Kalvoda\\ Vedoucí: doc. Mgr. Robert Šámal, Ph.D.\\ Oponent: Mgr. Michal Opler, Ph.D.} %% Change author name here +\institute{IÚUK MFF} +\date[\textcolor{white}{}] %% Change presentation date here +{V Hnojníku dne 2024-09-04} + +\protected\def\APX{{\rm APX}} +\protected\def\P{{\rm P}} +\protected\def\NP{{\rm NP}} +\protected\def\alg{{\rm alg}} +\def\E{{\mathbb E}} + + +\begin{document} + +\frame{\titlepage} + +%\def\pause{\hrule} +%------------------------------------------------------------ + +\section{Úvod} + +\begin{frame}[fragile]{Definice problému} + \begin{problemTH}[Binární paint shop problém] + \begin{itemize} + \item $2n$ aut v řadě + \item $n$ typů, od každého dvě auta + \pause + \item Barvení aut v pořadí dle vstupu + \item Chceme: každý typ $\rightarrow$ jedno červeně a jedno zeleně + \item Co nejméně změn barev v posloupnosti + \end{itemize} + \end{problemTH} + + \pause + \vskip 3mm + + \begin{tabular}{ll} + Vstup: & Typy aut v řadě\\ + Výstup: & Přiřazení barev autům\\ + Hodnota výstupu: & Počet změn barev\\ + \end{tabular} +\end{frame} + + +\begin{frame}[fragile]{Doposud známé výsledky} + \begin{problemTH}[Binární paint shop problém] + \begin{itemize} + \item $2n$ aut v řadě + \item $n$ typů, od každého dvě auta + \item Barvení aut v pořadí dle vstupu + \item Chceme: každý typ $\rightarrow$ jedno červeně a jedno zeleně + \item Co nejméně změn barev v posloupnosti + \end{itemize} + \end{problemTH} + \begin{itemize} + \item Rozhodovací problém (Existuje řešení s nejvýše $k$ změnami?) je $\NP$-těžký + \item Optimalizační problém je $\APX$-těžký \parencite{apx} + \item[$\Rightarrow$] $( \P \neq \NP \rightarrow \hbox{Neexistuje aproximační schéma})$ + \item Unique games conjecture $\Rightarrow$ neexistuje $c$-aproximace \parencite{neaprox} + \end{itemize} +\end{frame} + +\begin{frame}[fragile] + + Dává smysl zkoumat chování v průměrném případě. + + + \begin{notaceTH} + $$\gamma(\alpha) = \hbox{Hodnota (počet změn barev) optimálního řešení vstupu $\alpha$}$$ + $$ \gamma(n) + = \frac{\sum_{\hbox{$\alpha$: vstup velikosti $n$}} \gamma(\alpha)}{(2n)!/2^n} + = \E_{\hbox{\alpha}}[\gamma(\alpha)] + $$ + $\alpha_{\alg}(n)$, $\gamma{\alg}(\alpha)$ \dots{} totéž pro hodnotu výstupu algoritmu + \end{notaceTH} + + \pause + + \begin{itemize} + \item Hladový algoritmus \parencite{gr}: + $$\gamma(n) \le \gamma_{\alg}(n) = \sum_{0\le k < n} {2k^2-1 \over 4k^2-1} \sim {1\over 2} \cdot n$$ + \end{itemize} +\end{frame} +\begin{frame}[fragile] + \begin{itemize} + \item Hladový algoritmus \parencite{gr}: + $$\gamma(n) \le \gamma_{\alg}(n) = \sum_{0\le k < n} {2k^2-1 \over 4k^2-1} \sim {1\over 2} \cdot n$$ + \pause + \item Rekurzivní hladový algoritmus \parencite{gr}: + $${2\over 5}\,n - {8\over 15} \le \gamma_{\alg}(n) \le {2\over 5}\,n + {7\over 10} \Rightarrow \gamma(n) \le \gamma_{\alg}(n) \sim 0.4n$$ + \pause + \item Hvězdičkový rekurzivní algoritmus \parencite{docw}: + $$\hbox{Hypotéza:\ }\gamma_{\alg} \sim \left({1\over 13} \cdot \sqrt{61} - {3\over 13} \right)n \doteq 0.370 n$$ + \pause + \item Dolní odhad pomocí pravděpodobnosti \parencite{docw}: + $$\gamma_{\alg}(n) \ge 0.214n$$ + \end{itemize} +\end{frame} + +\section{Vlastní přínos} + +\begin{frame}[fragile]{Nové řešení založené na semidefinitním programování} + \newtheorem{tmp}{Semidefinitní programování}% +{ + \setbeamercolor{block title}{use=example text,fg=black,bg=yellow!75!black}% + \setbeamercolor{block body}{parent=normal text,use=block title example,bg=yellow!10}% + \begin{tmp} + \begin{itemize} + \item Optimalizační technika podobna lineárnímu programování + \item Jedna z forem: Rozmísťování $n$ bodů na $n-1$ dimenzionální sféru, + podmínky a optimalizační funkce pracující se skalárními součiny bodů + \end{itemize} + \end{tmp} +} + \begin{itemize} + \item Založeno na Goemans-Williamsově algoritmu na maximální řez \parencite{semidef} + \item Pro každé auto bod, podmínky na protilehlost dvojic stejného typu, minimalizujeme vzdálenost sousedních aut + \item Zaokrouhlení pomocí řezu náhodnou rovinou + \end{itemize} +\end{frame} + +\begin{frame}[fragile]{Nové řešení založené na semidefinitním programování} + \begin{itemize} + \item Pro každé auto bod, podmínky na protilehlost dvojic stejného typu, minimalizujeme vzdálenost sousedních aut + \item Zaokrouhlení pomocí řezu náhodnou rovinou + \end{itemize} + \begin{hipoteza} + Pro dostatečně velká $n$ platí: + $$ \gamma_{\alg}(n) \le 0.34n$$ + \end{hipoteza} + \pause + \begin{veta} + Pro každý vstup $\alpha$ platí: + $$ \E_{\hbox{Náhodné bity}}[\gamma_{\alg}(\alpha)] \ \le\ \gamma(\alpha) + 0.212n$$ + \end{veta} +\end{frame} + +\begin{frame}[fragile]{Implementace a testování} + \begin{itemize} + \item Implementace původních i nového algoritmu + \item Různé implementace semidefinitního programování + \pause + \item Různé velikosti vstupů ($n$ od $10$ do $3\,200$) + \item Pokaždé $1\,000$ nezávisle náhodně vybraných vstupů + \item Několik dní na 4 strojích (moderní workstations) + \end{itemize} +\end{frame} + +\def\pic#1{ + \hbox to \hsize{\hskip -1cm\hfill\includegraphics[]{#1}\hbox{}\hfill\hskip -1cm} +} +\begin{frame} + \pic{score.pdf} +\end{frame} +\begin{frame} + \pic{time.pdf} +\end{frame} + + +\section{Otázky} +\begin{frame}[fragile]{Otázky?} + \hbox to \hsize{\hfil \emph{Prostor pro vaše otázky.} \hfil} +\end{frame} + +\begin{frame}[fragile]{Otázka od oponenta} + \emph{ + Zkoušel jste (na menších vstupech) porovnat výsledek Vašeho + algoritmu s optimálním obarvením? Pokud ano, jak daleko se typicky pohyboval? + } + +\end{frame} +\begin{frame} + \pic{oponent_score.pdf} +\end{frame} +\begin{frame} + \pic{oponent_time.pdf} +\end{frame} + + + + +\section{Poděkování} + +\begin{frame}[fragile]{Poděkování} + Děkuji vedoucímu práce za oporu při zkoumání a psaní, oponentovi za napsání posudku a všem posluchačům za pozornost. +\end{frame} + + +\end{document} diff --git a/prezentace/sample.bib b/prezentace/sample.bib new file mode 120000 index 0000000000000000000000000000000000000000..dc4977b100520c27bf1c8e244d6930973672fd2f --- /dev/null +++ b/prezentace/sample.bib @@ -0,0 +1 @@ +../prace/bakalarka/sample.bib \ No newline at end of file