Organisatorisches Grundlegender Aufbau des Frameworks Ein erstes Beispiel Implementierung von Routingalgorithmen Dijkstra’s Algorithmen für Routenplanung Übung 1 Thomas Pajor Lehrstuhl für Algorithmik I Institut für theoretische Informatik Karlsruher Institut für Technologie Universität Karlsruhe (TH) 8. Mai 2009 Thomas Pajor – Algorithmen für Routenplanung Lehrstuhl für Algorithmik I Institut für theoretische Informatik Karlsruher Institut für Technologie Universität Karlsruhe (TH) 1/ 28 Organisatorisches Grundlegender Aufbau des Frameworks Ein erstes Beispiel Implementierung von Routingalgorithmen Dijkstra’s Organisatorisches Willkommen zur Übung zur Vorlesung Algorithmen für Routenplanung Euer Übungsleiter • Name: Thomas Pajor • E-Mail: [email protected] • Raum: 322 im Informatik-Hauptgebäude • Sprechzeiten: Kommt einfach vorbei Thomas Pajor – Algorithmen für Routenplanung Lehrstuhl für Algorithmik I Institut für theoretische Informatik Karlsruher Institut für Technologie Universität Karlsruhe (TH) 2/ 28 Organisatorisches Grundlegender Aufbau des Frameworks Ein erstes Beispiel Implementierung von Routingalgorithmen Dijkstra’s Outline Organisatorisches Grundlegender Aufbau des Frameworks Ein erstes Beispiel Implementierung von Routingalgorithmen Dijkstra’s Algorithmus Thomas Pajor – Algorithmen für Routenplanung Lehrstuhl für Algorithmik I Institut für theoretische Informatik Karlsruher Institut für Technologie Universität Karlsruhe (TH) 3/ 28 Organisatorisches Grundlegender Aufbau des Frameworks Ein erstes Beispiel Implementierung von Routingalgorithmen Dijkstra’s Organisatorisches Geplant sind... • Ungefähr 6 Übungsblätter • zur Vertiefung des Theoriestoffs • Abgabe jeweils in der Vorlesung der darauffolgenden Woche Routenplanung ist zu großen Teilen Algorithm Engineering! • ⇒ Kleine Implementierungsaufgaben • Beschleunigungstechniken ausprobieren • Sehr einfach gehalten. Wir geben das meiste vor! Thomas Pajor – Algorithmen für Routenplanung Lehrstuhl für Algorithmik I Institut für theoretische Informatik Karlsruher Institut für Technologie Universität Karlsruhe (TH) 4/ 28 Organisatorisches Grundlegender Aufbau des Frameworks Ein erstes Beispiel Implementierung von Routingalgorithmen Dijkstra’s Übungsablauf Normalerweise... • Besprechung der Übungsaufgaben vom vorherigen Mal • Vorführen von tollen Implementierungen und Ergebnissen Heute allerdings... • Kurze Einführung in unser Implementierungs- Framework“ ” • Damit ihr zu Hause leicht loslegen könnt • Dijkstra’s Algorithmus auf kleinen Graphen! Thomas Pajor – Algorithmen für Routenplanung Lehrstuhl für Algorithmik I Institut für theoretische Informatik Karlsruher Institut für Technologie Universität Karlsruhe (TH) 5/ 28 Organisatorisches Grundlegender Aufbau des Frameworks Ein erstes Beispiel Implementierung von Routingalgorithmen Dijkstra’s Schnell, schneller, am schnellsten. . . Maxime Bei der Routenplanung müssen • große Datenmengen (riesige Graphen) • schnell und ressourcenschonend verarbeitet werden. ⇒ Wir benutzen C++ mit einem (sehr) schlanken Framework! Thomas Pajor – Algorithmen für Routenplanung Lehrstuhl für Algorithmik I Institut für theoretische Informatik Karlsruher Institut für Technologie Universität Karlsruhe (TH) 6/ 28 Organisatorisches Grundlegender Aufbau des Frameworks Ein erstes Beispiel Implementierung von Routingalgorithmen Dijkstra’s Slim-Framework Das Framework... • ist selbst geschrieben (und sehr klein) • benutzt lediglich ein paar Komponenten der STL Vorteile: • sehr schnell • kein (kaum) Overhead • für euch überschaubar :-) Nachteile: • Unflexibel (aber für die Übung ausreichend) Thomas Pajor – Algorithmen für Routenplanung Lehrstuhl für Algorithmik I Institut für theoretische Informatik Karlsruher Institut für Technologie Universität Karlsruhe (TH) 7/ 28 Organisatorisches Grundlegender Aufbau des Frameworks Ein erstes Beispiel Implementierung von Routingalgorithmen Dijkstra’s Überblick Das Übungs-Framework besteht aus folgenden Bestandteilen: • Graph-Klasse Verwaltet den Graphen • Query-Algorithmen Zum Beispiel Dijkstra’s Algorithmus • Statistik-Klasse Zur Auswertung der Laufzeitmessungen ... und noch ein bisschen IO. Euer Fokus: Ausbau der Query-Algorithmen. Thomas Pajor – Algorithmen für Routenplanung Lehrstuhl für Algorithmik I Institut für theoretische Informatik Karlsruher Institut für Technologie Universität Karlsruhe (TH) 8/ 28 Organisatorisches Grundlegender Aufbau des Frameworks Ein erstes Beispiel Implementierung von Routingalgorithmen Dijkstra’s Graphen Umgehen mit Graphen... Thomas Pajor – Algorithmen für Routenplanung Lehrstuhl für Algorithmik I Institut für theoretische Informatik Karlsruher Institut für Technologie Universität Karlsruhe (TH) 9/ 28 Organisatorisches Grundlegender Aufbau des Frameworks Ein erstes Beispiel Implementierung von Routingalgorithmen Dijkstra’s Grundlegende Datentypen Grundlegende Datentypen aus unserem Framework sind • typedef unsigned int NodeID; Index in dem Knotenvektor nodes • typedef unsigned int EdgeID; Index in dem Kantenvektor edges • typedef int EdgeWeight; Kantengewichte • INFTY Spezieller EdgeWeight-Wert für ∞. Thomas Pajor – Algorithmen für Routenplanung Lehrstuhl für Algorithmik I Institut für theoretische Informatik Karlsruher Institut für Technologie Universität Karlsruhe (TH) 10/ 28 Organisatorisches Grundlegender Aufbau des Frameworks Ein erstes Beispiel Implementierung von Routingalgorithmen Dijkstra’s Graphen Die Graphen sind als Adjazenzarray implementiert. nodes: 0 n struct basicNode { EdgeID firstEdge; int xCoord, yCoord; } m-1 struct basicEdge { NodeID targetNode; bool forwardFlag; bool backwardFlag; EdgeWeight weight; } edges: 0 ... Thomas Pajor – Algorithmen für Routenplanung Lehrstuhl für Algorithmik I Institut für theoretische Informatik Karlsruher Institut für Technologie Universität Karlsruhe (TH) 11/ 28 Organisatorisches Grundlegender Aufbau des Frameworks Ein erstes Beispiel Implementierung von Routingalgorithmen Dijkstra’s Graphen – Beispiel 1 Adjazenzarray an einem kleinen Beispiel 2 3 firstEdge 2 1 1 2 0 3 5 7 10 0 3 1 targetNode 1 3 backwardFlag − √ weight forwardFlag 3 3 0 2 2 1 3 2 √ √ − − √ √ − − 1 3 0 0 2 1 1 2 √ √ √ − √ √ − − 2 1 √ √ Thomas Pajor – Algorithmen für Routenplanung Lehrstuhl für Algorithmik I Institut für theoretische Informatik Karlsruher Institut für Technologie Universität Karlsruhe (TH) 12/ 28 Organisatorisches Grundlegender Aufbau des Frameworks Ein erstes Beispiel Implementierung von Routingalgorithmen Dijkstra’s Graph-Struktur – Implementierung Wichtige Bestandteile der Graph-Klasse: t e m p l a t e <typename NodeSlot , typename E d g e S l o t > class staticGraph { // . . . v e c t o r <NodeSlot > n o d e s ; v e c t o r <E d g e S l o t > e d g e s ; }; Der einfache Graph ergibt sich damit durch t y p e d e f s t a t i c G r a p h <b a s i c N o d e , b a s i c E d g e > b a s i c G r a p h ; Der Rest ist für uns nicht wichtig! Thomas Pajor – Algorithmen für Routenplanung Lehrstuhl für Algorithmik I Institut für theoretische Informatik Karlsruher Institut für Technologie Universität Karlsruhe (TH) 13/ 28 Organisatorisches Grundlegender Aufbau des Frameworks Ein erstes Beispiel Implementierung von Routingalgorithmen Dijkstra’s Größe des Graphen Folgende Funktionen können benutzt werden Größen zu ermitteln • number of nodes() Größe des nodes-vectors −1. • number of edges() Größe des edges-vectors Achtung: number of edges() entspricht in der Regel nicht der tatsächlichen Anzahl Kanten im Graph! Thomas Pajor – Algorithmen für Routenplanung Lehrstuhl für Algorithmik I Institut für theoretische Informatik Karlsruher Institut für Technologie Universität Karlsruhe (TH) 14/ 28 Organisatorisches Grundlegender Aufbau des Frameworks Ein erstes Beispiel Implementierung von Routingalgorithmen Dijkstra’s Iterieren auf Graphen Folgende Konstrukte existieren zur Iteration: • forall nodes(G, n) Iteriert über alle Knoten in G • forall edges(G, e) Iteriert über alle Kanten in G • NodeID s; forall source edges(G, e, s) Iteriert über alle Kanten, s ist dabei der Quellknoten der Kante • forall in out edges(G, e, n) Iteriert über alle zu n inzidenten Kanten in G Benutzung wie normale Schleifenkonstrukte in C++ (z. B. for) Thomas Pajor – Algorithmen für Routenplanung Lehrstuhl für Algorithmik I Institut für theoretische Informatik Karlsruher Institut für Technologie Universität Karlsruhe (TH) 15/ 28 Organisatorisches Grundlegender Aufbau des Frameworks Ein erstes Beispiel Implementierung von Routingalgorithmen Dijkstra’s Vorwärts und Rückwärtskanten Problem: Nur über ausgehende Kanten iterieren. basicGraph G; NodeID n = 4 2 ; // I t e r i e r e ü b e r a u s g e h e n d e Kanten von n . . . f o r a l l i n o u t e d g e s (G , e , n ) { i f ( !G. edges [ e ] . forwardFlag ) continue ; s t d : : c o u t << ” Kante ” << e << ” m i t G e w i c h t ” << G . e d g e s [ e ] . w e i g h t << s t d : : e n d l ; } Nur Rückwärtskanten: analog Thomas Pajor – Algorithmen für Routenplanung Lehrstuhl für Algorithmik I Institut für theoretische Informatik Karlsruher Institut für Technologie Universität Karlsruhe (TH) 16/ 28 Organisatorisches Grundlegender Aufbau des Frameworks Ein erstes Beispiel Implementierung von Routingalgorithmen Dijkstra’s Graphen Ein erstes Beispiel... Thomas Pajor – Algorithmen für Routenplanung Lehrstuhl für Algorithmik I Institut für theoretische Informatik Karlsruher Institut für Technologie Universität Karlsruhe (TH) 17/ 28 Organisatorisches Grundlegender Aufbau des Frameworks Ein erstes Beispiel Implementierung von Routingalgorithmen Dijkstra’s Ein paar kleine Statistiken Ein kleines Kennenlernprogramm zum Ausgeben: • Anzahl Knoten, • ...mit Grad 0, 1, 2, • Anzahl Vorwärts-Kanten, • Maximal- und Minmalgewicht ...eines Graphen über die Kommandozeile. Live Thomas Pajor – Algorithmen für Routenplanung Lehrstuhl für Algorithmik I Institut für theoretische Informatik Karlsruher Institut für Technologie Universität Karlsruhe (TH) 18/ 28 Organisatorisches Grundlegender Aufbau des Frameworks Ein erstes Beispiel Implementierung von Routingalgorithmen Dijkstra’s Graphen Implementierung von Routingalgorithmen... Thomas Pajor – Algorithmen für Routenplanung Lehrstuhl für Algorithmik I Institut für theoretische Informatik Karlsruher Institut für Technologie Universität Karlsruhe (TH) 19/ 28 Organisatorisches Grundlegender Aufbau des Frameworks Ein erstes Beispiel Implementierung von Routingalgorithmen Dijkstra’s Vorgaben Wir geben euch als Input: • Graphen San Francisco Bay Area, Florida, . . . • Demand-Files zu jedem Graphen. Thomas Pajor – Algorithmen für Routenplanung Lehrstuhl für Algorithmik I Institut für theoretische Informatik Karlsruher Institut für Technologie Universität Karlsruhe (TH) 20/ 28 Organisatorisches Grundlegender Aufbau des Frameworks Ein erstes Beispiel Implementierung von Routingalgorithmen Dijkstra’s Demand-Files Idee: Testen der Korrektheit der Beschleunigungstechniken. Demand-Files enthalten zu einem Graphen n Einträge mit je • Source NodeID s, • Target NodeID t, • Distanz dist(s, t). Programm führt zu jedem Eintrag ein s, t-Query mit einer Beschleunigungkstechnik aus und vergleicht das Ergebnis mit dist(s, t). Thomas Pajor – Algorithmen für Routenplanung Lehrstuhl für Algorithmik I Institut für theoretische Informatik Karlsruher Institut für Technologie Universität Karlsruhe (TH) 21/ 28 Organisatorisches Grundlegender Aufbau des Frameworks Ein erstes Beispiel Implementierung von Routingalgorithmen Dijkstra’s Struktur Schematischer Ablauf in unserem Rahmenwerk: Eingabe Programm graph main statistics demand-file Dijkstra Bi-Dijkstra Thomas Pajor – Algorithmen für Routenplanung Lehrstuhl für Algorithmik I Institut für theoretische Informatik Karlsruher Institut für Technologie Universität Karlsruhe (TH) 22/ 28 Organisatorisches Grundlegender Aufbau des Frameworks Ein erstes Beispiel Implementierung von Routingalgorithmen Dijkstra’s Struktur Schematischer Ablauf in unserem Rahmenwerk: Eingabe Programm graph main statistics demand-file Dijkstra Bi-Dijkstra Thomas Pajor – Algorithmen für Routenplanung Lehrstuhl für Algorithmik I Institut für theoretische Informatik Karlsruher Institut für Technologie Universität Karlsruhe (TH) 22/ 28 Organisatorisches Grundlegender Aufbau des Frameworks Ein erstes Beispiel Implementierung von Routingalgorithmen Dijkstra’s Verschiedene Algorithmen Die einzelnen Algorithmen werden der Statistik-Klasse über Templates übergeben. Ausschnitt aus main(): basicGraph G; [ . . . ] // Graph a u s D a t e i l a d e n . . . D i j k s t r a <b a s i c G r a p h > d i j (G ) ; D i j k s t r a S t a t i s t i c <D i j k s t r a <b a s i c G r a p h >, b a s i c G r a p h > d s (G , d i j , demandFilename ) ; ds . e v a l u a t e D i j k s t r a ( ) ; Thomas Pajor – Algorithmen für Routenplanung Lehrstuhl für Algorithmik I Institut für theoretische Informatik Karlsruher Institut für Technologie Universität Karlsruhe (TH) 23/ 28 Organisatorisches Grundlegender Aufbau des Frameworks Ein erstes Beispiel Implementierung von Routingalgorithmen Dijkstra’s Algorithmus-Interface Die Algorithmen müssen folgende Funktionalität bereitstellen: t e m p l a t e <typename graphType> class Dijkstra { public : D i j k s t r a ( graphType& g , b o o l f o r w a r d=t r u e ) ; v o i d r u n ( NodeID s , NodeID t ) ; EdgeWeight g e t D i s t a n c e ( ) ; i n t getNumberOfRelaxedEdges ( ) ; i n t getNumberOfSettledNodes ( ) ; std : : s t r i n g de s c r ip t i o n ( ) ; }; Thomas Pajor – Algorithmen für Routenplanung Lehrstuhl für Algorithmik I Institut für theoretische Informatik Karlsruher Institut für Technologie Universität Karlsruhe (TH) 24/ 28 Organisatorisches Grundlegender Aufbau des Frameworks Ein erstes Beispiel Implementierung von Routingalgorithmen Dijkstra’s Algorithmus-Interface Die Statistik-Klasse ruft für jeden Eintrag aus dem Demand-File einmal run(s,t) im Algorithmus auf. Das heißt: • Der Algorithmus wird nicht für jede Anfrage neu erstellt. • Manuelles Einhalten der Konsistenz, z. B. von dists (·). Zum Beispiel über Counter“ (siehe Vorlesung) ” Zur Verifikation holt sich die Statistik-Klasse die s-t-Distanz durch Aufruf von getDistance(). Thomas Pajor – Algorithmen für Routenplanung Lehrstuhl für Algorithmik I Institut für theoretische Informatik Karlsruher Institut für Technologie Universität Karlsruhe (TH) 25/ 28 Organisatorisches Grundlegender Aufbau des Frameworks Ein erstes Beispiel Implementierung von Routingalgorithmen Dijkstra’s Kapselung der Priority-Queue Unsere Priority-Queue ist etwas unhandlich“. ” Kapselung wichtiger Funktionen: • NodeID deleteMin() Gibt Knoten mit minimalem Key zurück und löscht ihn • void insertNode(NodeID n, EdgeWeight key) Fügt Knoten n mit Key key ein • void decreaseNode(NodeID n, EdgeWeight key) Senkt den Key von Knoten n auf den Wert key Thomas Pajor – Algorithmen für Routenplanung Lehrstuhl für Algorithmik I Institut für theoretische Informatik Karlsruher Institut für Technologie Universität Karlsruhe (TH) 26/ 28 Organisatorisches Grundlegender Aufbau des Frameworks Ein erstes Beispiel Implementierung von Routingalgorithmen Dijkstra’s Graphen Dijkstra’s Algorithmus... Thomas Pajor – Algorithmen für Routenplanung Lehrstuhl für Algorithmik I Institut für theoretische Informatik Karlsruher Institut für Technologie Universität Karlsruhe (TH) 27/ 28 Organisatorisches Grundlegender Aufbau des Frameworks Ein erstes Beispiel Implementierung von Routingalgorithmen Dijkstra’s Dijkstra’s Algorithmus ++count d[s] = 0 Q.clear (), Q.add(s, 0) while !Q.empty () do u ← Q.deleteMin() if u = t then RETURN for all edges e = (u, v ) ∈ E do if run[v ] 6= count then d[v ] ← d[u] + len(e) Q.insert(v , d[v ]) run[v ] ← count else if d[u] + len(e) < d[v ] then d[v ] ← d[u] + len(e) Q.decreaseKey (v , d[v ]) Thomas Pajor – Algorithmen für Routenplanung Lehrstuhl für Algorithmik I Institut für theoretische Informatik Karlsruher Institut für Technologie Universität Karlsruhe (TH) 28/ 28