• Keine Ergebnisse gefunden

Kapitel V K¨urzeste Pfade 1. Grundlegende Begriffe

N/A
N/A
Protected

Academic year: 2021

Aktie "Kapitel V K¨urzeste Pfade 1. Grundlegende Begriffe"

Copied!
23
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Kapitel V K¨ urzeste Pfade

1. Grundlegende Begriffe

Betrachte Digraph G = (V, A) oder Graph G = (V, E).

Kante im ungerichteten

Graph

entgegengesetzte (antiparallele) Kanten

r r r r

= b 6

?

Distanzfunktion: d : A −→ R + (bzw. −→ R )

O.B.d.A.: A = V × V , d(x, y) = +∞ f¨ ur Kanten, die eigentlich nicht vorhanden sind.

dis(v, w) := L¨ ange eines k¨ urzesten Pfades von v nach w

∈ R + ∪ {+∞}.

EADS 1 Grundlegende Begriffe 466/530

ľErnst W. Mayr

(2)

Arten von K¨ urzeste-Pfade-Problemen:

1

single-pair-shortest-path (spsp). Beispiel: K¨ urzeste Entfernung von M¨ unchen nach Frankfurt.

2

single-source-shortest-path: gegeben G, d und s ∈ V ,

bestimme f¨ ur alle v ∈ V die L¨ ange eines k¨ urzesten Pfades von s nach v (bzw. einen k¨ urzesten Pfad von s nach v) (sssp).

Beispiel: K¨ urzeste Entfernung von M¨ unchen nach allen anderen Großst¨ adten.

3

all-pairs-shortest-path (apsp). Beispiel: K¨ urzeste Entfernung zwischen allen Großst¨ adten.

Bemerkung: Wir kennen keinen Algorithmus, der das

single-pair-shortest-path berechnet, ohne nicht gleichzeitig (im worst-case) das single-source-shortest-path-Problem zu l¨ osen.

EADS 1 Grundlegende Begriffe 467/530

ľErnst W. Mayr

(3)

2. Das single-source-shortest-path-Problem

Zun¨ achst nehmen wir an, dass d ≥ 0 ist. Alle k¨ urzesten Pfade von a nach b sind o.B.d.A. einfache Pfade.

2.1 Dijkstra’s Algorithmus

Gegeben: G = (V, A), (A = V × V ), Distanzfunktion d : A → R + ∪ {+∞}, Startknoten s, G durch Adjazenzlisten dar- gestellt.

A A A

C C C

r

r r

r r r

r r s 0

EADS 2.1 Dijkstra’s Algorithmus 468/530

ľErnst W. Mayr

(4)

algorithm sssp:=

S := {s}; dis[s] := 0; initialisiere eine Priority Queue P Q, die alle Knoten v ∈ V \ {s} enth¨ alt mit Schl¨ ussel dis[v] := d(s, v) for alle v ∈ V − {s} do from[v] := s od

while S 6= V do

v := ExtractMin(P Q) S := S ∪ {v}

for alle w ∈ V \ S, d(v, w) < ∞ do if dis[v] + d(v, w) < dis[w] then

DecreaseKey(w, dis[v] + d(v, w)) co DecreaseKey aktualisiert dis[w] oc from[w] := v

fi od od

EADS 2.1 Dijkstra’s Algorithmus 469/530

ľErnst W. Mayr

(5)

Seien n = |V | und m = die Anzahl der wirklichen Kanten in G.

Laufzeit (mit Fibonacci-Heaps):

Initialisierung: O(n) ExtractMin: n · O(log n)

Sonstiger Aufwand: m · O(1) (z.B. DecreaseKey )

⇒ Zeitbedarf also: O(m + n log n)

EADS 2.1 Dijkstra’s Algorithmus 470/530

ľErnst W. Mayr

(6)

Korrektheit: Wir behaupten, dass in dem Moment, in dem ein v ∈ V \ {s} Ergebnis der ExtractMin Operation ist, der Wert dis[v]

des Schl¨ ussels von v gleich der L¨ ange eines k¨ urzesten Pfades von s nach v ist.

Beweis:

[durch Widerspruch] Sei v ∈ V \ {s} der erste Knoten, f¨ ur den diese Behauptung nicht stimmt, und sei

r - r - r . . . - r - r - r . . . - r r s s 1 s 2 s r v 1 v 2 v q v -

ein k¨ urzester Pfad von s nach v, mit einer L¨ ange < dis[v]. Dabei sind s 1 , . . . , s r ∈ S, v 1 ∈ / S [r = 0 und/oder q = 0 ist m¨ oglich].

Betrachte den Pfad s r - s 1 r . . . - s r r - v 1 r

; seine L¨ ange ist < dis[v], f¨ ur q ≥ 1 (ebenso f¨ ur q = 0) ist also dis[v 1 ] < dis[v], im

Widerspruch zur Wahl von v.

EADS 2.1 Dijkstra’s Algorithmus 471/530

ľErnst W. Mayr

(7)

Beispiel 108 (Dijkstra’s Algorithmus)

gegeben Graph G;

v 1 ist der Startknoten;

setze v 1 als Bezugsknoten;

setze dis[v 1 ] = 0;

setze dis[Rest] = +∞;

0

∞ 2

6 3

4 3

3 2

1

1 v 1

v 2

v 3

v 4

v 5

v 6

v 7 s

s s

s s

s s

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@

EADS 472/530

ľErnst W. Mayr

(8)

Beispiel 108 (Dijkstra’s Algorithmus)

gegeben Graph G;

v 1 ist der Startknoten;

setze v 1 als Bezugsknoten;

setze dis[v 1 ] = 0;

setze dis[Rest] = +∞;

0

∞ 2

6 3

4 3

3 2

1

1 v 1

v 2

v 3

v 4

v 5

v 6

v 7 s

s s

s s

s s

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@

setze dis[v 2 ] = 2;

markiere (v 1 , v 2 );

setze dis[v 3 ] = 6;

markiere (v 1 , v 3 );

setze v 2 als Bezugsknoten, da dis[v 2 ] minimal;

∞ 0 ∞

2 6

f

3

@

@

@

@

@

@

@

@

@

@

@

@ R 2

6 3

4 3

3 2

1

1 v 1

v 2

v 3

v 4

v 5

v 6

v 7 s

s s

s s

s s

@

@

@

@

@

@

@

@

@

@

@

@

EADS 472/530

ľErnst W. Mayr

(9)

Beispiel 108 (Dijkstra’s Algorithmus)

setze dis[v 2 ] = 2;

markiere (v 1 , v 2 );

setze dis[v 3 ] = 6;

markiere (v 1 , v 3 );

setze v 2 als Bezugsknoten, da dis[v 2 ] minimal;

∞ 0 ∞

2 6

f

3

@

@

@

@

@

@

@

@

@

@

@

@ R 2

6 3

4 3

3 2

1

1 v 1

v 2

v 3

v 4

v 5

v 6

v 7 s

s s

s s

s s

@

@

@

@

@

@

@

@

@

@

@

@

setze dis[v 3 ] = 2 + 3 = 5;

markiere (v 2 , v 3 );

unmarkiere (v 1 , v 3 );

setze dis[v 4 ] = 2 + 4 = 6;

markiere (v 2 , v 4 );

setze v 3 als Bezugsknoten, da dis[v 3 ] minimal;

∞ 0 ∞

2 5

6 f

@

@

@

@

@

@

@

@

@

@

@

@ R

- 2

6 3

4 3

3 2

1

1 v 1

v 2

v 3

v 4

v 5

v 6

v 7 s

s s

s s

s s

@

@

@

@

@

@

@

@

@

@

@

@

EADS 472/530

ľErnst W. Mayr

(10)

Beispiel 108 (Dijkstra’s Algorithmus)

setze dis[v 3 ] = 2 + 3 = 5;

markiere (v 2 , v 3 );

unmarkiere (v 1 , v 3 );

setze dis[v 4 ] = 2 + 4 = 6;

markiere (v 2 , v 4 );

setze v 3 als Bezugsknoten, da dis[v 3 ] minimal;

∞ 0 ∞

2 5

6 f

@

@

@

@

@

@

@

@

@

@

@

@ R

- 2

6 3

4 3

3 2

1

1 v 1

v 2

v 3

v 4

v 5

v 6

v 7 s

s s

s s

s s

@

@

@

@

@

@

@

@

@

@

@

@

setze dis[v 5 ] = 5 + 2 = 7;

markiere (v 3 , v 5 );

setze dis[v 6 ] = 5 + 3 = 8;

markiere (v 3 , v 6 );

setze v 4 , dann v 5

als Bezugsknoten;

0 ∞

2 5

6 7

8 f

@

@

@

@

@

@

@

@

@

@

@

@ R

- -

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@ R 2

6 3

4 3

3 2

1

1 v 1

v 2

v 3

v 4

v 5

v 6

v 7 s

s s

s s

s s

@

@

@

@

EADS 472/530

ľErnst W. Mayr

(11)

Beispiel 108 (Dijkstra’s Algorithmus)

setze dis[v 5 ] = 5 + 2 = 7;

markiere (v 3 , v 5 );

setze dis[v 6 ] = 5 + 3 = 8;

markiere (v 3 , v 6 );

setze v 4 , dann v 5

als Bezugsknoten;

0 ∞

2 5

6 7

8 f

@

@

@

@

@

@

@

@

@

@

@

@ R

- -

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@ R 2

6 3

4 3

3 2

1

1 v 1

v 2

v 3

v 4

v 5

v 6

v 7 s

s s

s s

s s

@

@

@

@

setze dis[v 7 ] := 7 + 1 = 8;

markiere (v 5 , v 7 );

alle Knoten wurden erreicht:

⇒ Algorithmus zu Ende 0

2 5

6 7

8 8 f

@

@

@

@

@

@

@

@

@

@

@

@ R

- -

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@

@ R

@

@

@

@

@

@

@

@

@

@

@

@ R

2 6

3

4 3

3 2

1

1 v 1

v 2

v 3

v 4

v 5

v 6

v 7 s

s s

s s

s s

EADS 2.1 Dijkstra’s Algorithmus 472/530

ľErnst W. Mayr

(12)

Beobachtung:

ExtractMin liefert eine (schwach) monoton steigende Folge von Schl¨ usseln dis[·];

Die Schl¨ ussel 6= ∞ in P Q sind stets ≤ dis[v] + C, wobei v das Ergebnis der vorangehenden ExtractMin-Operation (bzw.

s zu Beginn) und C := max (u,w)∈A {dis(u, w)} ist.

Satz 109

Dijkstra’s Algorithmus (mit Fibonacci-Heaps) l¨ ost das single-source-shortest-path-Problem in Zeit O(m + n log n).

EADS 2.1 Dijkstra’s Algorithmus 473/530

ľErnst W. Mayr

(13)

Bemerkungen:

1

Verwendet man Dijkstra’s Algorithmus mit d-Heaps, so erh¨ alt man Laufzeit

O(m log 2+

m

n

n)

2

Mikkel Thorup:

Undirected single-source shortest paths with positive integer weights in linear time

J. ACM 46(3), pp. 362–394 (1999)

EADS 2.1 Dijkstra’s Algorithmus 474/530

ľErnst W. Mayr

(14)

2.2 Dijkstra’s Algorithmus mit Radix-Heaps

dis[v] dis[v 0 ]

r r r r · · · r r r

d(v) ∈ [0, . . . , C] (alle Werte sind zwischen dis[v] und nC)

dis[v] dis[v 0 ] 6 H Y H H

v v 0 +∞

s S

r r r r r r - r

EADS 2.2 Dijkstra’s Algorithmus mit Radix-Heaps 475/530

ľErnst W. Mayr

(15)

Wir verwenden Radix-Heaps (siehe dort), in der einstufigen Variante wie vorgestellt.

Satz 110

Dijkstra’s Algorithmus mit einstufigen Radix-Heaps hat Zeitkomplexit¨ at O(m + n log C).

Beweis:

siehe Satz 72.

EADS 2.2 Dijkstra’s Algorithmus mit Radix-Heaps 476/530

ľErnst W. Mayr

(16)

Verbesserungen:

1

zweistufige Heaps: O(m + n · log log log C C )

2

mehrstufige Heaps (+Fibonacci-Heaps): O(m + n √ log C)

R.K. Ahuja, Kurt Mehlhorn, J.B. Orlin, R.E. Tarjan:

Faster Algorithms for the Shortest Path Problem J.ACM 37, pp. 213–223 (1990)

EADS 2.2 Dijkstra’s Algorithmus mit Radix-Heaps 477/530

ľErnst W. Mayr

(17)

2.3 Bellman-Ford-Algorithmus Wir setzen (zun¨ achst) wiederum voraus:

d ≥ 0 .

Dieser Algorithmus ist ein Beispiel f¨ ur dynamische Programmierung.

Sei B k [i] := L¨ ange eines k¨ urzesten Pfades von s zum Knoten i, wobei der Pfad h¨ ochstens k Kanten enth¨ alt.

Gesucht ist B n−1 [i] f¨ ur i = 1, . . . , n (o.B.d.A. V = {1, . . . , n}).

EADS 2.3 Bellman-Ford-Algorithmus 478/530

ľErnst W. Mayr

(18)

Initialisierung:

B 1 [i] :=

 

 

d(s, i) , falls d(s, i) < ∞, i 6= s 0 , falls i = s

+∞ , sonst Iteration:

for k := 2 to n − 1 do for i := 1 to n do

B k [i] :=

0 , falls i = s

min j∈N

−1

(i) {B k−1 [i], B k−1 [j] + d(j, i)} , sonst od

od

Bemerkung: N −1 (i) ist die Menge der Knoten, von denen aus eine Kante zu Knoten i f¨ uhrt.

EADS 2.3 Bellman-Ford-Algorithmus 479/530

ľErnst W. Mayr

(19)

Korrekheit:

klar (Beweis durch vollst¨ andige Induktion) Zeitbedarf:

Man beachte, dass in jedem Durchlauf der ¨ außeren Schleife jede Halbkante einmal ber¨ uhrt wird.

Satz 111

Der Zeitbedarf des Bellman-Ford-Algorithmus ist O(n · m).

Beweis:

s.o.

EADS 2.3 Bellman-Ford-Algorithmus 480/530

ľErnst W. Mayr

(20)

3. Floyd’s Algorithmus f¨ ur das all-pairs-shortest-path-Problem Dieser Algorithmus wird auch als

” Kleene’s Algorithmus“

bezeichnet. Er ist ein weiteres Beispiel f¨ ur dynamische Programmierung.

Sei G = (V, E) mit Distanzfunktion d : A → R + 0 gegeben. Sei o.B.d.A. V = {v 1 , . . . , v n }.

Wir setzen nun

c k ij := L¨ ange eines k¨ urzesten Pfades von v i nach v j , der als innere Knoten (alle bis auf ersten und letzten Knoten) nur Knoten aus {v 1 , . . . , v k } enth¨ alt.

EADS 3.0 Bellman-Ford-Algorithmus 481/530

ľErnst W. Mayr

(21)

algorithm floyd :=

for alle (i, j) do c (0) ij := d(i, j) od co 1 ≤ i, j ≤ n oc for k := 1 to n do

for alle (i, j), 1 ≤ i, j ≤ n do c (k) ij := min

n

c (k−1) ij , c (k−1) ik + c (k−1) kj o od

od

EADS 3.0 Bellman-Ford-Algorithmus 482/530

ľErnst W. Mayr

(22)

Laufzeit: O(n 3 ) Korrektheit:

Zu zeigen: c (k) ij des Algorithmus = c k ij (damit sind die L¨ angen der k¨ urzesten Pfade durch c (n) ij gegeben).

Beweis:

Richtig f¨ ur k = 0. Induktionsschluss: Ein k¨ urzester Pfad von v i

nach v j mit inneren Knoten ∈ {v 1 , . . . , v k+1 } enth¨ alt entweder v k+1 gar nicht als inneren Knoten, oder er enth¨ alt v k+1 genau einmal als inneren Knoten. Im ersten Fall wurde dieser Pfad also bereits f¨ ur c (k) ij betrachtet, hat also L¨ ange = c (k) ij . Im zweiten Fall setzt er sich aus einem k¨ urzesten Pfad P 1 von v i nach v k+1 und einem k¨ urzesten Pfad P 2 von v k+1 nach v j zusammen, wobei alle inneren Knoten von P 1 und P 2 ∈ {v 1 , . . . , v k } sind. Also ist die L¨ ange des Pfades = c (k) i,k+1 + c (k) k+1,j .

EADS 3.0 Bellman-Ford-Algorithmus 483/530

ľErnst W. Mayr

(23)

Satz 112

Floyd’s Algorithmus f¨ ur das all-pairs-shortest-path-Problem hat Zeitkomplexit¨ at O(n 3 ).

EADS 3.0 Bellman-Ford-Algorithmus 484/530

ľErnst W. Mayr

Referenzen

ÄHNLICHE DOKUMENTE

Wir bearbeiten die allgemeine Situation eines Turmes mit einem regelmäßigen n-Eck als Grundriss und nummerieren die Dachflächen mit k ∈ { 1, ..., n }!. Die aufgenommene Wassermenge

Da der Graph keine Zyklen mit negativen Gesamtkosten enth¨ alt, kann kein Pfad von s zu s negative Kosten haben. Die Kosten des leeren Pfades sind damit optimal und distance[s]

I distance[u]: L¨ ange des k¨ urzesten bekannten Pfades zu u I distance[v]: L¨ ange des k¨ urzesten bekannten Pfades zu v I parent[v]: Vorg¨ anger in letzter Kante. des k¨

distance: knotenindiziertes Array, das an Stelle v die Kosten des k¨ urzesten bekannten Pfades vom Startknoten zu v enth¨ alt.. pq: indizierte Priority-Queue von Knoten Knoten

I Liegt ein Knoten eines solchen Zyklus auf einem Pfad von s nach v, k¨ onnen wir Pfade finden, deren Gewicht niedriger als jeder gegebene Wert ist. → kein korrekt

Dieser Knoten v wird besucht und seine ausge- henden Kanten werden in Betracht gezogen um f¨ur die Nachbarknoten N + (v ) gegebenen- falls k¨urzere als bisher bekannte Pfade

Damit ist die Maximallänge eines kürzesten Weges durch ein n ∈ N beschränkt und es gibt nur endlich viele Kandidaten für kürzeste Wege.. Bemerkung: es kann exponentiell viele

Damit ist die Maximallänge eines kürzesten Weges durch ein n ∈ N beschränkt und es gibt nur endlich viele Kandidaten für kürzeste Wege.. Bemerkung: es kann exponentiell viele