Kürzeste Wege in einem gewichteten Graphen Anwendungen

Werbung
Kürzeste Wege in einem gewichteten Graphen
Dazu werden die Gewichte als Weglängen interpretiert.
Der
kürzeste Weg zwischen zwei Knoten in einem
zusammenhängenden Graphen ist derjenige, bei dem die
Summe der Gewichte über die durchlaufenen Kanten den
kleinstmöglichen Wert annimmt.
Anwendungen
I Routenplanung
I Routing im Internet
dijkstra.pdf, Seite 1
Der Algorithmus von Dijkstra
Gegeben: zusammenhängender gewichteter (gerichteter oder
ungerichteter) Graph mit positiven Gewichten.
Der Algorithmus liefert von einem fest gewählten
Startknoten
den kürzesten Weg zu allen anderen Knoten.
(sofern diese vom Startknoten aus überhaupt durch einen Weg
erreichbar sind)
Funktionsweise
I Es gibt unmarkierte, temporär markierte und permanent
markierte Knoten, jeder markierte Knoten bekommt eine
Zahl (Label)
L
j
sowie einen Vorgängerknoten
zugeordnet, für die umarkierten Knoten setze
L
j
= ∞.
I Zu Beginn ist der Startknoten 1 permanent markiert mit
Label
P1 = 0, alle anderen Knoten sind unmarkiert.
dijkstra.pdf, Seite 2
Teilschritte des Algorithmus von Dijkstra
aktuellen Knoten i unter den
in jedem Schritt wähle den
temporär markierten Knoten als denjenigen mit dem kleinsten
Label und führe folgende Teilschritte durch:
I der aktuelle Knoten i wird permanent markiert, sein Label
L
i
bleibt von nun an unverändert und gibt die kürzeste
Entfernung zwischen den Knoten 1 und i an.
I Durchlaufe alle Kanten ij mit Gewicht
g (i , j ), die den
aktuellen Knoten i mit einem noch nicht permanent
markierten Knoten j verbinden. Dabei wird der Knoten
j
temporär markiert und
I ist
i
L + g (i , j ) < L ,
i
j
so setze
als Vorgängerknoten für
I ist
L + g (i , j ) ≥ L ,
i
j
j,
L = L + g (i , j )
so bleiben
Vorgängerknoten von
j
j
i
L
j
und wähle
und der
unverändert.
dijkstra.pdf, Seite 3
Ende des Algorithmus
Der Algorithmus ist beendet, wenn es keine temporär
markierten Knoten mehr gibt. Ist der Graph (stark)
zusammenhängend, sind dann alle Knoten permanent markiert.
Das Label
L
i
gibt dann die Entfernung vom Startknoten 1 an,
den kürzesten Weg zwischen den Knoten 1 und i bekommt
man, indem man entlang der Vorgängerknoten zurück geht.
Bemerkung
Während der Zwischenschritte gilt: Das Label
L
j
zusammen
mit den jeweiligen Vorgängerknoten gibt den jeweils kürzesten
schon gefundenen Weg zwischen 1 und
Ist die Markierung von
j
j
an.
permanent, so steht fest, dass dies
der kürzeste mögliche Weg ist, bei einer temporären
Markierung ist es möglich, dass in einem späteren Schritt noch
ein kürzerer Weg gefunden wird.
dijkstra.pdf, Seite 4
dijkstra.pdf, Seite 5
dijkstra.pdf, Seite 6
dijkstra.pdf, Seite 7
dijkstra.pdf, Seite 8
dijkstra.pdf, Seite 9
dijkstra.pdf, Seite 10
dijkstra.pdf, Seite 11
dijkstra.pdf, Seite 12
dijkstra.pdf, Seite 13
dijkstra.pdf, Seite 14
dijkstra.pdf, Seite 15
dijkstra.pdf, Seite 16
dijkstra.pdf, Seite 17
dijkstra.pdf, Seite 18
Bemerkungen
I Die Kanten, die jeden Knoten mit seinem jeweiligen
Vorgänger verbinden, bilden einen aufspannenden Baum,
durch den alle kürzesten Wege vom Startknoten zu jedem
anderen Knoten verlaufen.
Dieser Baum ist im allgemeinen
kein minimaler
aufspannender Baum, wie er mit dem Algorithmus von
Kruskal bestimmt werden kann. Der durch den
Algorithmus von Dijkstra bestimmte Baum hängt im
allgemeinen vom Startknoten ab.
I Der Algorithmus von Dijkstra funktioniert sowohl für
gerichtete als auch für ungerichtete Graphen.
Im Fall eines gerichteten Graphen werden nur Kanten
betrachtet, die vom aktuellen Knoten ausgehen und zu
einem noch nicht permanent markierten Knoten führen.
dijkstra.pdf, Seite 19
Weitere Bemerkungen
I Bei geeigneter Implementierung hat der Algorithmus eine
Komplexität von
Knoten und
O (n · log n + m), wobei n die Anzahl der
m die Anzahl der Kanten ist.
I Der Algorithmus von Dijkstra ist ein GreedyAlgorithmus.
I Soll nur der kürzeste Weg vom Startknoten A zu einem
bestimmten Knoten B gefunden werden, so kann der
Algorithmus abgebrochen werden, sobald B permanent
markiert ist.
dijkstra.pdf, Seite 20
Tabellarische Darstellung: Vorgehensweise
Die Tabelle wird zeilenweise erstellt. Zunächst wählt man den
Knoten
i
mit der kleinsten temporären Markierung
L
i
aus der
Vorgängerzeile als aktuellen Knoten. Dann betrachtet man alle
noch nicht permanent markierten Nachbarknoten
Knotens
i
und prüft, ob
diesen Wert sowie
i
L + g (i , j ) < L .
i
j
j
des aktuellen
Wenn ja, trägt man
als Vorgängerknoten von
j
in die Tabelle ein,
ansonsten übernimmt man den Eintrag der letzten Zeile. Für die
Knoten
j,
die keine Nachbarn des aktuellen Knotens sind,
übernimmt man ebenfalls die Einträge aus der letzten Zeile.
Tabellarische Darstellung am Beispiel
aktuell
KA/0
OL/231
ZH/265
LU/284
KS/348
BZ/425
MI/538
KA
0/*
OL
231/KA
231/KA
ZH
265/KA
265/KA
265/KA
LU
KS
BZ
MI
∞
∞
∞
∞
∞
∞
∞
∞
284/OL
284/OL
284/OL
348/OL
348/OL
348/OL
348/OL
448/ZH
425/LU
425/LU
425/LU
538/KS
538/KS
538/KS
dijkstra.pdf, Seite 21
Weiteres Beispiel (Startknoten A)
akt.
A
B
C
D
E
F
dijkstra.pdf, Seite 22
Weiteres Beispiel (Startknoten A)
akt.
A/0
A
0/*
B
3/A
C
D
∞ ∞
E
F
6/A
∞
dijkstra.pdf, Seite 23
Weiteres Beispiel (Startknoten A)
akt.
A/0
B/3
A
0/*
B
C
D
E
F
3/A
∞
∞
∞
6/A
∞
5/B
9/B
3/A
8/B
dijkstra.pdf, Seite 24
Weiteres Beispiel (Startknoten A)
akt.
A/0
B/3
E/5
A
0/*
B
C
D
3/A
∞
∞ 6/A
∞ 5/B
∞ 5/B
3/A
8/B
7/E
E
F
∞
9/B
9/B
dijkstra.pdf, Seite 25
Weiteres Beispiel (Startknoten A)
akt.
A/0
B/3
E/5
C/7
A
0/*
B
C
D
E
F
3/A
∞
∞
∞
∞
6/A
∞
5/B
9/B
3/A
8/B
7/E
7/E
11/C
5/B
9/B
8/C
dijkstra.pdf, Seite 26
Weiteres Beispiel (Startknoten A)
akt.
A/0
B/3
E/5
C/7
F/8
A
0/*
B
C
D
E
F
3/A
∞
∞
∞
∞
6/A
∞
5/B
9/B
3/A
8/B
7/E
7/E
11/C
10/F
5/B
9/B
8/C
8/C
dijkstra.pdf, Seite 27
Weiteres Beispiel (Startknoten A)
akt.
A/0
B/3
E/5
C/7
F/8
D/10
A
0/*
B
C
D
E
F
3/A
∞
∞
∞
∞
6/A
∞
5/B
9/B
3/A
8/B
7/E
7/E
11/C
10/F
10/F
5/B
9/B
8/C
8/C
dijkstra.pdf, Seite 28
Bemerkung
Auf die explizite Notation der Vorgängerknoten kann
verzichtet werden.
Der Vorgänger einen Knotes
j
ist immer der aktuelle Knoten in
derjenigen Zeile, in der die endgültige Markierung von
j
zum
ersten Mal auftritt.
akt.
A/0
B/3
E/5
C/7
F/8
D/10
A
0
B
C
D
E
F
3
∞
∞
∞
∞
6
∞
5
9
3
8
7
7
11
10
10
5
9
8
8
Z. B. ist C der Vorgänger von F, da die Markierung 8 erstmals
in der Zeile mit C als aktuellem Knoten auftritt.
dijkstra.pdf, Seite 29
Herunterladen