Commit 10ab37fe authored by Amin Raslan's avatar Amin Raslan
Browse files

Replace vergleich_von_implementierungen.tex

parent 0b892a54
\section{Vergleich von Implementierungen}
\label{section:vergleich_von_implementierungen}
In diesem Kapitel geht es um die Implementierung und den Vergleich von 14 Modellen in CLP(FD) und MiniZinc. Die Modelle werden zuerst beschrieben. Dann werden die Implementierungen davon in CLP(FD) und in MiniZinc erklärt. Diese Implementierungen befinden sich in Anhang~\ref{appendix:implementierungen_clpfd_und_minizinc}. Die MiniZinc-Modelle werden sowohl in der MiniZincIDE als auch, wie die CLP(FD)-Modelle, in SICStus-Prolog implementiert. In der MiniZincIDE wird der Standard-Solver Gecode 6.3.0 verwendet. Schließlich werden die Modelle in beiden Sprachen verglichen. Die Kapitelstruktur ist in Abbildung~\ref{fig:kapitelstruktur} dargestellt.
\begin{figure}
......@@ -96,11 +97,11 @@ n! =
\caption{Berechnung der Fakultät}
\label{alg:fac_berechnung}
\begin{algorithmic}[1]
\Function{Faculty}{n}:
\If{$n = 0$}
\Function{N\_FACTORIAL}{N}:
\If{$N = 0$}
\State \Return 1
\Else
\State \Return n $\cdot$ Faculty(n-1)
\State \Return N $\cdot$ N\_FACTORIAL(N-1)
\EndIf
\EndFunction
\end{algorithmic}
......@@ -113,8 +114,8 @@ Das CLP(FD)-Modell wurde von \url{https://www.swi-prolog.org/man/clpfd.html} üb
In MiniZinc können Funktionen mit Definitions- und Wertebereichen definiert werden. Im MiniZinc-Modell wurde die Funktion \emph{fac} mit dem Definitionsbereich $[0,\infty)$ und dem Wertebereich $[1,\infty)$ zur Berechnung der Fakultät definiert:
\begin{minted}[frame=single,linenos]{prolog}
function 1..infinity: fac(0..infinity: n) = if n = 0
then 1 else n*fac(n-1) endif;
function 1..infinity: n_factorial(0..infinity: n) = if n = 0 then 1
else n * n_factorial(n-1) endif;
\end{minted}
Der Definitionsbereich $[0,\infty)$ wurde so gewählt, da die Fakultät die Menge $\mathbb{N}_{0} = {0,1,2,...}$ annimt. Es können also keine negativen Zahlen angenommen werden. N = 0 ist der kleinste erlaubte Wert. Weiterhin wurde der Wertebereich $[1,\infty)$ so gewählt, da 1 das kleinste Ergebnis ist, das ausgegeben werden kann, wie in Abbildung~\ref{eq:fac_rekursiv} und in Pseudocode~\ref{psc:fac_berechnung} zu sehen ist, und da die Fakultät nach unendlich $\infty$ läuft, je größer n wird, da wir immer mit größeren positiven Zahlen multiplizieren, wie in Abbildung~\ref{table:fac_wachstum} zu sehen ist.
......@@ -513,11 +514,13 @@ Hier sollen 3 Punkte beachtet werden:
Wie in Tabelle~\ref{table:gegenstaende} zu sehen ist, ist eine Flasche Whisky 4 Einheiten, eine Flasche Parfüm 3 Einheiten und eine Packung Zigaretten 2 Einheiten groß. Wenn der Schmuggler also beispielsweise eine Flasche Whisky schmuggelt, dann hat er noch $9 - 4 = 5$ Einheiten möglich. Nimmt er beispielsweise 2 Flaschen Whiskey, die jeweils $4$ Einheiten groß sind, dann hat er noch $9 - 4\cdot2 = 9 - 8 = 1$ Einheit. Wie viele Einheiten noch übrig sind, hängt also von der Größe und der Anzahl an geschmuggelten Gegenständen. Sei $w$ die Anzahl an Flaschen Whiskey, $p$ die Anzahl an Flaschen Parfüm und $z$ die Anzahl an Zigaretternverpackungen. Dann gilt:
\begin{center}
\begin{figure}
\centering
\begin{equation*}
4 \cdot w + 3 \cdot p + 2 \cdot z \leq 9.
\end{equation*}
\end{center}
\label{fig:smugglers_knapsack_einheiten}
\end{figure}
\newpage
Außerdem sollte der Gewinn mindestens gleich 30 \euro{} sein. Schmuggelt der Schmuggler also eine Flasche Perfüm, so hat er 10 \euro{} gewonnen. Schmuggelt er eine Flasche Whiskey und 2 Zigarettenverpackungen, so hat er einen Gewinn von $15 \cdot 1 \text{(Whiskey)} + 10 \cdot 0 \text{(Perfüm)} + 7 \cdot 2 \text{(Zigaretten)} = 29$ errreicht. Der Gewinn hängt also vom Kosten und von der Anzahl an geschmuggelten Gegenständen. Sei $w$ die Anzahl an Flaschen Whiskey, $p$ die Anzahl an Flaschen Parfüm und $z$ die Anzahl an Zigaretternverpackungen. Dann gilt:
......@@ -2180,6 +2183,7 @@ Das CLP(FD)-Modell habe ich von meinem Betreuer Joshua Schmidt übernommen. Sieh
\paragraph*{Implementierung}
In diesem Modell übernehmen CLP(FD) und MiniZinc die selbe Idee, die in \emph{13.1 Implementierung} beschrieben is. Jedoch wird diese Idee unterschiedlich implementiert. In CLP(FD) wird diese Idee mithilfe von Coroutinen implementiert. In MiniZinc wird diese Idee mithilfe von Kanten (Paare von Knoten) und mathematischen Symbolen (Negation und Existenzquantor) implementiert. Es ist zu beachten, dass das MiniZinc-Modell kürzer und lesbarer ist als das CLP(FD)-Modell.
\newpage
\paragraph*{Performance}
Dieses Modell kann nicht vom SICStus-MiniZinc-Solver gelöst werden, da nur endliche Integer-Domänen unterstützt werden und hier var set Variablen verwendet werden. Für die Medianberechnung ist die Eingabe in CLP(FD):
\begin{center}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment