103 lines
4.6 KiB
TeX
103 lines
4.6 KiB
TeX
\documentclass[a4paper,10pt,ngerman]{scrartcl}
|
|
\usepackage{babel}
|
|
\usepackage[a4paper,margin=2.5cm]{geometry}
|
|
|
|
% automatische Quotes
|
|
\usepackage{csquotes}
|
|
|
|
% Die nächsten drei Felder bitte anpassen:
|
|
\newcommand{\Name}{Arne Keller} % Teamname oder eigenen Namen angeben
|
|
\newcommand{\TeilnahmeId}{50966}
|
|
\newcommand{\Aufgabe}{Aufgabe 2: Dreiecksbeziehungen}
|
|
|
|
% Kopf- und Fußzeilen
|
|
\usepackage{scrlayer-scrpage, lastpage}
|
|
\setkomafont{pageheadfoot}{\textrm}
|
|
\lohead{\Aufgabe}
|
|
\chead{\thepage{}/\pageref{LastPage}}
|
|
\rohead{\Name/Teilnahme-Id: \TeilnahmeId}
|
|
\cfoot{}
|
|
|
|
% Für mathematische Befehle und Symbole
|
|
\usepackage{amsmath,amsthm,amssymb,gensymb}
|
|
|
|
% Für Bilder
|
|
\usepackage{graphicx,subcaption,float}
|
|
% Für Skizzen
|
|
\usepackage{tkz-euclide}
|
|
\usetkzobj{all}
|
|
|
|
% Für Quelltext
|
|
\usepackage{listings}
|
|
\usepackage{color}
|
|
\definecolor{mygreen}{rgb}{0,0.6,0}
|
|
\definecolor{mygray}{rgb}{0.5,0.5,0.5}
|
|
\definecolor{mymauve}{rgb}{0.58,0,0.82}
|
|
\lstset{
|
|
keywordstyle=\color{blue},commentstyle=\color{mygreen},
|
|
stringstyle=\color{mymauve},rulecolor=\color{black},
|
|
basicstyle=\footnotesize\ttfamily,numberstyle=\tiny\color{mygray},
|
|
captionpos=b, % sets the caption-position to bottom
|
|
keepspaces=true, % keeps spaces in text
|
|
numbers=left, numbersep=5pt, showspaces=false,showstringspaces=false,
|
|
showtabs=false, stepnumber=2, tabsize=2, title=\lstname
|
|
}
|
|
\lstdefinelanguage{Rust}{
|
|
keywords={break, match, continue, else, for, fn, if, return, self, let, mut, loop, while, extern, crate, use, static, enum, struct, impl, as, type, derive, mod},
|
|
morecomment=[l]{//},
|
|
morecomment=[s]{/*}{*/},
|
|
morestring=[b]",
|
|
sensitive=true
|
|
}
|
|
|
|
% Diese beiden Pakete müssen als letztes geladen werden
|
|
%\usepackage{hyperref} % Anklickbare Links im Dokument
|
|
%\usepackage{cleveref}
|
|
|
|
% Daten für die Titelseite
|
|
\title{\Aufgabe}
|
|
\author{\Name\\Teilnahme-ID: \TeilnahmeId}
|
|
\date{29. April 2019}
|
|
|
|
|
|
\begin{document}
|
|
\maketitle
|
|
\tableofcontents
|
|
|
|
\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.
|
|
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}
|
|
Das Programm liest die Problemstellung von der Standardeingabe ein. Die grafische Ausgabe wird in die Standardausgabe geschrieben. Kommandozeilenparameter werden nicht verarbeitet.
|
|
|
|
\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.
|
|
|
|
\subsection{Optimierungen}
|
|
Wie bereits erwähnt, werden Aufteilungen mit kleinerer Breite zuerst abgearbeitet.
|
|
|
|
\section{Beispiele}
|
|
\lstinputlisting[caption=Lösung für dreiecke1.txt,frame=single,breaklines=true]{worldr1.txt}
|
|
\begin{figure}[H]
|
|
\def\svgwidth{\columnwidth}
|
|
\input{worldr1.pdf_tex}
|
|
\caption{Visualisierung der Lösung für dreiecke1.txt}
|
|
\label{fig:Bild1}
|
|
\end{figure}
|
|
\lstinputlisting[caption=Lösung für dreiecke2.txt,frame=single,breaklines=true]{worldr2.txt}
|
|
\begin{figure}[H]
|
|
\def\svgwidth{\columnwidth}
|
|
\input{worldr2.pdf_tex}
|
|
\caption{Visualisierung der Lösung für dreiecke2.txt}
|
|
\label{fig:Bild1}
|
|
\end{figure}
|
|
|
|
\section{Quellcode (Hauptalgorithmus)}
|
|
\lstinputlisting[frame=single,language=Rust,breaklines=true]{src/main.rs}
|
|
|
|
\end{document}
|