Prof. Dr. R. Schrader Anna Schulze [[email protected]] Birgit Engels [[email protected]] SS 2006 3. Teil Programmierpraktikum Abgabe Donnerstag, 29.6.2006 Einsendung des tar- oder rar-gepackten, make- bzw. javac-kompilierbaren Codes bis spätestens Dienstag, 27.6.2006, 24:00 Uhr an obige Email-Adresse(n)! Aktuelle Informationen bezüglich des Vorlesungsteils (Skript) sowie des Programmierteils des Praktikums (Header und Testprogramme) finden sich weiterhin unter : http://www.zaik.uni-koeln.de/AFS/teachings/courses/Programmierpraktikum/progprakt.html.de Von dort können die aktuellen Projekt-Dateien (C++-Version [cheader3.tar.gz, ctests3.tar.gz] und Java- Version [jclasstemplates3.tar.gz]) sowie das Paper zum Canadian Traveller Problem von Barnoy und Schieber heruntergeladen werden. Aufgabe 1: (Deterministic recoverable k-CTP) Implementieren Sie den vorgestellten Algorithmus von Bar-Noy und Schieber zur Lösung des deterministischen recoverable k-CTP mit höchstens k abbaubaren Blockaden. Hinweise: Eingabe Der Konstruktor für die Klasse Graph, der den Graphen aus einer Text-Datei aufbaut, muß für Aufgabe 3 wiederum an ein neues Format angepasst bzw. erweitert werden. Anstelle der Blockadewahrscheinlichkeit bei den einzelnen Kanten tritt hier die Anzahl der tatsächlichen Blockierungen, die auf der Kante auftreten. Die Summe dieser Blockaden ist in jeder Beispieldatei kleiner, als die in der letzten Zeile angegebene Anzahl der maximalen Blockaden k. (Dennoch kann es nicht schaden, eine entsprechende Überprüfung zu programmieren.) Es ist also bekannt, welche Kante wie oft (bei der Ankunft des Reisenden“) blockiert ist. ” Diese Information darf zur Berechnung der Reisestrategien“ durch den Algorithmus nicht ” benutzt werden. Die Information dient nur der späteren Simulation und der Ausgabe eines eindeutigen Weges vom Startknoten s zum Zielknoten t (siehe 2). Das neue Format für einen Graph G(V, E) mit n Knoten und m Kanten ( Alle Angaben von Zeilennummern verstehen sich ohne Berücksichtigung von Kommentarzeilen): • Die n Zeilen nach den Angaben n (1. Zeile) und m (2.Zeile) enhalten je ausschliesslich den Wert ttw für den entsprechenden Knoten ( id=Zeilennummer-2). Dieser entspricht der Zeit nach der alle Blockaden angrenzender Kanten einmal behoben wurden. • Die folgenden m Zeilen enthalten weiterhin die Daten der m Kanten: Start-Knoten-ID Ziel-Knoten-ID Kantengewicht Blockadeanzahl • Die beiden vorletzten Zeilen enthalten weiterhin Start- und Ziel-Knoten • Die letzte Zeile anthält die maximale Anzahl von Blockaden k. Ausgabe Die Ausgabe-Datei soll in diesem Aufgabenteil wieder einen eindeutigen Weg enthalten. Dazu dürfen erst in der Implementierung der Methode makePath() der Klasse DRCTP die Angaben zu tatsächlichen Kantenblockierungen genutzt werden, da diese erst online bekannt werden sollen und der vorgestellte Algorithmus gerade das berücksichtigt!!! makePath() Es wird hier die Benutzung der vom Algorithmus berechneten Reisestrategien“ simuliert, ” d.h., beginnend beim Startknoten s wird überprüft, ob die Primärkante Pk (s) blockiert ist. Falls nicht, wird diese benutzt. Andernfalls wird die erste nicht blockierte Kante der Liste Alternativer Kanten AEk (s) traversiert. Anschliessend muss ein Zähler b für die Anzahl bereits blockierter Kanten an die Anzahl der gerade gefundenen Blockaden angepasst werden. Achtung! Auch wenn die x-te Kante (x < k + 1) der Liste AEk (s) bereits frei ist und traversiert wird, müssen trotzdem alle Kanten aus AEk (s) auf Blockaden hin überprüft werden. Sonst werden Informationen verschenkt“: Je schneller sich b k nähert, um so günstigere ” Strategien können gewählt werden, da Strategien, die weniger mögliche Blockaden in Betracht ziehen auch weniger lange Alternativen zum kürzesten Weg von s nach t beinhalten müssen. Nach dem Bereisen der ausgewählten Kante wird ein neuer Knoten v erreicht, der in den Pfad aufgenommen wird und von dem aus wiederum — wie oben — die nächste Kante ausgewählt wird. Zu Grunde liegt nun die Primärkante Pi (v) und die Liste alternativer Kanten AEi (v) für die Strategie Si , i = k − b mit einer um b verringerten Anzahl von Blockaden.