Update docs

This commit is contained in:
Arne Keller 2019-04-29 11:14:30 +02:00
parent 89ad12842d
commit a0fe73fc21

View File

@ -65,20 +65,13 @@
\tableofcontents \tableofcontents
\section{Lösungsidee} \section{Lösungsidee}
Ähnlich wie man für Lisa in der ersten Aufgabe Kurven ausschließen kann, kann man für diese Aufgabe feststellen, dass zwei Dreiecke, die nebeneinander platziert sind, sich immer berühren. Berühren können sich diese entweder Kante an Kante oder nur an einem Punkt. Wenn zwischen zwei Dreiecken noch Platz ist, könnten diese näher zusammenrücken. Daher kann man annehmen, dass in jeder optimalen Lösung kein freier Platz (der belegt werden könnte) zwischen zwei benachbarten Dreiecken ist. Die Anzahl der möglichen Anordnungen ist sehr groß. Schon die Reihenfolge der Dreiecke hat viele Möglichkeiten. Daher ist es schneller, zufällig gefundene Lösungen zu optimieren. Mit einigen Heuristiken können akzeptable, aber nicht optimale, Anordnungen gefunden werden.
Mit dieser Einschränkung erscheint eine Brute-Force-Suche mit Heuristiken möglich, wenn auch nicht besonders elegant.
\subsection{Laufzeitanalyse}
Jedes Dreieck kann auf eine der drei Seiten gelegt werden. Zudem kann es horizontal gespiegelt werden. Somit haben wir für das \enquote{erste} Dreieck, das platziert wird, $6n$ Möglichkeiten. Andere Dreiecke können auf linker oder rechter Seite platziert werden: $4*6(n-1)$ Möglichkeiten. Wie bei vielen Brute-Force-Suchen ist die Laufzeit daher ca. $O(n!)$. Heuristiken können helfen, die Laufzeit in der Praxis zu verkürzen.
\section{Bedienung des Programms} \section{Bedienung des Programms}
Das Programm liest die Problemstellung von der Standardeingabe ein. Die grafische Ausgabe wird in die Standardausgabe geschrieben. Kommandozeilenparameter werden nicht verarbeitet. Das Programm liest die Problemstellung von der Standardeingabe ein. Informationen über gefundene Lösungen und Visualisierungen dieser werden im aktuellen Verzeichnis gespeichert. Der Gesamtabstand gefundener Anordnungen wird auch in der Standardausgabe angezeigt.
\section{Umsetzung} \section{Umsetzung}
Als Startzustand werden alle Dreiecke in jeweils sechs Konfigurationen gespeichert. Auf solche unvollständigen Aufteilungen baut die Hauptschleife auf. Es wird dabei immer zuerst die Konfiguration mit der kleinsten Breite zuerst bearbeitet, um so zuerst möglicherweise bessere Konfigurationen zu verarbeiten. Zu einer unvollständigen Aufteilung versucht das Programm dann, eins der verbleibenden Dreiecke hinzuzufügen (???). Dieses neue Dreieck kann natürlich zwischen zwei Dreiecke, links neben alle Dreiecke oder rechts neben alle Dreiecke platziert werden. Als Drehwinkel werden genau solche probiert, bei denen das Dreieck entweder an der Straße mit einer Seite liegt oder ein anderes Dreieck berührt. Zuerst wird eine zufällige Anordnung der Grundstücke generiert. Dafür werden beliebige Grundstücke getauscht, gedreht und gespiegelt. Danach werden zufällige Optimierungen ausprobiert: entweder werden alle Winkel und Spiegelungen oder nur ein Winkel verändert. Mit dieser Kombination sind sowohl grundlegende Änderungen als auch Feinabstimmungen möglich. Bis durch diese keine Verbesserung mehr gefunden wird. Ist die so gefundene Anordnung besser als bereits gefundene, wird sie gespeichert. Dieser Prozess wird wiederholt, bis der Anwender das Programm beendet.
\subsection{Optimierungen}
Wie bereits erwähnt, werden Aufteilungen mit kleinerer Breite zuerst abgearbeitet.
\section{Beispiele} \section{Beispiele}
\lstinputlisting[caption=Lösung für dreiecke1.txt,frame=single,breaklines=true]{worldr1.txt} \lstinputlisting[caption=Lösung für dreiecke1.txt,frame=single,breaklines=true]{worldr1.txt}
@ -86,14 +79,35 @@ Wie bereits erwähnt, werden Aufteilungen mit kleinerer Breite zuerst abgearbeit
\def\svgwidth{\columnwidth} \def\svgwidth{\columnwidth}
\input{worldr1.pdf_tex} \input{worldr1.pdf_tex}
\caption{Visualisierung der Lösung für dreiecke1.txt} \caption{Visualisierung der Lösung für dreiecke1.txt}
\label{fig:Bild1} \label{fig:d1}
\end{figure} \end{figure}
\lstinputlisting[caption=Lösung für dreiecke2.txt,frame=single,breaklines=true]{worldr2.txt} \lstinputlisting[caption=Lösung für dreiecke2.txt,frame=single,breaklines=true]{worldr2.txt}
\begin{figure}[H] \begin{figure}[H]
\def\svgwidth{\columnwidth} \def\svgwidth{\columnwidth}
\input{worldr2.pdf_tex} \input{worldr2.pdf_tex}
\caption{Visualisierung der Lösung für dreiecke2.txt} \caption{Visualisierung der Lösung für dreiecke2.txt}
\label{fig:Bild1} \label{fig:d2}
\end{figure}
\lstinputlisting[caption=Lösung für dreiecke3.txt,frame=single,breaklines=true]{worldr3.txt}
\begin{figure}[H]
\def\svgwidth{\columnwidth}
\input{worldr3.pdf_tex}
\caption{Visualisierung der Lösung für dreiecke3.txt}
\label{fig:d3}
\end{figure}
\lstinputlisting[caption=Lösung für dreiecke4.txt,frame=single,breaklines=true]{worldr4.txt}
\begin{figure}[H]
\def\svgwidth{\columnwidth}
\input{worldr4.pdf_tex}
\caption{Visualisierung der Lösung für dreiecke4.txt}
\label{fig:d4}
\end{figure}
\lstinputlisting[caption=Lösung für dreiecke5.txt,frame=single,breaklines=true]{worldr5.txt}
\begin{figure}[H]
\def\svgwidth{\columnwidth}
\input{worldr5.pdf_tex}
\caption{Visualisierung der Lösung für dreiecke5.txt}
\label{fig:d5}
\end{figure} \end{figure}
\section{Quellcode (Hauptalgorithmus)} \section{Quellcode (Hauptalgorithmus)}