This commit is contained in:
Arne Keller 2019-02-09 23:11:29 +01:00
parent 6a29ec6223
commit ddc323eba7
2 changed files with 10 additions and 1 deletions

View File

@ -221,6 +221,9 @@ Außerdem wird Lisa auf einer optimalen Route vor dem letzten Abschnitt immer vo
\label{fig:winkel} \label{fig:winkel}
\end{figure} \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{Umsetzung} \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 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.
@ -228,30 +231,35 @@ Die so gefundene Route kann in einer svg-Datei gespeichert werden. Während der
\section{Beispiele} \section{Beispiele}
Alle Beispiele sind im Maßstab 1:70m. Alle Beispiele sind im Maßstab 1:70m.
\lstinputlisting[caption=Lösung für lisarennt1.txt,frame=single,breaklines=true]{run1.txt}
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\input{run1.tkz} \input{run1.tkz}
\caption{Beispiel 1} \caption{Beispiel 1}
\label{fig:bsp1} \label{fig:bsp1}
\end{figure} \end{figure}
\lstinputlisting[caption=Lösung für lisarennt2.txt,frame=single,breaklines=true]{run2.txt}
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\input{run2.tkz} \input{run2.tkz}
\caption{Beispiel 2} \caption{Beispiel 2}
\label{fig:bsp2} \label{fig:bsp2}
\end{figure} \end{figure}
\lstinputlisting[caption=Lösung für lisarennt3.txt,frame=single,breaklines=true]{run3.txt}
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\input{run3.tkz} \input{run3.tkz}
\caption{Beispiel 3} \caption{Beispiel 3}
\label{fig:bsp3} \label{fig:bsp3}
\end{figure} \end{figure}
\lstinputlisting[caption=Lösung für lisarennt4.txt,frame=single,breaklines=true]{run4.txt}
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\input{run4.tkz} \input{run4.tkz}
\caption{Beispiel 4} \caption{Beispiel 4}
\label{fig:bsp4} \label{fig:bsp4}
\end{figure} \end{figure}
\lstinputlisting[caption=Lösung für lisarennt5.txt,frame=single,breaklines=true]{run5.txt}
\begin{figure}[H] \begin{figure}[H]
\centering \centering
\input{run5.tkz} \input{run5.tkz}

View File

@ -66,7 +66,7 @@ fn main() {
delay: max_possible_delay(bus, house), delay: max_possible_delay(bus, house),
}; };
eprintln!("Maximum: {:?}", delay_to_time(start.delay)); eprintln!("Theoretisches Maximum: {:?}", delay_to_time(start.delay));
// Zustände in Max-Heap sortieren // Zustände in Max-Heap sortieren
let mut states = BinaryHeap::new(); let mut states = BinaryHeap::new();
@ -161,6 +161,7 @@ fn main() {
states.extend(all); states.extend(all);
} }
} }
eprintln!("Finale Lösung:");
let route = best; let route = best;
eprintln!("Startzeit: {:?}", delay_to_time(best_delay)); eprintln!("Startzeit: {:?}", delay_to_time(best_delay));
eprintln!( eprintln!(