Commit 8f4d11cf authored by jakropp's avatar jakropp
Browse files

Hier.

parent fc2f1980
......@@ -44,7 +44,7 @@ wobei die $x_i$ paarweise verschieden sind. [...] Die Anzahl an Kanten eines Weg
\end{theorem}
\begin{theorem}{Knotenkonstellationen.}
Knotenkonstellationen sind Quadtupel $(a, b, c, d)\subseteq V^4$ , wo alle vier Knoten unterschiedlich sind.
Knotenkonstellationen sind Quadrupel $(a, b, c, d)\subseteq V^4$ , wo alle vier Knoten unterschiedlich sind.
\end{theorem}
\begin{theorem}{Route.}
......@@ -112,8 +112,9 @@ public class Node<E> {
\texttt{nodeNum} ist eine universelle Nummer jedes \textit{Knoten}.\newline
\texttt{data} ist eine Bezeichnung für den \textit{Knoten}. Im Fall unseres Gleisnetzes hat jeder Abschnitt eine Zahl von 100 bis 114 oder von 200 bis 220. Es ist aber auch möglich, andere Bezeichnungen für die Knoten zu nutzen, beispielsweise Buchstaben. \newline
In der Liste \texttt{children} werden für jede Knoten seine benachbarten Knoten gespeichert, um diese schnell erfassen zu können. Dafür wird eine \texttt{LinkedList} genutzt.
Alle Knoten, zu denen der aktuelle Knoten eine Kante hat, sollen dort gespeichert werden. Diese Darstellung speichert implizit die Kanten, ohne diese explizit erwähnen zu müssen. Es muss dabei nur darauf geachtet werden, dass wenn man eine Kante speichern will, dies in \texttt{children} von beiden Knoten realisiert werden muss, da der Graph ungerichtet ist.\newline
In der Liste \texttt{children} werden für jede Knoten seine benachbarten Knoten gespeichert, um diese schnell erfassen zu können. Dafür wird eine \texttt{LinkedList} genutzt.
Alle Knoten, zu denen der aktuelle Knoten eine Kante hat, sollen dort gespeichert werden. Diese Darstellung speichert implizit die Kanten, ohne diese explizit erwähnen zu müssen. Es muss dabei nur darauf geachtet werden, dass wenn man eine Kante speichern will, dies in \texttt{children} von beiden Knoten realisiert werden muss, da der Graph ungerichtet ist.
Children fungiert hierbei also als Adjazenzliste.\newline
Es gibt folgende Funktionen auf Knoten, zu sehen in Listing \ref{functAufKnoten}.
......@@ -160,11 +161,7 @@ Es gibt folgende Funktionen auf Knoten, zu sehen in Listing \ref{functAufKnoten}
return data.toString();
}
\end{lstlisting}
\texttt{getData} gibt den Bezeichner des aktuellen Knotens zurück. In unserem Gleisnetz beispielsweise die Zahl 105.\newline
Mit \texttt{setData} kann man diese Bezeichnung bei Bedarf ändern, um beispielsweise Doppelbenennungen zu vermeiden.\newline
\texttt{getChildren} gibt alle angrenzenden Knoten des aktuellen Knoten zurück, welche in einer \texttt{LinkedList} gespeichert sind.\newline
Die Funktion \texttt{setChildren} erlaubt uns, die Liste der aktuellen Kinder durch eine neuere zu ersetzen.\newline
Möchte man nur einen neuen Knoten zu den erreichbaren Kindern hinzufügen, kann man dies mit \texttt{addChildren}
Möchte man nur einen neuen Knoten zu den erreichbaren Kindern hinzufügen, kann man dies mit \texttt{addChild}
realisieren.\newline
Möchte man wissen, wie viele Knoten man insgesamt erstellt hat, gibt die Funktion \texttt{getNodeNum} diese Information zurück.\newline
Außerdem sollen zwei Knoten verglichen werden können. Zwei Knoten sollen hierbei genau dann gleich sein, wenn \texttt{data}
......@@ -172,7 +169,7 @@ gleich ist, da dies ein eindeutiger Bezeichner sein soll.\newline
Ebenso soll der \texttt{HashCode} nur abhängig von \texttt{data} sein.\newline
Falls man einen Knoten ausgeben möchte, soll auch dort der eindeutige Bezeichner \texttt{data} genutzt werden.\newline
Zusätzlich zu dem Graphen des Gleisnetzes, in dem ein Knoten einen messbaren Abschnitt auf dem Gleisnetz darstellt, wird noch ein Knotenkonstellationsgraph verwendet. In diesem Graphen sind die Knoten Quadtupel aus Gleisabschnitten, sogenannte Knotenkonstellationen, wobei jeder Abschnitt höchstens einmal im selben Tupel vorkommen darf. \newline
Zusätzlich zu dem Graphen des Gleisnetzes, in dem ein Knoten einen messbaren Abschnitt auf dem Gleisnetz darstellt, wird noch ein Knotenkonstellationsgraph verwendet. In diesem Graphen sind die Knoten Quadrupel aus Gleisabschnitten, sogenannte Knotenkonstellationen, wobei jeder Abschnitt höchstens einmal im selben Tupel vorkommen darf. \newline
In diesem Graphen werden alle erreichbaren Konstellationen gespeichert, also alle erreichbaren Möglichkeiten, wie vier Züge von einer Startkonstellation aus auf dem TEAMOD-Schienennetz stehen können. Dieser Graph soll am Anfang nur die Startkonstellation enthalten und im Verlauf des Algorithmus mit allen erreichbaren Knotenkonstellationen erweitert werden. Am Ende kann man diesen Graph dann nutzen, um herauszufinden, ob alle Knotenkonstellationen erreichbar sind oder ob es unerreichbare Knotenkonstellationen gibt. Des Weiteren wird dieser Graph benötigt, um den kürzesten Pfad von einer Startkonstellation zu einer Zielkonstellation aus je vier Abschnitten zu berechnen.
Umgangssprachlich bezeichnet ein Deadlock im Bahnbereich eine Situation, in der zwei oder mehr Züge sich auf ihrer Route verklemmen und somit nicht weiterfahren können, ohne dass mindestens ein Zug seine aktuelle Route verlassen oder zurückfahren muss.
......@@ -223,7 +220,7 @@ würde wie folgt aussehen:
\begin{figure}[H]
\centering
\includegraphics[width=\textwidth,keepaspectratio=true,height=\textheight]{../graphproblems/beispiel/kgraphfertig.png}
\caption{Knotenkonstellationsgraph für \ref{fig:dl2}
\caption{Knotenkonstellationsgraph für \ref{fig:dl2}}
\label{fig:kgraphf}
\end{figure}
Hier stehen alle Konstellationen, welche erreichbar sind. Ganz oben steht die Startkonstellation. Man kann schnell sehen, dass die Zielkonstellation aus \ref{fig:dl2}
......@@ -232,7 +229,7 @@ $[207, 203, 208, 202]$ nicht in der Menge der von der Startkonstellation erreich
Der Nachteil dieses Konstellationsgraphen ist die erhöhte Knotenanzahl.
Während der Knotengraph des Gleisnetzes 37 Knoten hat, hat der vollständige Konstellationsgraph für vier Züge auf demselben Gleisnetz insgesamt $37*36*35*34= 1585080$ Knoten. Die Zahl der Knoten erhöht sich also exponentiell zur Anzahl der Züge.
Man bezeichnet den Graphen, dessen Knoten Gleisabschnitte sind, zukünftig als Knotengraph oder im Code als \textit{TrackModel} und den anderen Graphen mit den Quadtupeln als Knoten als \textit{Konstellationsgraph} oder im Code als \texttt{BehaviouralModel}.
Man bezeichnet den Graphen, dessen Knoten Gleisabschnitte sind, zukünftig als Knotengraph oder im Code als \textit{TrackModel} und den anderen Graphen mit den Quadrupeln als Knoten als \textit{Konstellationsgraph} oder im Code als \texttt{BehaviouralModel}.
Beim Start der \texttt{main} Methode werden manuell alle Knoten erstellt, wie folgender Ausschnitt verdeutlichen soll:
......@@ -299,10 +296,9 @@ So ist es möglich, nur mit dem Startknoten das ganze Gleisnetz zu repräsentier
Der Konstellationsgraph bekommt beim Erstellen eine Startkonstellation übergeben und nutzt die Kanten der Knoten im Knotengraphen, um von dieser Startkonstellation erreichbare Knotenkonstellationen
zu berechnen.\newline
Außerdem existiert eine Liste \texttt{data2Node} in jedem Graphen, worin ein Mapping zwischen Bezeichner und zugehöriger Knoten des Knotens enthalten ist.
Außerdem existiert eine Liste \texttt{data2Node} in jedem Graphen, worin ein Mapping zwischen Bezeichner und zugehörigen Knoten enthalten ist.
So wird beispielsweise der Knoten mit dem Gleisabschnitt 205 als Inhalt, unter dem Namen 205 abgespeichert.
Falls man nun direkt auf diesen Knoten zugreifen will, muss man nicht vom Startnode alle Nachbarn rekursiv absuchen, sondern kann gleich mit
\begin{lstlisting}[language=Java, firstnumber=1]
data2node.get(205)
\end{lstlisting}
......@@ -538,7 +534,7 @@ Wie bereits in der Algorithmusidee erläutert, sollen in einer Warteschlange all
In Zeile 28 wird diese Warteschlange als \texttt{q} erstellt. Durch die Erweiterung für den Ausblick, werden statt einzelne Knoten eine Liste von Knoten gespeichert. Diese Listen sind jeweils ein Pfad vom Startknoten zu den jeweils letzten Knotenkonstellationen in der Liste und werden genutzt, um sofort den Pfad zurückgeben zu können, wenn die Knotenkonstellation \texttt{goal} erreicht wird. Dieser Pfad besteht aus einer Liste von \texttt{TrainTuple}, welche alle benachbart und unterschiedlich sind.\newline
Für die Funktion im Ausblick wird \texttt{currentPath} benötigt, um den Pfad zurückgeben zu können, wenn der Pfad zum Ziel führt.
Da in der Queue nur \texttt{ArrayLists} von \texttt{TrainTuple} gespeichert werden können, wird mit \texttt{begin} und \texttt{begin.add(getStartNode())} der Startknoten in eine \texttt{ArrayList} konvertiert, die nur den Startknoten enthält und fügen diesen dann zur Warteschlange hinzu (Zeile 34). Außerdem soll \texttt{data2node} alle TrainTupel speichern, welche erreichbar sind. Also wird durch den Teil in Zeile 37 der Startknoten hinzugefügt, da dieser definitiv erreichbar ist.\newline
Da in der Queue nur \texttt{ArrayLists} von \texttt{TrainTuple} gespeichert werden können, wird mit dem Erstellen von \texttt{begin} (Zeile 32) und \texttt{begin.add(getStartNode())} (Zeile 33) der Startknoten in eine \texttt{ArrayList} konvertiert, die nur den Startknoten enthält und fügen dann diese ArrayList \texttt{begin} zur Warteschlange hinzu (Zeile 34). Außerdem soll \texttt{data2node} alle TrainTupel speichern, welche erreichbar sind. Also wird durch den Teil in Zeile 37 der Startknoten hinzugefügt, da dieser definitiv erreichbar ist.\newline
\begin{lstlisting}[language=Java, firstnumber=40]
while ( ! q.isEmpty() ) {
......@@ -610,14 +606,14 @@ Solange nun noch Elemente in der Warteschlange sind, wiederhole folgende Schritt
\item Für jeden einzelnen dieser Züge berechne alle benachbarten Positionen, die nicht von einem anderen Zug belegt sind.(Zeile 56-95)
\end{enumerate}
Im vierten Schritt existieren vier \texttt{for} Schleifen. Jede berechnetet für einen anderen Zug alle Nachbarn. Die erste Schleife berechnet also für den Zug bei \texttt{c0} alle Nachbarn. Die zweite die Nachbarn für \texttt{c1} usw.\newline
Im vierten Schritt existieren vier \texttt{for}-Schleifen. Jede berechnetet für einen anderen Zug alle Nachbarn. Die erste Schleife berechnet also für den Zug bei \texttt{c0} alle Nachbarn. Die zweite die Nachbarn für \texttt{c1} usw.\newline
Dieser Schritt 4 wird häufig wiederholt und in jedem Schleifendurchlauf wird eine andere mögliche Knotenkonstellation getestet. In jedem Durchlauf wird ein Zug aus dem Tupel der aktuellen Position[c0, c1, c2, c3] durch einen Nachbarn ersetzt.
Falls dadurch eine ungültige Kombination entsteht, weil zwei Züge auf derselben Position stehen oder ein Zug den Sicherheitsabstand zu einem anderen Zug verletzen würde, wird diese Kombination übersprungen dank \texttt{continue}.
Der Sicherheitsabstand gilt dann als verletzt, wenn ein Zug auf eine neue Position fährt und diese \texttt{c0}, \texttt{c1}, \texttt{c2} oder \texttt{c3} entspricht, da
dort im letzten Zeitschritt definitiv ein Zug stand.\newline
\begin{enumerate}
\setcounter{enumi}{4}
\item Prüfe für das so entstandene Quadtupel im aktuellen Schleifendurchlauf, ob alle vier Positionen unterschiedlich sind. (Zeile 81-82)
\item Prüfe für das so entstandene Quadrupel im aktuellen Schleifendurchlauf, ob alle vier Positionen unterschiedlich sind. (Zeile 81-82)
Falls nicht, gehe zu Schritt 9\newline
\end{enumerate}
Gelangt man in den Abschnitt ab Zeile 95, so wurde ein neuer gültiger Nachbar gefunden.
......@@ -654,7 +650,7 @@ Gelangt man in den Abschnitt ab Zeile 95, so wurde ein neuer gültiger Nachbar g
\end{lstlisting}
\begin{enumerate}
\setcounter{enumi}{5}
\item Falls ja, ist dies ein erreichbares Quadtupel. Schaue nach, ob dies bereits in den erreichten Knoten von \texttt{data2node} steht.(Zeile 109-111) Falls ja, gehe zu Schritt 9.
\item Falls ja, ist dies ein erreichbares Quadrupel. Schaue nach, ob dies bereits in den erreichten Knoten von \texttt{data2node} steht.(Zeile 109-111) Falls ja, gehe zu Schritt 9.
\item Ist der entsprechende Eintrag in \texttt{data2node} leer, ist das ein neuer Knoten. Speichere ihn in \texttt{data2node},
füge ihn am Ende des aktuellen Pfades ein und füge diesen neuen Pfad in die Warteschlange ein. (Zeile 100-109)
......
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