\documentclass[a4paper,12pt]{scrartcl}
\usepackage[ngerman]{babel}
\usepackage{graphicx} %BIlder einbinden
\usepackage{amsmath} %erweiterte Mathe-Zeichen
\usepackage{amsfonts} %weitere fonts
\usepackage[utf8]{inputenc} %Umlaute & Co
\usepackage{hyperref} %Links
\usepackage{ifthen} %ifthenelse
\usepackage{enumerate}
\usepackage{listings}
\lstset{language=Python}
\usepackage{pgffor}
\usepackage{algpseudocode} %Pseudocode
\usepackage{dsfont} % schöne Zahlenräumezeichen
\usepackage{amssymb, amsthm} %noch stärker erweiterte Mathe-Zeichen
\usepackage{tikz} %TikZ ist kein Zeichenprogramm
\usetikzlibrary{trees,automata,arrows,shapes}

\pagestyle{empty}


\topmargin-50pt

\newcounter{aufgabe}
\def\tand{&}


\newcommand{\makeTableLine}[2][0]{%
  \setcounter{aufgabe}{27}%TODO update
  \whiledo{\value{aufgabe} < 30}%TODO update
  {%
    #2\tand\stepcounter{aufgabe}%
  }
}

\newcommand{\aufgTable}[1]{
  \def\spalten{\numexpr #1 + 1 \relax}
  \begin{tabular}{|*{\spalten}{p{1cm}|}}
    \makeTableLine[\spalten]{A\theaufgabe}$\Sigma$~~\\ \hline
    \rule{0pt}{15pt}\makeTableLine[\spalten]{}\\
  \end{tabular}
}

\def\header#1#2#3#4#5#6#7{\pagestyle{empty}
\begin{minipage}[t]{0.47\textwidth}
\begin{flushleft}
{\bf #4}\\
#5
\end{flushleft}
\end{minipage}
\begin{minipage}[t]{0.5\textwidth}
\begin{flushright}
#6 \vspace{0.5cm}\\
%                 Number of Columns    Definition of Columns      second empty line
% \begin{tabular}{|*{5}{C{1cm}|}}\hline A1&A2&A3&A4&$\Sigma$\\\hline&&&&\\\hline\end{tabular}\\\vspace*{0.1cm}
\aufgTable{#7}
\end{flushright}
\end{minipage}
\vspace{1cm}
\begin{center}
{\Large\bf Übungsblatt #1}

{(Abgabe #3)}
\end{center}
}



%counts the exercisenumber
\newcounter{n}
\setcounter{n}{26} %TODO update

%Kommando für Aufgaben
%\Aufgabe{AufgTitel}{Punktezahl}
\newcommand{\Aufgabe}[2]{\stepcounter{n}
\textbf{Aufgabe \arabic{n}: #1} (#2 Punkte)}


\begin{document}
    %\header{BlattNr}{Tutor}{Abgabedatum}{Vorlesungsname}{Namen}{Semester}{Anzahl Aufgaben}
    \header{10}{}{2015-07-07}{Evolutionäre Algorithmen}{
    	\textit{Jan-Peter Hohloch}\\ \textit{Maximus Mutschler}
    }{SS 15}{3}%TODO update
    \vspace{0.5cm}
    \Aufgabe{1/5-Erfolgsregel (Theorie)}{5}
        \begin{enumerate}[(a)]
            \item Liegt die Sphäre (abhängig von $\sigma$) vollständig im Korridor, so ist die Erfolgswahrscheinlichkeit $0.5$. Für größere $\sigma$ wird die Erfolgswahrscheinlichkeit geringer, jedoch der mögliche Fortschritt größer.\\
            Die geringere Erfolgswahrscheinlichkeit ist bedingt durch den kleineren Anteil des Korridors an der Sphären-Außenfläche.
            \item Ist eine Erfolgswahrscheinlichkeit von $\frac{1}{5}$ optimal, so muss bei größerer Erfolgswahrscheinlichkeit $\sigma$ vergrößert werden (s.o.); bei zu kleiner Erfolgswahrscheinlichkeit umgekehrt. Dies ermöglicht größeren Fortschritt und damit schneller bessere Fitness ($\varphi$).
            \item $w_e=0.2$, $b=1.5cm$\\
                $2\pi\cdot r\cdot w_e= c$ Bogenlänge\\
                $c=2r\cdot\sin^{-1}\left(\frac{s}{2r}\right)$\\
                $\Rightarrow \pi\cdot w_e=\sin^{-1}\frac{s}{2r}\\
                \Leftrightarrow \sin\left(\pi\cdot w_e\right)=\frac{s}{2r}\\
                \Leftrightarrow r=\frac{s}{2\sin\left(w_e\pi\right)}\\
                \Rightarrow r=\frac{3cm}{2\sin\left(0.2\pi\right)}\approx 2.552cm=\sigma_{opt}$
        \end{enumerate}\pagebreak\\
    \Aufgabe{1/5-Erfolgsregel (Praxis)}{11}\\
    \foreach \x in {0.15,0.2,0.25,0.3,0.5,0.6}{
        \includegraphics[width=0.33\textwidth]{figures/sigma\x .png}
        \includegraphics[width=0.33\textwidth]{figures/we\x .png}
        \includegraphics[width=0.33\textwidth]{figures/fitness\x .png}\\
    }\\
    \begin{lstlisting}
import numpy as np
import matplotlib.pyplot as plt

def ES(n,sigma,eval,term=lambda P,t:t>=100000,
        kappa=0.82,zw=0.2,fit=lambda P:P[0],lb=-10,ub=10):
    t=0
    P=np.random.uniform(lb, ub, n)
    succ=0
    stats=[]
    while not term(P,t):
        Pm=P+np.random.normal(0,sigma,n)

        if eval(P,Pm,t):
            P=Pm
            succ=succ+1
        t=t+1
        if (t % 100) == 0:
            we=succ/100
            stats.append([t,sigma,we,fit(P)])
            if we < zw:
                sigma=sigma*kappa
            if we > zw:
                sigma=sigma/kappa
            succ=0
    return stats

def minimizeAbs(P,Pm,t):
    return np.sum(np.abs(P))>np.sum(np.abs(Pm))

def corridor(P,Pm,t,b=np.array([10,13,1,6,18,20,4,10,13,2])):
    if (P[1]-Pm[1]) <= b[t//10000]:
        return Pm[0]>P[0]
    else:
        return 0

stats=np.zeros((6,4,1000))
j=0
for zw in np.array([0.15,0.2,0.25,0.3,0.5,0.6]):
    for i in np.arange(0,1000):
        stats[j]=stats[j]
                   +np.transpose(ES(2,1,corridor,zw=zw,lb=0,ub=0))
    stats[j]=stats[j]/1000
    plt.plot(stats[j][0],stats[j][1],"rx")
    plt.xlabel("t")
    plt.ylabel("sigma")
    plt.title("sigma over time, zw="+str(zw))
    #plt.axis((0,100000,0,1e10))
    plt.savefig("sigma"+str(zw)+".png")
    plt.close()
    plt.plot(stats[j][0],stats[j][2],"rx")
    plt.xlabel("t")
    plt.ylabel("we")
    plt.title("we over time, zw="+str(zw))
    plt.axis((0,100000,0,0.55))
    plt.savefig("we"+str(zw)+".png")
    plt.close()
    plt.plot(stats[j][0],stats[j][3],"rx")
    plt.xlabel("t")
    plt.ylabel("fitness")
    plt.title("fitness over time, zw="+str(zw))
    plt.axis((0,100000,0,1e5))
    plt.savefig("fitness"+str(zw)+".png")
    plt.close()
    j=j+1
np.save("stats.npy",stats)

\end{lstlisting}\\
    \Aufgabe{Rekombination in ES}{4}
        \begin{enumerate}[(a)]
            \item $a_1'=(0.23,-0.92,-0.23,-0.85,0.21)$
            \item $a_2'=((0.25,1.18,0.36,0.53,0.14)+(1.18,-0.88,-0.23,-0.85,0.14))/2\\=(0.715,0.15,0.065,-0.16,0.14)$
            \item $a_3'=((0.25,-0.65,-0.31,-1.58,0.25)+(0.23,0.72,0.64,-0.85,0.25))/2\\=(0.24 ,  0.035,  0.165, -1.215,  0.25)$
            \item $a_4'=(0.25,1.18,0.67,0.47,0.195)$
        \end{enumerate}

\end{document}

