Algorithmen für Routenplanung

Werbung
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
Herunterladen