Commit cd9840d1 authored by Amin Raslan's avatar Amin Raslan
Browse files

Replace vergleich_von_implementierungen.tex

parent edc323fe
......@@ -14,7 +14,7 @@ In diesem Kapitel geht es um die Implementierung und den Vergleich von 14 Modell
Zwei der Modelle, nämlich \emph{Send More Money} und \emph{Send Most Money}, sind in einem Kapitel mit dem Namen \emph{Send Money} zusammengefasst und besprochen, da sie aufeinander aufbauen. Alle restlichen Modelle befinden sich jeweils in einem eigenen Kapitel.
In \emph{3.x.1 Implementierung} wird für jedes Modell unter Anderem ein Pseudocode gegeben, der die Implementierungen in CLP(FD) und in MiniZinc verdeutlichen soll. In manchen Pseudocodes wird die selbst erstellte Funktion \emph{solve([Variablen], Bedingung1, Bedingung2, ...)} verwendet. Mit dieser Funktion ist gemeint, dass nach Lösungen für die eingegebenen Variablen unter allen eingegeben Bedingungen gesucht werden soll.
In \emph{3.x.1 Implementierung} wird für jedes Modell unter Anderem ein Pseudocode gegeben, der die Implementierungen in CLP(FD) und in MiniZinc verdeutlichen soll. In manchen Pseudocodes wird die selbst erstellte Funktion \emph{solve([Variablen], Bedingung1, Bedingung2, ...)} verwendet. Mit dieser Funktion ist gemeint, dass nach Lösungen für die eingegebenen Variablen unter allen eingegeben Bedingungen gesucht werden soll (wie \emph{labeling} in CLP(FD) und \emph{solve} in MiniZinc).
In \emph{3.x.2 Vergleich} wird unter Anderem auf die Performance eingegangen. Hierzu wurden die insgesamt 28 CLP(FD)- und MiniZinc-Modelle jeweils 50-Mal ausgeführt und dann wurde der Median davon in Millisekunden berechnet. Hierzu wurde der Median statt des Durchschnitts für die Berechnung der Laufzeiten gewählt, da die Modellbearbeitung manchmal wegen externer Faktoren länger dauern könnte. Hiermit ist der Durchschnitt eher weniger stabil. Die Laufzeiten wurden gemessen, wie in Liste~\ref{list:zeitmessungen} zu sehen ist.
......@@ -1207,18 +1207,16 @@ sum(Subs, #=, Target_Sum)
Dieses Prädikat bedeutet \emph{sum(subs) \#= Target\_Sum}.
\paragraph*{Performance}
Für die Medianberechnung verwenden wir hier 2 Eingaben. Bei der ersten Eingabe ist Set = {3, 34, 4, 12, 5, 2} und Target\_Sum = 9. Der Median ist dann:
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. In diesem Für die Medianberechnung verwenden wir hier 2 Eingaben. Bei der ersten Eingabe ist Set = {3, 34, 4, 12, 5, 2} und Target\_Sum = 9. Der Median ist dann:
\begin{itemize}
\item Der Median in \emph{CLP(FD)} liegt bei \textcolor{mypink}{0 ms}.
\item Der Median in \emph{MiniZinc} über \emph{MiniZincIDE} liegt bei \textcolor{mypink}{78.5 ms}.
\item Der Median in \emph{MiniZinc} über \emph{SICStus} liegt bei \textcolor{mypink}{ ms}.
\end{itemize}
Bei der zweiten Eingabe ist Subset = {3, 34, 4, 12, 5, 2} und Target\_Sum = 30. Für diese Eingaben existiert keine Lösung. Der Median ist dann:
\begin{itemize}
\item Der Median in \emph{CLP(FD)} liegt bei \textcolor{mypink}{1 ms}.
\item Der Median in \emph{MiniZinc} über \emph{MiniZincIDE} liegt bei \textcolor{mypink}{78 ms}.
\item Der Median in \emph{MiniZinc} über \emph{SICStus} liegt bei \textcolor{mypink}{ ms}.
\end{itemize}
In beiden Fällen ist CLP(FD) also schneller. Beide Eingaben wurden von \url{https://www.geeksforgeeks.org/subset-sum-problem-dp-25/} übernommen.
......@@ -1317,7 +1315,7 @@ Der Median sieht in diesem Modell folgendermaßen aus:
MiniZinc ist in diesem Modell also also langsamer. Wenn ein Array für die 19 Variablen in MiniZinc implementiert wird, dann sieht der Median folgendermaßen aus:
\begin{itemize}
\item Der Median in \emph{MiniZinc} über \emph{MiniZincIDE} liegt bei \textcolor{mypink}{60,5 ms}.
\item Der Median in \emph{MiniZinc} über \emph{SICStus} liegt bei \textcolor{mypink}{ ms}.
\item Der Median in \emph{MiniZinc} über \emph{SICStus} liegt bei \textcolor{mypink}{182,5 ms}.
\end{itemize}
......@@ -1832,7 +1830,7 @@ transpose(Rows, Columns)
Dieses Prädikat erhält eine Matrix und verwandelt die Reihen zu Zeilen und die Zeilen zu Reihen. Die Ausgabe ist also die selbe Matrix mit Reihen als Zeilen und Zeilen als Reihen. Somit kann \emph{alldiffierent} nun genauso mit den Reihen des Sudokus verwendet werden.
\paragraph*{Performance}
Nun kommen wir zu den Laufzeiten. Bei der Berechnung des Medians wurde das Sudoku in Abblidnug~\ref{fig:sudoku9} verwendet.
Nun kommen wir zu den Laufzeiten. Dieses Modell kann nicht vom SICStus-MiniZinc-Solver gelöst werden. Bei der Berechnung des Medians wurde das Sudoku in Abblidnug~\ref{fig:sudoku9} verwendet.
\begin{itemize}
\item Der Median in \emph{CLP(FD)} liegt bei \textcolor{mypink}{6,5 ms}.
\item Der Median in \emph{MiniZinc} über \emph{MiniZincIDE} liegt bei \textcolor{mypink}{80,5 ms}.
......@@ -2048,13 +2046,13 @@ Für die Medianberechnung wurde \emph{N = 3} eingesetzt:
\begin{itemize}
\item Der Median in \emph{CLP(FD)} liegt bei \textcolor{mypink}{1 ms}.
\item Der Median in \emph{MiniZinc} über \emph{MiniZincIDE} liegt bei \textcolor{mypink}{109 ms}.
\item Der Median in \emph{MiniZinc} über \emph{SICStus} liegt bei \textcolor{mypink}{ ms}.
\item Der Median in \emph{MiniZinc} über \emph{SICStus} liegt bei \textcolor{mypink}{238 ms}.
\end{itemize}
Weiterhin wird der Median für \emph{N = 2} (es existiert keine Lösung) berechnet:
\begin{itemize}
\item Der Median in \emph{CLP(FD)} liegt bei \textcolor{mypink}{1 ms}.
\item Der Median in \emph{MiniZinc} über \emph{MiniZincIDE} liegt bei \textcolor{mypink}{103.5 ms}.
\item Der Median in \emph{MiniZinc} über \emph{SICStus} liegt bei \textcolor{mypink}{ ms}.
\item Der Median in \emph{MiniZinc} über \emph{SICStus} liegt bei \textcolor{mypink}{203 ms}.
\end{itemize}
In beiden Fällen ist CLP(FD) also schneller als MiniZinc.
......@@ -2099,7 +2097,8 @@ Gerichteter Graph G
Ungerichteter Graph G
\end{center}
\end{minipage}
\caption{Beispiel eines Graphen. Links ist der Graph gerichtet mit G = \{\{1,2,3,4\},(1,2)(2,3)(3,4)\} und rechts ist er ungerichtet mit G = \{\{1,2,3,4\},\{1,2\}\{2,3\}\{3,4\}\}}
\caption{Beispiel eines Graphen. Links ist der Graph gerichtet mit G = \{\{1,2,3,4\},\{(1,2)(2,3)(3,4)\}\} und rechts ist er ungerichtet mit G = \{\{1,2,3,4\},\{\{1,2\},\{2,3\},\{3,4\}\}\}}
\label{fig:graph_beispiel}
\end{figure}
\begin{figure}[t]
......@@ -2122,10 +2121,77 @@ Ungerichteter Graph G
2 Knoten im Graphen sind adjazent, wenn sie eine direkte Kante dazwischen haben, das heißt wenn es zwischen ihnen eine Kante ohne Knoten gibt \cite{adjazenz}. Im Graphen in Abbildung~\ref{fig:graph_adjazenz} sind beispielsweise die Knoten 1 und 2, 2 und 3, 2 und 4 sowie 3 und 4 adjazent. Knoten 1 und 3 und Knoten 1 und 4 jedoch nicht, da sie keine direkte Kante haben, sondern Knoten 2 steht zwischen ihnen. In diesem Graphen ist die \emph{Dominating Set} gleich $\{2\}$, da Knoten 2 adjazent zu allen anderen Knoten im Graphen ist.
\subsubsection*{13.1 Implementierung}
Wir betrachten den Graphen als eine Liste von 2-elementigen-Listen in CLP(FD) beziehungsweise als ein Array von 2-elementigen-Arrays in MiniZinc (also ein 2-dimensionales Array). Die 2-elementigen-Listen beziehungsweise 2-elementigen-Arrays stehen für die Kanten zwischen den Knoten. Der Graph in Abbildung~\ref{fig:graph_adjazenz} wird also als folgende Liste beziehungsweise folgendes Array betrachtet:
\begin{center}
$[[1,2],[2,3],[2,4],[3,4]]$
\end{center}
Die Idee der Implementierung ist es, mit dem ersten Knoten (Knoten mit der kleinsten Nummer) anzufangen, die Knoten im Graphen zu durchlaufen, während es dabei gilt: Der Knoten, den wir gerade betrachten, ist in der Dominating Set und alle Knoten, die dazu adjazent sind, sind deswegen nicht in der Dominating Set. Diese Knoten betrachten wir beim Durchlaufen also nicht mehr, sondern wir überspringen sie. Wir berechnen so alle möglichen Dominating Sets. Da die gesuchte Dominating Set minimal sein soll, wählen wir dann die Kleinste von den möglichen Dominating Sets, die wir berechnet haben.
In diesem Modell sind die Implementierungen in CLP(FD) und in MiniZinc verschieden. In CLP(FD) werden Coroutinen verwendet. Das CLP(FD)-Modell erhält zusätzlich zum Graphen eine Liste an den vorhandenen Knoten als Parameter übergeben. Es wird für die Knoten ein Bitvektor erstellt. In diesem Bitvektor gibt es für jeden Knoten einen Bit, der ihn repräsentiert. Dieser Bit ist entweder gleich 1, wenn der entsprechende Knoten in der Dominating Set ist, oder gleich 0, wenn er nicht in der Dominating Set ist. Für diesen Bitvktor wird ein Mutable Dictionary mithilfe von der Bibleothek \emph{mutdict} erstellt. Dies ist eine Map mit Paaren von Schlüsselwerten (key values) für einen schnelleren Zugriff auf die Bits darin.
Weiterhin werden alle möglichen Bitvektors von allen möglichen Dominating Sets berechnet. Am Ende werden die Bits von den jeweiligen Bitvektors summiert und der Bitvektor mit der kleinsten Summe wird dann mithilfe von \emph{labeling} mit der Option \emph{min} gewählt. Schließlich wird die Dominating Set aus dem gewählten Bitvektor übersetzt und ausgegeben.
Die möglichen Bitvektors werden folgendermaßen berechnet: Wir durchlaufen die Liste von den Knoten. Es gilt: der Knoten, den wir gerade betrachten, ist in der Dominating Set und der Bit, der ihn im Bitvektor repräsentiert, wird auf 1 gesetzt, oder er wird auf 0 gestzt (also der Knoten ist nicht in der Dominating Set) und dann suchen wir alle Knoten, die zu diesem Knoten adjazent sind. Mindestens einer dieser adjazenten Knoten muss dann in der Dominating Set sein. Der Block vor dem Prädikat \emph{node\_is\_in\_dominating\_bit\_set\slash4} blockiert solange, bis \emph{labeling} aufgerufen wird und die Bits im Bitvektor auf 0 oder 1 gesetzt werden. Pseudocode~\ref{alg:k_dominating_set_clpfd} beschreibt auch die Implementierung vom Modell in CLP(FD).
\begin{algorithm}[t]
\caption{K Dominating Set in CLP(FD)}
\label{alg:k_dominating_set_clpfd}
\begin{algorithmic}[1]
\Function {k\_dominating\_set}{Nodes, Graph}:
\State DominatingSetNodes $\gets$ []
\State L $\gets$ \textbf{length}(Nodes)
\State DominatingSet[L] $\gets$ \textbf{domain}(0,1)
\ForAll {Node N in Graph}
\State N in DominatingSetNodes,
\State DominatingSet[N] = 1
\State \textbf{OR} DominatingSet[N] = 0,
\State mindestens ein zu N adjazenter Knoten M im Graphen ist in DominatingSetNodes,
\State DominatingSet[M] = 1
\EndFor
\State \textbf{solve}(DominatingSetNodes, \textbf{min}(\textbf{sum}(DominatingSet))
\State \Return DominatingSetNodes
\EndFunction
\end{algorithmic}
\end{algorithm}
\begin{algorithm}[t]
\caption{K Dominating Set in MiniZinc}
\label{alg:k_dominating_set_minizinc}
\begin{algorithmic}[1]
\Function {k\_dominating\_set}{Graph}:
\State K $\gets$ []
\ForAll {Kante L mit Knoten N und M in Graph}
\If {$\nexists$ S $\in$ K mit S adjazent zu N und M}
\State N \textbf{OR} M in K
\EndIf
\EndFor
\State \Return K
\EndFunction
\end{algorithmic}
\end{algorithm}
Das MiniZinc-Modell erhält nur den Graphen als Eingabe. Hier durchlaufen wir die Kanten des Graphen. Wir betrachten die Knoten also als Paare. Wenn wir ein Paar von Knoten betrachten, dann prüfen wir, ob ein Knoten in der Dominating Set existiert, der adjazent zu diesen Knoten sind. Falls nicht, dann ist mindestens einer dieser Knoten in der Dominating Set. Da wir in dieser Implementierung die Anzahl an Knoten brauchen, dividieren wir \emph{length(graph)} durch 2, denn \emph{length} gibt uns in MiniZinc die Anzahl aller Elemente im Array zurück, unabhängig davon, sie diese Elemente innerhalb des Arrays gruppiert sind (ob es sich zum Beispiel um ein 2-dimensionales Array handelt). Pseudocode~\ref{alg:k_dominating_set_minizinc} beschreibt auch die Implementierung vom Modell in MiniZinc.
Das CLP(FD)-Modell habe ich von meinem Betreuer Joshua Schmidt übernommen. Siehe Anhang~\ref{subsection:k_dominating_set} für die Implementierungen in CLP(FD) und in MiniZinc.
\subsubsection*{13.2 Vergleich}
\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.
\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}
k\_dominating\_set([1,2,3,4,5,6,7,8,9,10],[[1,2],[2,3],[3,4],[2,5],[5,6],[2,7],[7,8],[8,9],[9,10],[10,8]], S)
\end{center}
und in MiniZinc:
\begin{center}
Graph = [|1,2|2,3|3,4|2,5|5,6|2,7|7,8|8,9|9,10|8,10|]
\end{center}
\begin{itemize}
\item Der Median in \emph{CLP(FD)} liegt bei \textcolor{mypink}{ ms}.
\item Der Median in \emph{MiniZinc} über \emph{MiniZincIDE} liegt bei \textcolor{mypink}{ ms}.
\item Der Median in \emph{MiniZinc} über \emph{SICStus} liegt bei \textcolor{mypink}{ ms}.
\end{itemize}
\ No newline at end of file
\item Der Median in \emph{CLP(FD)} liegt bei \textcolor{mypink}{10 ms}.
\item Der Median in \emph{MiniZinc} über \emph{MiniZincIDE} liegt bei \textcolor{mypink}{120 ms}.
\end{itemize}
Das CLP(FD)-Modell ist also schneller als das MiniZinc-Modell.
\ No newline at end of file
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