Übungsblatt 4

Ausgabe: 20.05.2008
Abgabe: 28.05.2008, 16:00 Uhr

Aufgabe 1 (16 P)

Die Firma Brummi-Logistik transportiert übergroße Lasten per LKW. Für die Erschließung neuer Transportstrecken wird eine Verkehrssimulation benötigt, um schon vorab eventuelle Probleme zu erkennen. Die folgenden Transportstrecken sollen untersucht werden:

LKW KreuzungLKW Insel

mögliche Bewegungen
Die LKWs fahren jeweils von einem bestimmten Startpunkt S zu einem Zielpunkt Z. Die Wege dazwischen werden in Straßenabschnitte eingeteilt. Aufgrund der Übergröße der Lasten kann dabei jeder Abschnitt nur von einem LKW auf einmal benutzt werden. Die Fahrer sind Stop-And-Go-Verkehr gewöhnt, und warten jedesmal solange, bis der vorherige LKW einen Straßenabschnitt verlassen hat. Außerdem kann ein LKW nicht beliebig die Richtung ändern, sondern höchstens um 45 Grad pro Straßenabschnitt, wodurch die Wahl des Weges eingeschränkt wird. Der LKW darf per Gesetz mit seiner Last auch nicht rückwärts fahren. Wenn es von einem Straßenabschnitt aus mehrere Möglichkeiten für die Weiterfahrt gibt, fahren die Fahrer geradeaus, wenn sie können und wählen ansonsten per Zufall eine Richtung.

Implementieren Sie die Verkehrssimulation wie beschrieben mit einer variablen Anzahl an LKWs, wobei sie die vorgegebene Implementierung um Ausschlussmechanismen erweitern und jeden LKW durch einen eigenen Thread realisieren!
In der Implementierung besteht ein Szenario aus mehreren miteinander verknüpften Streckenabschnitten (Road). Jeder LKW blockiert einen Streckenabschnitt. Für die Implementierung dieser Blockierung sind in der Oberklasse BlockSupport von Road die folgenden Methoden vorbereitet:

 public Thread blocking();
public void block() throws InterruptedException;
public void unblock();
Ein Aufruf von block durch einen LKW-Thread bewirkt, dass der Abschnitt von diesem LKW belegt wird, falls er frei war. Falls nicht, lässt block den LKW-Thread solange warten, bis der Abschnitt durch Aufruf von unblock freigegeben wird. Wenn mehrere LKWs gemeinsam auf die Freigabe warten, sorgt block dafür, dass ein beliebiger davon den Abschnitt belegt, während die anderen weiterhin warten müssen. Der Aufruf von blocking() liefert den Thread zurück, der den Abschnitt aktuell blockiert, bzw. null, falls er nicht blockiert ist.
Ein LKW, der von Abschnitt S1 über S2 nach S3 fahren möchte, muss also folgende Operationen durchführen:
S1.block(); ... S2.block(); S1.unblock(); ... S3.block(); S2.unblock();
Für den Rest der vorgegebenen Implementierung, die auch schon alle geforderten Transportstrecken enthält, sei auf die mitgelieferte JavaDoc-Dokumentation und auf die Implementierung des Beetles verwiesen.

Beschreiben Sie Ihre Implementierung unter Einsatz kommentierter Codefragmente! Geben sie eine lauffähige Jar-Datei ab, die zusätzlich den gesamten Quellcode enthält.

Ziel der Simulation ist es, so weit wie möglich  zu untersuchen, ob sich die gewählten Transportstrecken für eine reibungslose Durchführung der Transporte eignen. Führen Sie diese Untersuchung anhand von ausreichend vielen Simulationsläufen durch. Beschreiben Sie die dabei identifizierten Probleme unter Einsatz von Bildschirmfotos! Lassen sich diese Probleme lösen, wenn in jedem Szenario höchstens ein Start- und Zielpunkt vertauscht werden?

Für die Lösung dieser Aufgabe braucht ihr Brummi.jar.

Hinweise zur Abgabe:

Die Abgabe der Lösungen erfolgt auf zwei Wegen:

Bitte schreiben Sie zur jeder Aufgabe eine Dokumentation, in der Sie anhand von *relevanten* Codefragmenten Ihre Implementierung erläutern. Die Codefragmente sollten möglichst kurz gehalten werden und nur der Orientierung für den Leser dienen; entscheidend sind Ihre Erläuterungen, was diese Fragmente machen und wieso Sie sich für diese Art der Implementierung entschieden haben. Die Dokumentation ist bis Mittwoch 16:00 Uhr in den Tutorenfächern abzugeben .

Schicken Sie ein ZIP-Archiv an Ihren Tutor, welches den vollständigen Quellcode sowie ausführbare JAR-Dateien für die jeweiligen Aufgabenteile enthält. Der Betreff der E-Mail sollte wie folgt aussehen: "[ALP4] Blatt X - Namen Y".


Zum Bestehen des Übungsblattes müssen 50% der Punkte erreicht werden.