Commit 202f767e authored by jakropp's avatar jakropp
Browse files

Folien und Bilder für den Projekttag hinzugefügt.

parent 7030b4db
......@@ -21,7 +21,7 @@ Zunächst die Definition der genutzten Grundbegriffe:\newline
Für Graphen wird die Definition aus \cite{graphtheorie/diestel17} verwendet:
\begin{theorem}{Graph.}
\glqq Ein Graph ist ein Paar $G = (V, E)$ disjunkter Mengen mit $E \subseteq [V]^2$; die Elemente von V sind also 2-elementige Teilmengen von $V$. Die Elemente von V nennt man die \textit{Ecken} (oder \textit{Knoten}) des Graphen $G$, die Elemente von E seine \textit{Kanten}.
\glqq Ein Graph ist ein Paar $G = (V, E)$ disjunkter Mengen mit $E \subseteq [V]^2$; die Elemente von V sind also 2-elementige Teilmengen von $V$. Die Elemente von E nennt man die \textit{Ecken} (oder \textit{Knoten}) des Graphen $G$, die Elemente von E seine \textit{Kanten}.
Bildlich kann man $G$ darstellen, indem man seine Ecken als Punkte zeichnet und zwei entsprechende Ecken eine Kante sind. \grqq{}
\end{theorem}
......@@ -44,52 +44,52 @@ wobei die $x_i$ paarweise verschieden sind. [...] Die Anzahl an Kanten eines Weg
\end{theorem}
\begin{theorem}{Knotenkonstellationen.}
Knotenkonstellationen sind Viertupel $(a, b, c, d)\subseteq V^4$ , wo alle vier Knoten unterschiedlich sind.
Knotenkonstellationen sind Quadtupel $(a, b, c, d)\subseteq V^4$ , wo alle vier Knoten unterschiedlich sind.
\end{theorem}
\begin{theorem}{Route.}
Eine Route ist eine Folge von Knoten $ (x_0, x_1, ..., x_j)$ in einem Graphen eines Gleisnetzes G, wo alle Knoten paarweise verschieden sind und für alle Knotenpaare gilt: $ (x_i, x_{i+1}) \in E.$
\end{theorem}
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.
Formalisieren kann man dies wie folgt: In jeder Situation kann ein Zug durch seine Route spezifiziert werden.
Gegeben ist der Graph G, welcher ein Gleisnetz repräsentiert. Jeder Zug wird durch eine Route mit mindestens einem Knoten repräsentiert. Der erste Knoten in dieser Folge zeigt die aktuelle Position dieses Zuges an. Außerdem können sich die Routen in jedem Zeitschritt ändern:
\begin{enumerate}
Wir werden für unseren Algorithmus zwei Graphen benötigen: Einen, um das Gleisnetz zu formalisieren und einen, um alle möglichen
Knotenkonstellationen berechnen zu können.\newline
Der Graphen des Gleisnetzes heißt \textit{Knotengraph}.
Knoten in diesem \textit{Knotengraphen} sind einzelne Abschnitte im Gleisnetz mit einem Positioningsensor, um messen zu können, ob der Abschnitt belegt ist.
Zwischen zwei Knoten existiert eine Kante, wenn es physikalisch möglich ist, von einem Knoten zum anderen direkt zu fahren, ohne über andere Knoten zu fahren. Es ist erlaubt über Weichen oder Gleise ohne Abzweigung, welche keinen Sensor haben, zu fahren.
Es ist nicht erlaubt, zwischen zwei Knoten die Richtung zu wechseln.
\newline
\item Die Route $(x_0, x_1, ..., x_k)$ kann zu $(x_1, x_2, ..., x_k)$ werden, falls in keiner anderen Route $x_1$ an erster Stelle
ist und die Route aus mindestens zwei Abschnitten besteht.
\item Die Route $(x_0, x_1, ..., x_k)$ kann zu $ (x_0, x_1, ..., x_k, x_{k+1}, x_{k+2}, ..., x_j)$ werden, wobei $j>k$ und alle Knoten paarweise verschieden sein müssen. Für alle Knoten gilt: $ (x_i, x_{i+1}) \in E$.
\item Die Route wird wie in 1. beschrieben erweitern und anschließend der erste Abschnitt wie in 2. entfernt
\item Die Route bleibt gleich.
\end{enumerate}
\begin{figure}[H]
\centering
\includegraphics[width=\textwidth,keepaspectratio=true,height=\textheight]{../graphproblems/beispiel/gleisnetz.png}
\caption{Das Gleisnetz auf dem alle Züge fahren}
\label{fig:graphgleisnetz}
\end{figure}
In \ref{fig:graphgleisnetz} kann man ein Modell unseres Gleisnetzes sehen. Alle Schienen sind dort in schwarz zu sehen.
Die mit Zahlen markierten grauen Abschnitte sind die messbaren Abschnitte.
Dies entspricht der Bewegung der Züge im realen Betrieb. \newline
\begin{itemize}
\item 1. repräsentiert das Fahren des Zuges entlang der Route, wenn die nächste Position frei ist.
\item 2. repräsentiert das Erweitern der Route durch das Stellwerk.
\end{itemize}
Da der Betrieb immer fortlaufend ist, wird davon ausgegangen, dass 2. immer wieder ausgeführt wird, und zwar spätestens, wenn die Route nur aus einem Element besteht.
\begin{theorem}{Deadlock.}
Als Deadlock wird ein Zeitschritt in diesem Gleisnetz bezeichnet, in der für eine Menge an Routen gilt, dass diese sich gegenseitig blockieren:\newline
Es gibt $k>= 2$ Routen.\newline
Sei die erste Route: $(a_0, a_1, a_2, ..., a_i)$, \newline die zweite $(b_0, b_1, b_2, ..., b_j)$,
\newline die dritte $(c_0, c_1, c_2, ..., c_k) $ usw. \newline
Die Menge seien $V_0 = \{a_0, b_0, c_0, ...\}, V_1 = \{a_1, b_1, c_1, ...\}$. \newline
Dann ist diese Situation ein Deadlock, falls der gerichtete Graph mit $V= \{V_0 \cup V_1\}$ und $ E =
\{ (x, y)\in (V^2) | x \neq y \land (x \in V_0 \land y \in V_1)\}$ einen Zyklus enthält.
\end{theorem}
Um die Umwandlung des Gleisnetzes in einen Graphen besser zu verdeutlichen, schauen wir uns folgenden Teilnetz an und wandeln es anschließend in einen Graphen um:
\begin{figure}[H]
\centering
\includegraphics[width=\textwidth,keepaspectratio=true,height=\textheight]{../graphproblems/beispiel/gleisnetzauschnitt.png}
\caption{Ein Auschnitt des Gleisnetzes zur Verdeutlichung}
\label{fig:graphgleisnetzauschnitt}
\end{figure}
Als Graph codiert, würde dieses Teilnetz etwa so aussehen, wobei ein Kreis für einen Knoten steht und eine Linie zwischen zwei
Knoten eine Kante darstellt:
\begin{figure}[H]
\centering
\includegraphics[width=\textwidth,keepaspectratio=true,height=\textheight]{../graphproblems/beispiel/auschnittgraph3.png}
\caption{Das Teilgleisnetz aus \ref{fig:graphgleisnetzauschnitt} als Graph}
\label{fig:graphgleisnetzauschnittgraph}
\end{figure}
Kanten existieren zwischen zwei Knoten, wenn man von einem Knoten zum anderen fahren kann, ohne einen anderen Knoten zu passieren.
Es ist allerdings nicht möglich, zwischen zwei Knoten die Richtung zu wechseln. Daher existiert beispielsweise zwischen 202 und 203 keine Kante im Graph, obwohl rein theoretisch der Zug manuell direkt zwischen den beiden Knoten fahren könnte.
Grund für diese Designentscheidung ist, dass die Züge nur auf den markierten Abschnitten observiert werden konnten zum Anfang des Projektes. Richtungsänderungen zwischen den Knoten könnten aufgrund dieser mangelnden Obervierbarkeit zu unüberwachten Situationen führen und im schlimmsten Fall Kollisionen verursachen. \newline
Der Graphen des Gleisnetzes heißt \textit{Knotengraph}.
Knoten in diesem \textit{Knotengraphen} sind einzelne Abschnitte im Gleisnetz mit einem Positioningsensor, um messen zu können, ob der Abschnitt belegt ist.
Zwischen zwei Knoten existiert eine Kante, wenn es physikalisch möglich ist von einem Knoten zum Anderen zu fahren, ohne über andere Knoten zu fahren. Es ist erlaubt über Weichen oder Gleise ohne Abzweigung, welche keinen Sensor haben, zu fahren.
\newline
Die Implementierung der Knoten ist in Listing \ref{NodeJava} zu sehen.
\begin{lstlisting}[language=Java, firstnumber=1, label={NodeJava}, caption={Datentyp eines Knotens in Java}]
public class Node<E> {
......@@ -172,53 +172,67 @@ 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 Viertupel 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 Quadtupel 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.
Dieser Graph wird aus folgendem Grund benötigt:
Es reicht nicht nur die Knoten zu betrachten. Es sei eine gerade Strecke im Gleisnetz, welche aus drei messbaren Knoten besteht, die 1, 2 und 3 heißen, wobei 2 in der Mitte ist. 2 hat eine Kante zu 1 und 3 und umgekehrt.
Würde ein Zug auf 1 stehen und einer auf 3, so ist es trivial, dass alle 3 Knoten erreichbar sind.
Zur Veranschaulichung hier der Graph in Abbildung \ref{fig:graphthreenodes}. Die Kreise stehen für die Knoten mit der entsprechenden Nummer oberhalb.
Das blaue Rechteck steht für den Zug, welcher anfangs bei 1 steht und das rote Rechteck für den anderen Zug.
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.
Ein Deadlock bezeichnet in der Bahnwelt eine Verklemmung von zwei oder mehr Zügen, in der kein beteiligter Zug mehr auf
seiner Route weiterfahren kann. Grund hierfür ist meistens, dass ein anderer Zug den nächsten Abschnitt blockiert.
Zum Verdeutlichen zeigen wir hier zwei Deadlocks auf dem Graphen des Teilgleisnetz aus \ref{fig:graphgleisnetzauschnitt}.
Farblich markierte Knoten sind von einem Zug besetzt und die Pfeile der gleichen Farbe markieren das nächste Ziel auf der Route:
\begin{figure}[H]
\centering
\includegraphics[width=\textwidth,keepaspectratio=true,height=\textheight]{../graphproblems/beispiel/start.png}
\caption{Beispiel eines Graphen mit drei Knoten und zwei Zügen}
\label{fig:graphthreenodes}
\includegraphics[width=\textwidth,keepaspectratio=true,height=\textheight]{../graphproblems/beispiel/dl1.png}
\caption{Deadlock zweier Züge. Sie blockieren gegenseitig das Ziel des anderen und können daher nicht weiterfahren}
\label{fig:dl1}
\end{figure}
Die einzige erlaubte Bewegung der Züge ist das Fahren auf einen benachbarten freien Knoten.
Beispielsweise kann nun einer der beiden Züge auf Knoten 2 fahren:
\begin{figure}[H]
\centering
\includegraphics[width=\textwidth,keepaspectratio=true,height=\textheight]{../graphproblems/beispiel/blue.png}
\caption{Blau fährt von 1 zu 2}
\includegraphics[width=\textwidth,keepaspectratio=true,height=\textheight]{../graphproblems/beispiel/dl2.png}
\caption{Deadlock mit 4 Zügen.}
\label{fig:dl2}
\end{figure}
Oder natürlich auch der andere Zug.
Ein Deadlock gefährdet den flüßigen Verkehr der Züge. Durch geschickte Planung können sie oft, aber nicht unbedingt immer verhindert werden. Falls ein Deadlock entstanden ist, kann dieser am entweder durch Änderungen an der Route (andere Wege zum Ziel fahren) oder durch Rangieren der Züge auf unbenutze Gleise, um Platz für andere Züge zu machen, behoben werden.
Angenommen, im Beispiel \ref{fig:dl1} wäre die Route des blauen Zuges (203, 208, 212) und die des gelben Zuges
(208, 203, 207), so könnte man die Route des gelben Zuges auf (208, 202, 207) ändern. Sobald der gelbe Zug auf 202 gefahren ist, sieht die Situation wie folgt aus:
\begin{figure}[H]
\centering
\includegraphics[width=\textwidth,keepaspectratio=true,height=\textheight]{../graphproblems/beispiel/red.png}
\caption{Rot fährt von 3 zu 2}
\includegraphics[width=\textwidth,keepaspectratio=true,height=\textheight]{../graphproblems/beispiel/dl1loesung.png}
\caption{Der gelbe Zug fährt eine andere Route zum Ziel und hat somit den Deadlock aufgelöst}
\label{fig:dl1loesung}
\end{figure}
Betrachtet man nur die Knoten, ist klar, dass Züge auf allen drei Knoten fahren können.
Allerdings ist es nicht direkt feststellbar, ob es Konstellationen gibt, die unerreichbar sind.
Es ist physikalisch nicht möglich, die Züge so zu rangieren, dass rot auf 1 fahren kann oder blau auf 3.
Beispielsweise ist daher diese Konstellation unerreichbar:
Die Lösung eines Deadlocks kann aber auch deutlich schwerer sein, wie das Beispiel \ref{fig:dl2} zeigt, wenn man davon ausgeht, dass der nächste Knoten jeder Route das eigentliche Ziel ist.
In dem Beispiel existiert nämlich keine Lösung, wo alle Züge ihr Ziel erreichen; Egal, wie man die Züge rangiert: Der violette Zug hat keine Möglichkeit, auf 202 zu fahren, da er immer von anderen Zügen blockiert wird.
Man sieht also: Die Frage, ob sich jeder Deadlock in einem Gleisnetz auflösen lässt, ist nicht trivial.
An dieser Stelle wird uns der Knotenkonstellationsgraph helfen. Dort werden alle erreichbaren Konstellationen gespeichert.
Dieser gibt uns Informationen, ob gewisse Konstellationen unerreichbar sind. Der fertige Knotenkonstellationsgraph für \ref{fig:dl2}
würde wie folgt aussehen:
\begin{figure}[H]
\centering
\includegraphics[width=\textwidth,keepaspectratio=true,height=\textheight]{../graphproblems/beispiel/impossible.png}
\caption{Vom Start aus unerreichbare Konstellation}
\includegraphics[width=\textwidth,keepaspectratio=true,height=\textheight]{../graphproblems/beispiel/kgraphfertig.png}
\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}
$[207, 203, 208, 202]$ nicht in der Menge der von der Startkonstellation erreichbaren Konstellationen ist. Wie genau dieser Graph ermittelt wird, ist im nächsten Kapitel erläutert.
Folglich wird diese Knotenkonstellationen zur Vollständigkeit genutzt. Im obigen Beispiel sieht die Startkonstellation beispielsweise so aus: $[1,3]$. In diesem Tupel steht die erste Stelle für die Position des ersten Zuges und die zweite Stelle für die aktuelle Position des zweiten Zuges. Dementsprechend wäre $[3,1]$ ein unerreichbarer Fall, da die Züge sich auf einer eingleisigen Strecke befinden und nicht aneinander vorbei kommen.
In diesem Beispiel sind $[1,2]$, $[1,3]$, $[2,3]$ erreichbar und $[3,1]$, $[3,2]$, $[2,1]$ unerreichbar.
\newline
In dem TEAMOD-Gleisnetz fahren vier Züge gleichzeitig, daher werden nur Viertupel als Knotenkonstellation betrachtet.
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 etwa exponentiell zur Anzahl der Züge.
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 Viertupeln 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 Quadtupeln 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:
......@@ -603,7 +617,7 @@ Der Sicherheitsabstand gilt dann als verletzt, wenn ein Zug auf eine neue Positi
dort im letzten Zeitschritt definitiv ein Zug stand.\newline
\begin{enumerate}
\setcounter{enumi}{4}
\item Prüfe für das so entstandene Viertupel im aktuellen Schleifendurchlauf, ob alle vier Positionen unterschiedlich sind. (Zeile 81-82)
\item Prüfe für das so entstandene Quadtupel 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.
......@@ -640,7 +654,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 Viertupel. 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 Quadtupel. 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)
......
......@@ -255,7 +255,7 @@ containsInHash a b c= if(a==0) then if(not (isHashOccupied (firstHash (nodeToInt
-- List with reachable, but not checked nodes.
--Hashlist with all reached nodes
hashAllReachableNodes::Dgraph ->[[Node]] ->[[Node]]-> Int->[[Node]]
hashAllReachableNodes g reachable printed counter= if (counter ==2) then [[length (filter (\x-> length x==4) printed)]] ++ (hashAllReachableNodes g reachable printed 0)
hashAllReachableNodes g reachable printed counter= if (counter ==1) then [[length (filter (\x-> length x==4) printed)]] ++ (hashAllReachableNodes g reachable printed 0)
else if (reachable == (allStepsHash g reachable)) then [[length (filter (\x-> length x==4) printed)]]
else (hashAllReachableNodes g (findReachables(allStepsHash g (reachable)) printed []) (addToHashList printed reachable) (counter+1))
--First para: List of all reachable Nodes
......@@ -276,7 +276,8 @@ addToHashList a (h:t)= if(not (containsInHash 0 h a)) then addToHashList(totalHa
allStepsHash:: Dgraph -> [[Node]]->[[Node]]
allStepsHash g [] = []
allStepsHash g (h:t) = ((oneStep g h) ++ (allSteps g t))
allStepsHash g (h:t) = ((oneStep g h) ++ (allStepsHash g t))
--Example to work with
toyexample:: [(Int,[Int])]
toyexample = [(1, [2,3]), (2, [1,3]), (3,[1,2])]
......
......@@ -10,7 +10,7 @@ hungerTrivial 4 (exampleToGraph graphempty railnetwork ) (take 4 (graphNodes (
oneStep (exampleToGraph graphempty railnetwork ) [100,101, 102, 207]
hashAllReachableNodes (exampleToGraph graphempty newSmallCycle) [[1]] (emptyTestHashList)
hashAllReachableNodes (exampleToGraph graphempty newLongLine) [[1,2,3,4]] (emptyHashList) 0
hashAllReachableNodes (exampleToGraph graphempty railnetwork) [[100,101,102,103]] (emptyHashList) 0
......
......@@ -528,10 +528,62 @@ int interpret_data(struct mcp_reg* reg, uint8_t reg_val)
\end{figure}
\end{frame}
\begin{frame}
\begin{figure}[H]
\centering
\includegraphics[width=\textwidth]{../../graphproblems/beispiel/gleisnetz.png}
\caption{Unser Gleisnetz}
\end{figure}
\end{frame}
\begin{frame}
\begin{figure}[H]
\centering
\includegraphics[width=\textwidth]{../../graphproblems/beispiel/gleisnetzauschnitt.png}
\caption{Ausschnitt aus dem Gleisnetz}
\end{figure}
\end{frame}
\begin{frame}
\begin{figure}[H]
\centering
\includegraphics[width=\textwidth]{../../graphproblems/beispiel/auschnittgraph3.png}
\caption{Ausschnitt des Gleisnetzes als Graph}
\end{figure}
\end{frame}
\begin{frame}
\begin{figure}[H]
\centering
\includegraphics[width=\textwidth]{../../graphproblems/beispiel/dl1.png}
\caption{Beispiel eines Deadlocks mit zwei Zügen}
\end{figure}
\end{frame}
\begin{frame}
\begin{figure}[H]
\centering
\includegraphics[width=\textwidth]{../../graphproblems/beispiel/dl1loesung.png}
\caption{Auflösung des Deadlocks mit zwei Zügen}
\end{figure}
\end{frame}
\begin{frame}
\begin{figure}[H]
\centering
\includegraphics[width=\textwidth]{../../graphproblems/beispiel/dl2.png}
\caption{Beispiel eines Deadlocks mit vier Zügen}
\end{figure}
\end{frame}
\begin{frame}
\begin{figure}[H]
\centering
\includegraphics[width=\textwidth]{../../graphproblems/beispiel/kgraphfertig.png}
\caption{Konstellationsgraph für das Beispiel}
\end{figure}
\end{frame}
\section{Safety Monitor}
......
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