Doc updates

This commit is contained in:
arnekeller 2019-04-07 16:30:37 +02:00
parent 470a672afb
commit 3c694166b2

View File

@ -220,23 +220,23 @@ Außerdem wird Lisa auf einer optimalen Route vor dem letzten Abschnitt immer vo
\label{fig:winkel}
\end{figure}
\subsection{Laufzeitanalyse}
Wenn in jedem Schritt jede andere Polygonecke berücksichtigt wird, hat der Algorithmus im schlechtesten Fall eine Laufzeit von $O(n!)$, wobei $n$ die Anzahl der Ecken der Polygone ist. Effektiv können allerdings in jedem Schritt nur eine kleine Anzahl anderer Ecken erreicht werden. Das Programm durchsucht auch erst Möglichkeiten, die eher zu einer Lösung führen, was die Laufzeit weiter verringert.
\section{Bedienung des Programms}
Das Programm liest die Problemstellung von der Standardeingabe ein. Die grafische Ausgabe wird in die Standardausgabe geschrieben. Wird $-t$ übergeben, kann die Ausgabe in einem \LaTeX-Dokument verwendet werden. Standardmäßig wird ein SVG-Dokument erzeugt. Mit $-s$ werden auch Zwischenlösungen im aktuellen Ordner als SVG-Dateien gespeichert. Falls man die Geschwindigkeit von Lisa oder dem Bus verändern will, kann man dies mit $-l$ bzw. $-b$ tun. Für zusätzliche Debug-Ausgaben kann man $-d$ verwenden. Die Standardoptionen $-h$ und $-V$ zeigen die Hilfe und die Version des Programms an.
\lstinputlisting[caption=Hilfetext des Programmes,frame=single,breaklines=true]{help.txt}
Das vorgegebene Eingabeformat ist mühsam zu schreiben. Daher kann das Programm auch SVG-Dateien einlesen. Punkte werden als Startpunkte interpretiert, sonstige Pfade sind Hindernisse.
\section{Umsetzung}
Das Programm durchsucht in einer optimierten Breitensuche alle Wege, die über Polygonecken führen. Priorisiert (mit einem binären Max-Heap) werden jene Wege, bei denen Lisa theoretisch am längsten warten könnte. Um die Route abzuschließen, probiert das Programm danach immer, einen optimalen Weg zur y-Achse zu finden (dieser trifft sie im 60\degree-Winkel, wie oben beschrieben). Die Route, bei dem Lisa sich am meisten Zeit lassen kann, wird gespeichert, falls nicht schon eine bessere Lösung gefunden wurde. Die Suche ist beendet, sobald alle unvollständigen Routen die beste Wartezeit nicht mehr verbessern können.
Das Programm benutzt den Dijkstra-Algorithmus, um die beste Route für Lisa zu finden. Lisas Haus und die Ecken aller Polygone kann man sich als Graph vorstellen. Die Kanten des Graphen haben ein Gewicht, das der Zeit entspricht, die Lisa früher aufstehen müsste, wenn sie zu einer bestimmten Ecke geht, statt direkt zum Bus zu gehen. Um die Route abzuschließen, probiert das Programm danach immer, einen optimalen Weg zur y-Achse zu finden (dieser trifft sie im 60\degree-Winkel, wie oben beschrieben). Die Route, bei dem Lisa sich am meisten Zeit lassen kann, wird gespeichert.
Der Weg von Lisa und dem Bus ist animiert. Zusätzlich zu den unbedingt benötigten Ausgaben wie z.B. der Start- und Zielzeit gibt das Programm auch noch die theoretisch (ohne Hindernisse) beste Startzeit und während der Suche gefundene Verbesserungen aus.
Der Weg von Lisa und dem Bus wird animiert ausgegeben. Zusätzlich zu den unbedingt benötigten Ausgaben wie z.B. der Start- und Zielzeit gibt das Programm auch noch die theoretisch (ohne Hindernisse) beste Startzeit und während der Suche gefundene Verbesserungen aus.
\subsection{Laufzeitanalyse}
Da programmintern der Dijkstra-Algorithmus verwendet wird, entspricht die Laufzeit in etwa diesem. Somit ist die Zeitkomplexität ca. $O(n^2)$, wobei $n$ die Anzahl der Ecken aller Polygone ist. Effektiv können allerdings in jedem Schritt nur eine kleine Anzahl anderer Ecken erreicht werden, was den Algorithmus beschleunigt.
\subsection{Optimierungen}
Wie bereits in der Laufzeitanalyse kurz angesprochen, benutzt das Programm bestimmte Heuristiken, um die Suche zu beschleunigen. Eine davon ist die maximal mögliche Wartezeit für eine bestimmte Route. Dafür berechnet das Programm die höchstmögliche Position des Busses, was proportional zur gesuchten Größe ist.
Um zu überprüfen, ob ein Routenabschnitt die Hindernisse schneidet, wird unter anderem ein R*-Baum benutzt. Fûr ca. 40 Polygonen ist diese Methode ca. 5-6x schneller als alle Polygone zu überprüfen. Die Geschwindigkeitsgewinne werden größer, je mehr Polygone vorhanden sind. Zudem wird das Ergebnis in einer Hashtabelle gespeichert, was die insgesamte Performanz ca. 6-10x steigert ($\frac{n*(n-1)}{2}$ Berechnungen statt $n!$).
Um zu überprüfen, ob ein Routenabschnitt die Hindernisse schneidet, wird unter anderem ein R*-Baum benutzt. Fûr ca. 40 Polygonen ist diese Methode ca. 5-6x schneller als alle Polygone zu überprüfen. Die Geschwindigkeitsgewinne werden größer, je mehr Polygone vorhanden sind. Zudem wird das Ergebnis in einer Hashtabelle gespeichert, was die insgesamte Performanz ca. 6-10x steigert.
\section{Beispiele}
Alle Beispiele sind im Maßstab 1:70m. Für die folgenden fünf Beispiele benötigt das Programm höchstens 10 ms Rechenzeit.