Vortr

Werbung
Wegsuchealgorithmen in
Routenplanungssystemen
Vortrag von Markus Schäfer
Projektgruppe Intelligente Datenbanken
8.7.2003
Gliederung
1.
2.
3.
4.
Worum es heute geht – Routenplanung
Motivation und Ziel
Straßenkarten
Algorithmen
1.
2.
3.
4.
5.
Experimentelle Analyse der Laufzeit
1.
2.
6.
Iterative Breitensuche
Dijkstras Algorithmus
Bewertungsfunktionen
A*
Synthetischer Graph
Minneapolis
Zusammenfassung
Worum es heute geht Routenplanung
• Das heutige Verkehrsaufkommen verlangt ein
effizientes Management des Verkehrs.
• Eine Studie in den USA hat abgeschätzt, daß sich
durch geschickte Routenplanung 6% der Fahrzeiten
vermeiden lassen könnten.
• Routenplanungssysteme bestehen aus drei
Einheiten: Routenberechnung, Routenbewertung und
Routendarstellung
• Wir beschäftigen uns heute aber nur mit der
Routenberechnung (in Folge auch Wegsuche
genannt).
Motivation und Ziel
• Traditionelle Wegsuche-Algorithmen berechnen mehr
Wege als für unsere Zielsetzung notwendig sind.
• Sie sind auch nicht an dynamische Kantenkosten
(Verkehrsstau) angepasst.
• Außerdem nehmen sie häufig an, daß die Daten im
Hauptspeicher bearbeitet werden; das tatsächliche
Datenaufkommen ist aber so groß, daß es sinnvoll
nur mit Hilfe von Datenbankmanagmentsystemen
verwaltet werden kann.
Straßenkarten
• Wir wollen die Straßenkarten durch einen Graph
charakterisieren, dessen Kanten sowohl statische als
auch dynamische Attribute besitzen.
• Die Attribute können nun durch drei verschiedene
Verteilungen kategorisiert werden: gleichmäßig,
leicht-variiert und unregelmäßig
• Die Algorithmen lassen sich in drei Klassen einteilen:
alle-Paare-Probleme, einzel-Quelle-Probleme und
einzel-Paar-Probleme
Algorithmen
• Im folgenden werden drei Algorithmen vorgestellt, die
jeweils die jeweils eine Klasse repräsentieren:
Iterative Breitensuche (alle-Paare-Wegsuche),
Dijkstras Algorithmus (einzel-Quelle-Wegsuche) und
A* (einzel-Paar-Wegsuche)
• Ziel der Algorithmen ist es zu einem Paar (Quelle,
Ziel) den schnellsten Weg zu suchen.
• Da dynamische Attribute vorliegen, können wir nicht
einfach alle kürzesten Wege vorausberechnen und
speichern.
Algorithmen – Iterative Breitensuche
Procedure Iterative(N,E,s,d) {
foreach u in N do { C(s,u)=∞; C(u,u)=0;
path(u,v):=null }
frontierSet:=[s];
while not_empty(frontierSet) do {
foreach u in frontierSet do {
frontierSet:=frontierSet-[u];
fetch(u.adjacencyList);
foreach <v,C(u,v)> in u.adjacencyList {
if C(s,v)>C(s,u)+C(u,v) then {
C(s,v):=C(s,u)+C(u,v);
path(s,v):=path(s,u)+edge((u,v);
if not_in(v,frontierSet) then
frontierSet:=frontierSet+[v]; }}}}}
Algorithmen – Dijkstras Algorithmus
Procedure Dijkstra(N,E,s,d) {
foreach u in N do {C(s,u)=∞;
C(u,u)=0; path(u,v):=null;}
frontierSet:=[s]; exploredSet:=emptySet;
while not_empty(frontierSet) do {
select u from frontierSet with minimum C(s,u);
frontierSet:=frontierSet-[u];
exploredSet:=exploredSet+[u]
if (u=d) then terminate else {
fetch(u.adjacencyList);
foreach <v,C(u,v)> in u.adjacencyList
if C(s,v)>C(s,u)+C(u,v) then {
C(s,v):=C(s,u)+C(u,v);
path(s,v):=path(s,u)+(u,v);
if not_in(v,frontierSet∪exploredSet) then
frontierSet:=frontierSet+[v] }}}}
Algorithmen – Bewertungsfunktionen
• Bewertungsfunktionen benutzen wir um
auszusuchen, welcher der vielversprechendste
Knoten im aktuellen Rechenschritt ist.
Wir betrachten zwei Bewertungsfunktionen:
Euklidische Distanz:
(( x1  x2 ) 2  ( y1  y2 ) 2
Manhattan Distanz:
( x1  x2  y1  y2 )
Algorithmen – A*
Procedure A*(N,E,s,d,f) {
foreach u in N do { C(s,u)=∞; C(u,u)=0;
path(u,v):=null;}
frontierSet:=[s]; exploredSet:=emptySet;
while not_empty(frontierSet) do {
select u from frontierSet with min(C(s,u)+f(u,d));
frontierSet:=frontierSet-[u];
exploredSet:=exploredSet+[u];
if (u=d) then terminate else {
fetch(u.adjacencyList);
foreach <v,C(u,v)> in u.adjacencyList {
if C(s,v)>C(s,u)+C(u,v) then {
C(s,v):=C(s,u)+C(u,v);
path(s,v):=path(s,u)+(u,v);
if not_in(v,frontierSet) then
frontierSet:=frontierSet+[v]; }}}}}
Experimentelle Analyse der Laufzeit
– Synthetischer Graph 1/5
• Zum Vergleichen von A* mit den anderen Algorithmen, wollen
wir nun die Laufzeit der Algorithmen auf einem künstlichen
Graph untersuchen:
- Rechteckiger ungerichteter
Graph
- Jeder Knoten hat 4 Nachbarn
(außer den Randknoten)
- Wir betrachten drei verschiedene
Quelle-Ziel-Paare:
[(1,1), (k , k )]
[(1,1), (k ,1)]
 (1  k ) 
[(1,1), (k , 
)]

 2 
Experimentelle Analyse der Laufzeit
– Synthetischer Graph 2/5
• Wir untersuchen die drei im ersten Teil vorgestellten Algorithmen
und wählen die Manhattan-Distanz als Bewertungsfunktion für
A*
• Für unser Testgraph gibt es nun drei Variable Parameter:
- Größe des Graphen: 10*10, 20*20, 30*30
- Pfadlänge
- Kostenmodell:
gleichmäßig – Jeder Kante wird der Wert 1 als Kosten
zugewiesen
leicht-variiert – Jeder Kante wird 1+0,2*U[0,1] zugewiesen
unregelmäßig – Den Kanten [(i,1),(i+1,1)] und [(k,i),(k,i+1)]
werden kleine Kosten zugewiesen
Experimentelle Analyse der Laufzeit
– Synthetischer Graph 3/5
Auswirkungen der Größe des
Graphen
• Es wurde der diagonale Pfad
ausgewählt, um das worst-case
Verhalten zu untersuchen
• Die Größe des Graphen beeinflusst
die Laufzeit von A* und Dijkstra
linear
• Die Breitensuche wächst nur sublinear
mit der Graphengröße
Experimentelle Analyse der Laufzeit
– Synthetischer Graph 4/5
Auswirkungen der Pfadlänge
• Für horizontale Pfade ist A*
besser als die anderen beiden
Algorithmen, ansonsten die
Breitensuche
• Bei A* und Dijkstra steigt die
Ausführungszeit mit der
Pfadlänge
• Die Laufzeit verschlechtert sich
bei A* am stärksten mit der
Pfadlänge
Experimentelle Analyse der Laufzeit
– Synthetischer Graph 5/5
Auswirkungen des
Kostenmodels
Da A* und Dijkstra die Kantenkosten
in ihre Berechnung einbeziehen,
reagieren sie auf unterschiedliche
Kostenmodelle.
Aber auch die Breitensuche verhält
sich je nach Kostenmodell unterschiedlich.
Experimentelle Analyse der Laufzeit
– Minneapolis 1/2
• Als nächsten Schritt wollen wir jetzt die
Laufzeit der Algorithmen an einem
konkreten Fallbeispiel untersuchen.
Wir benutzen einen Ausschnitt
einer tatsächlichen Straßenkarte, die
die Autobahnen und Schnellstraßen
von Minneapolis zeigt
• Sie hat:
1089 Knoten
3300 Kanten (Straßensegmente)
und deckt eine Fläche von 20
Quadratmeilen ab
Experimentelle Analyse der Laufzeit
– Minneapolis 2/2
Der Graph ist ein wenig größer als
der synthetische 30*30 Graph
(1089 gegenüber 900 Knoten)
Wir wollen vier Pfade betrachten:
• 2 diagonale: A nach B
C nach D
• 2 kurze:
D nach G
E nach F
Die Ergebnisse decken sich
mit den Ergebnissen auf den
künstlichen Graphen
Zusammenfassung
Wir haben gesehen, daß aus verschiedenen Gründen
der A*-Algorithmus für unsere Anwendung ein sehr
aussichtsvoller Kandidat ist:
• Er arbeitet auf kurzen Wegen schneller als die anderen
Algorithmen und in der Anwendung werden die meisten
Weganfragen nicht quer über den ganzen Graphen gestellt
• Beim unregelmäßigen Kostenmodell, welches wir in der Praxis
erwarten, ist er der optimalste Algorithmus
Außerdem haben wir gesehen, daß der Algorithmus von
Dijkstra in der Praxis nicht so große Bedeutung hat
Herunterladen