Graphen - Informatik

Werbung
Slide 1

Graphen
und ihre Implementierung
Klaus Becker
2007


Slide 2

Graphen

2

KO

54
128
RB

28

35
BI

98

33

35
TR

MZ

AZ
36

48

116

FT
KL

48

31

SP
Zielsetzung: Am Beispiel von Graphen

Standardalgorithmen zur Lösung von Standardproblemen erkunden

eine vorgegebene Klasse zur Erledigung von Standardaufgaben
benutzen (und erweitern)


Slide 3

3

Teil 1

Graphen und Graphenprobleme


Slide 4

4

tratsCH trATsch

23. Bundeswettbewerb Informatik:

siehe: http://www.mk-intern.bildung-lsa.de/Bildung/be-bundeswettbewerbinformatik2004_2005.pdf


Slide 5

5

tratsCH trATsch

23. Bundeswettbewerb Informatik:


Slide 6

6

Aufgabe

Stellen Sie die in der Tabelle abgebildeten
Informationen möglichst übersichtlich
grafisch dar.
Über wen darf A Schlechtes schreiben,
ohne einen Charmefehler zu riskieren?


Slide 7

Graphen

7

Graphen sind mathematische Strukturen, mit deren Hilfe man Objekte und
die sie verbindenden Beziehungen beschreibt. Ein Graph besteht dabei aus
sog. Knoten und Kanten. Die Knoten repräsentieren die Objekte, die
Kanten die Beziehungen zwischen den Objekten.
E

B

F
A
D
G

H

C

Mathematisch: G = (V, E)
V = {A, B, C, D, E, F, G} ist die Menge der Knoten.
E = {(A,B), (A,E), (B,C), ..., (H,D)} ist die Menge der Kanten.


Slide 8

Typen von Graphen

8

Je nach Anwendung ist es sinnvoll, Kanten gerichtet oder ungerichtet zu
modellieren. Bei gerichteten Graphen werden in der Regel auch sog.
Schlingen zugelassen. Werden die Kanten mit zusätzlichen Gewichten
versehen, so spricht man von gewichteten oder bewerteten Graphen.
E

B

E

B

5

12

8

F
A

11

F

A
D

D

17
G

C

gerichteter, unbewerteter Graph

3

H
C

6

8
G
5

ungerichteter, bewerteter Graph

H


Slide 9

Klassische Graphenprobleme

9

Wege, Erreichbarkeit:
Gibt es einen Weg zwischen Knoten X und Knoten Y?

E

B

F

A
D
G

H

C

Kann Tratsch von A nach H gelangen? Kann Tratsch von H nach A gelangen?


Slide 10

Klassische Graphenprobleme

10

Zusammenhang, Zyklen:
Gibt es von jedem Knoten zu jedem anderen Knoten einen Weg entlang der
Kanten?
Gibt es Zyklen (d. h. geschlossene Wege) innerhalb des Graphen?
E

B

F
A
D
G

H

C

Von H gibt es keinen Weg zu A. Der Graph ist nicht stark zusammenhängend.
Der Graph enthält Zyklen, z. B. C -> G -> H -> D -> C


Slide 11

11

Klassische Graphenprobleme

Euler-Weg / Euler-Kreis:
Gibt es einen (geschlossenen) Weg, der jede Kante genau einmal besucht?

Königsberger Brückenproblem

Haus des Nikolaus


Slide 12

12

Klassische Graphenprobleme

Hamilton-Kreis / Rundreise:
Gibt es einen geschlossenen
Weg, der jeden Knoten genau
einmal besucht?

Rundreise durch alle 15112
Gemeinden in Deutschland

siehe: http://www.tsp.gatech.edu/d15sol/d15map.html


Slide 13

13

Klassische Graphenprobleme

Abstände:
Wie viele Stationen liegen zwischen einem Startknoten X und einem
Zielknoten Y?

siehe: http://www.mvv-muenchen.de/web4archiv/objects/download/2/schnellbahnnetz_2007.pdf


Slide 14

14

Klassische Graphenprobleme

kürzeste Wege:
Welcher Weg zwischen Knoten X und Knoten Y ist der kürzeste?
KO

54

128
RB

28

35

MZ

BI

98

33

35
TR

AZ
36

48

116

FT
KL

48

31

SP

kürzester Weg von SP nach KO: SP -> FT -> AZ -> BI -> RB -> KO


Slide 15

15

Teil 2

Graphenalgorithmen
Fallstudie: Wege in Graphen


Slide 16

Problem 1: Graphen durchlaufen

16

Problem: Welche Knoten kann man von einem Startknoten aus mit einem
Weg entlang der Kanten erreichen?

E

B

F
A
D
G
C

H


Slide 17

17

Problem 2: Abstände bestimmen

Problem: Wie viele Knoten liegt ein Zielknoten vom Startknoten entfernt?


Slide 18

18

Problem 3: kürzeste Wege bestimmen

Problem: Welcher Weg von einem Startknoten zu einem Zielknoten ist am
kürzesten?
KO

54
128
RB

28

35
BI

98

33

35

TR

MZ

AZ
36

48

116

FT
KL

48

31

SP


Slide 19

19

Aufgabe

Überlegen Sie sich selbst ein Verfahren, wie man eines der vorgestellten
Probleme lösen kann.
Tipp: Nutzen Sie die Möglichkeit, Zusatzinformationen an Knoten zu
schreiben.


Slide 20

20

Aufgabe

Sie können sich auch auf den Webseiten des "(Math)e(prism)a" informieren. Hier
finden Sie Algorithmen zur Lösung der drei vorgestellten Probleme.
Quelle: http://www.matheprisma.uni-wuppertal.de/Module/Graphen/index.htm

Benutzen Sie das Programm "Shortest Path Animation", um die Grundidee des
Algorithmus von Dijkstra zur Lösung von Problem 3 herauszufinden.
Quelle: http://www.educeth.ch/informatik/puzzles/routing/docs/dijkstra.exe


Slide 21

21

Algorithmus "Graph durchlaufen"

{Eingabe: Graph G; Startknoten s des Graphen}
für alle Knoten w
markiere w als nicht besucht
füge s in eine (zunächst leere) Datenstruktur D ein
solange D nicht leer ist
entnimm einen Knoten w aus D
für alle Kanten {w,u}
falls u nicht markiert ist
markiere u
füge u in D ein
{Ausgabe: Markierungen für alle Knoten w von G; ein Knoten ist genau
dann als 'besucht' markiert, wenn er üben einen Weg mit s verbindbar ist}

Quelle: http://www.matheprisma.uni-wuppertal.de/Module/Graphen/index.htm


Slide 22

Beispiel

22
B

0

F

D

C

0

B

D

C

E
A

S

Vorbereitungsschritt
markiere alle Knot. als nicht besucht (hier 0)
markiere S als besucht (hier 1)
füge s in e. Datenstruktur D (hier grün) ein

0

B

F

D

C

1

0

0

0

0

A

0

0

1

entnimm einen Knoten w (hier blau) aus D
für alle Kanten {w,u}
falls u nicht markiert ist
markiere u
füge u in D ein

Wiederholungsschritt

0

1

B

F

D

C

E
S

0

E

S

0

F

0

E
A

S

0

1

1

A
0

0


Slide 23

Beispiel

23
0

1

B

F

D

C

0

0

0

1

B

D

C

E
S
1

A

S

0

1

B

F

D

C

1

1

1

B

1

1

B

D

C

A

S

0

1

F

D

C

S

0

1

1

0

1

1

A

1

1

Auswahlstrategie
Last In
First Out
-> Tiefensuche
1

0

1

B

F

D

C

E
A

F

E

1

0

0

E
S

1

entnimm einen Knoten w (hier blau) aus D
für alle Kanten {w,u}
falls u nicht markiert ist
markiere u
füge u in D ein

Auswahlstrategie
First In
First Out
-> Breitensuche

1

0

0

E

1

0

F

1

E
A

S

1

1

1

A
1

0


Slide 24

Beispiel

24
1

1

B

F

D

C

1

0

1

1

B

D

C

E
S

F

0

1

E

1

1

A

S

1

1

A

1

1

entnimm einen Knoten w (hier blau) aus D
für alle Kanten {w,u}
falls u nicht markiert ist
markiere u
füge u in D ein
1

1

B

F

D

C

1

1

0

1

1

1

F

D

C

E
S

B

Ergebnis:
Von S aus gibt es Wege zu
den folgenden Knoten:
A, B, C, D, E.

1

E
A

S

1

1

1

A
1

0


Slide 25

25

Algorithmus von Moore

{Eingabe: Graph G; Startknoten s des Graphen}
für alle Knoten w
setze dg(w) = ∞
setze dg(s) = 0
füge s in eine (zunächst leere) Datenstruktur D ein
solange D nicht leer ist
entnimm einen Knoten w aus D
für alle Kanten {w,u}
falls dg(u) = ∞
setze dg(u) = dg(w)+1
füge u in D ein

{Ausgabe: Abstand d(w) aller Knoten w von s; Knoten mit d(w) = ∞ sind
nicht mit s verbindbar}

Quelle: http://www.matheprisma.uni-wuppertal.de/Module/Graphen/index.htm


Slide 26

Beispiel

26
B



F

D

C



B

D

C

E
A

S

Vorbereitungsschritt
für alle Knoten w
setze dg(w) = ∞
setze dg(s) = 0
füge s in eine Datenstruktur D (hier grün) ein



B

F

D

C

0









A





0

entnimm einen Knoten w (hier blau) aus D
für alle Kanten {w,u}
falls dg(u) = ∞
setze dg(u) = dg(w)+1
füge u in D ein

Wiederholungsschritt



1

B

F

D

C

E
S



E

S



F



E
A

S



0

1

A





Slide 27

Beispiel

27


1

B

F

D

C







1

B

D

C

E
S

F





2

1

B

D

C

E

1

0

A

S



0

F



2

E

1

A

S



0

A

1

2

entnimm einen Knoten w (hier blau) aus D
für alle Kanten {w,u}
falls dg(u) = ∞
setze dg(u) = dg(w)+1
füge u in D ein


1

B

F

D

C

2





1

0

1

F

D

C

E
S

B

2

3



1

S



0

1

F

D

C

E
A

B

2

E
A

S

2

0

1

A
2




Slide 28

Beispiel

28
3

1

B

F

D

C

3



2

1

B

D

C

E
S

F



2

E

1

0

A

S

2

0

A

1

2

entnimm einen Knoten w (hier blau) aus D
für alle Kanten {w,u}
falls dg(u) = ∞
setze dg(u) = dg(w)+1
füge u in D ein
3

1

B

F

D

C

2

3



1

0

1

F

D

C

E
S

B

Ergebnis:
Von S aus beträgt der
Abstand zu C und E jeweils
1, zu A und D jeweils 2, zu
B 3 und zu F ∞.

2

E
A

S

2

0

1

A
2




Slide 29

29

Algorithmus von Dijkstra

{Eingabe: Graph G; Startknoten s des Graphen}
für alle Knoten w
setze dg(w) = ∞
setze dg(s) = 0
füge s in eine (zunächst leere) Datenstruktur D ein
solange D nicht leer ist
entnimm einen Knoten w mit minimalem dg(w) aus D
für alle Kanten {w,u}
falls dg(u) = ∞
füge u in D ein
falls dg(u) > dg(w) + g({w,u})
setze dg(u) = dg(w)+g({w,u})
{Ausgabe: gewichteter Abstand dg(w) aller Knoten w vom Startknoten s}

Quelle: http://www.matheprisma.uni-wuppertal.de/Module/Graphen/index.htm


Slide 30

Beispiel

30
3

B



F

8

1

D

C

13

20

16

2

13

20

2

A

19

3

B
8
10



F

C
13

20



16

0

2





19

A


entnimm e. Knoten w m. min. dg(w) aus D
für alle Kanten {w,u}
falls dg(u) = ∞ füge u in D ein
falls dg(u) > dg(w) + g({w,u})
setze dg(u) = dg(w)+g({w,u})

Wiederholungsschritt



3

B

1


2

10

20

F

8

C
13

20

E
S

2

0

4
D

2

S

für alle Knoten w
setze dg(w) = ∞
setze dg(s) = 0
füge s in eine Datenstruktur D (hier grün) ein

1

16
E

Vorbereitungsschritt





D

C

E
S



4

10



F

8

1

4

10

3

B

4
D



16

2

19

A

E
19

A

S



0

2

2






Slide 31

Beispiel

31


3

B





8

1

13

20



D

C

16

20

2

2

2

F





8
D

4


16

2

10

C

13

20

E
S

3

B

1

4

10

20

F

1

0

A

S



0

2

2



4

10

20

F

8
D

C

13

20

E
19

3

B

30

16

2

19

A

E
19

A

S

21

0

2

2

21

entnimm e. Knoten w m. min. dg(w) aus D
für alle Kanten {w,u}
falls dg(u) = ∞ füge u in D ein
falls dg(u) > dg(w) + g({w,u})
setze dg(u) = dg(w)+g({w,u})


3

B





8

1
10

20

F

C
13

20

16


2

20

10

C

13

20

E
S
0

2

2

F



D

4
30

16

2

1
10

20

A

S

21

0

2

2

F

8

C
13

20

E
19

3

B



8

1

4
D

3

B

4
D

23

16

2

19

A

E
19

A

S

21

0

2

2

21




Slide 32

Beispiel

32


3

B

31



8

1

D

C

13

20

16

23
2

2

2



4

10

20

F

8
D

23

16

2

19

A

C

13

20

E
S

3

B

1

4

10

20

F

E
A

S

21

0

19

0

2

2

21

entnimm e. Knoten w m. min. dg(w) aus D
für alle Kanten {w,u}
falls dg(u) = ∞ füge u in D ein
falls dg(u) > dg(w) + g({w,u})
setze dg(u) = dg(w)+g({w,u})
31

3

B

31



8

1
10

20

F

C
13

20

D
16

23
2

10

20

0

2

2

F

8

C
13

20

E
S

3

B

1

4

Ergebnis:
Von S aus beträgt der
kürzeste Weg zu E 2, zu C
20, zu A 21, zu D 23, zu B
31 und zu F ∞.

4
D

23

16

2

19

A

E
19

A

S

21

0

2

2

21




Slide 33

33

Teil 3

Implementierung von Graphen


Slide 34

Darstellung: Matrix oder Liste

34
AZ

BI/35

FT/36

KL/48

MZ/33

BI

AZ/35

MZ/35

RB/28

FT

AZ/36

KL/48

SP/31

KL

AZ/48

FT/48

TR/116

KO

RB/54

TR/128

MZ

AZ/33

BI/35

AZ
AZ

BI/28

SP

FT/31

TR

KL/116

KO/54

36

KL

48

KL

35

36

48

KO

TR/128

31
116
128

35
28

54

98

31

TR

116

KO/128
28

MZ

33

35
TR

AZ
36

48

FT
48

128

98

Adjazenzmatrix

35
BI

KL

TR

28

54
33

SP

33

48

128

116

RB

48

SP

98

MZ
35

RB

RB

Adjazenzliste

FT

MZ

54

RB/98

35

FT

KO

KO

RB

BI

BI

31

SP


Slide 35

Einfache Version

35

AZ

Grundidee:

AZ

Die Adjazenzmatrix wird mit
Hilfe einer zweidimensionalen
Reihung dargestellt.

BI

35

FT

36

KL

48

BI

FT

KL

35

36

48

KO

35
48

116

28

54

SP
TR

116

128
35

MZ

BI

98

33

35
TR

AZ
36

48

116

FT
KL

98

31

28

48

128

35

RB

RB

TR

31

48

33

SP

28

54

MZ

54

RB

33

KO

KO

MZ

31

SP

128

98


Slide 36

36

Einfache Version

Grundidee:
Die Adjazenzmatrix wird mit
Hilfe einer zweidimensionalen
Reihung dargestellt.

AZ
AZ
BI

35

FT

36

KL

48

BI

FT

KL

35

36

48

KO

RB

RB

35

TR

28

48

31

48

116
54

33

SP

33

KO
MZ

MZ

128

35
28

SP
TR

54
31
116

type
tKnoten = (A, B, F, K, O, M, R, S, T);
tAdjMatrix = array [tKnoten, tKnoten] of real;
const
graph: tAdjMatrix =
((-1, 35, 36, 48, -1, 33, -1, -1, -1),
(35, -1, -1, -1, -1, 35, 28, -1, -1),
...
(-1, -1, -1,116,128, -1, 98, -1, -1));

98

128

98


Slide 37

Objektorientierte Version

37
AZ

BI/35

FT/36

KL/48

BI

AZ/35

MZ/35

RB/28

FT

AZ/36

KL/48

SP/31

KL

AZ/48

FT/48

TR/116

KO

RB/54

TR/128

MZ

AZ/33

BI/35

RB

BI/28

KO/54

KO

MZ/33

54
128
RB

28

35
BI

98

TR

SP

FT/31

TR

KL/116

RB/98

KO/128

33

35

TR/128

MZ

AZ
36

48

116

FT

Grundidee:
- Jeder Knoten ist ein Objekt.
- Jede Kante ist ein Objekt.

KL

48

31

SP


Slide 38

Objektorientierte Version

38
:TList

0

1

2

3
MZ/33

0

AZ

:TList

BI/35

FT/36

KL/48

1

BI

:TList

AZ/35

MZ/35

RB/28

2

FT

:TList

AZ/36

KL/48

SP/31

3

KL

:TList

AZ/48

FT/48

TR/116

5

KO

:TList

RB/54

TR/128

6

MZ

:TList

AZ/33

BI/35

6

RB

:TList

BI/28

KO/54

TR/128

7

SP

:TList

FT/31

8

TR

:TList

KL/116

RB/98

KO/128

TGraph
- alleKnoten: TList

+
+
+
+

create
neuerKnoten(n: string)
neueKante(n1, n2: string; g: double)
getAlleKnoten: TList

*
TKante

*
*

TKnoten

- zielKnoten: TKnoten
- gewicht: double

- name: string
- kanten: TList

+ create(k: TKnoten; g: double)
+ getZielKnoten: TKnoten
+ getGewicht: double

+
+
+
+

create(n: string)
fuegeHinzu(k: TKante)
getName: string
getKanten: TList


Slide 39

39

Zielsetzung

Ziel ist es, ein Programm zu entwickeln, mit dessen Hilfe man Graphen
verwalten kann. Folgende Anforderungen soll das Programm erfüllen:
/1/ Der Benutzer kann die Knoten und Kanten eines (gewichteten) Graphen
schrittweise eingeben.
/2/ Die aktuellen Knoten und Kanten eines Graphen werden (in einfacher
Form) auf der Benutzungsoberfläche angezeigt.
/3/* Der Benutzer kann nachträglich auch Knoten und Kanten des
eingegebenen Graphen löschen.
/4/* Man kann sich einen kürzesten Weg von einem eingegebenen Startzu einem eingegebenen Zielknoten berechnen und anzeigen lassen.
...


Slide 40

40

Fertige Klasse nutzen

Häufig findet man zu Standardproblemen
fertige Lösungen in Form implementierter
Klassen.

TGraph

Wir gehen im Folgenden davon aus, dass
es eine (halb-) fertig implementierte Klasse
TGraph gibt, deren Funktionalitäten wir
direkt für unsere Zwecke nutzen können.

- alleKnoten: TList

+
+
+
+

create
neuerKnoten(n: string)
neueKante(n1, n2: string; g: double)
getAlleKnoten: TList

*
TKante

*
*

TKnoten

- zielKnoten: TKnoten
- gewicht: double

- name: string
- kanten: TList

+ create(k: TKnoten; g: double)
+ getZielKnoten: TKnoten
+ getGewicht: double

+
+
+
+

create(n: string)
fuegeHinzu(k: TKante)
getName: string
getKanten: TList


Slide 41

41

Aufgabe

Auf den folgenden Folien finden Sie eine
Dokumentation zu den dargestellten
Klassen. Schauen Sie sich diese
Dokumentation zunächst genau an und
nutzen Sie sie bei der weiteren Arbeit.

TGraph
- alleKnoten: TList

+
+
+
+

create
neuerKnoten(n: string)
neueKante(n1, n2: string; g: double)
getAlleKnoten: TList

*
TKante

*
*

TKnoten

- zielKnoten: TKnoten
- gewicht: double

- name: string
- kanten: TList

+ create(k: TKnoten; g: double)
+ getZielKnoten: TKnoten
+ getGewicht: double

+
+
+
+

create(n: string)
fuegeHinzu(k: TKante)
getName: string
getKanten: TList


Slide 42

42

Dokumentation der Klasse TKnoten

Konstruktor create (n: string)
nachher: Es ist ein Knoten mit dem Namensattributwert "name" erzeugt worden. Zudem ist
ein Listenobjekt zur Verwaltung von Kanten erzeugt worden. Es gibt noch keine
Kantenobjekte, die mit dieser Liste verwaltet werden.
Auftrag fuegeHinzu(k: TKante)
nachher: Ein Kantenobjekt ist in die Liste zur Verwaltung der Kanten aufgenommen worden.
Anfrage getName: string
nachher: Die Anfrage liefert den Namen des Knotens.
Anfrage getKanten: TList
nachher: Die Anfrage liefert die Liste der Kanten des Knotens. Hat der Knoten keine Kanten,
wird der Wert "nil" zurückgeliefert.
Destruktor destroy
nachher: Der Knoten existiert nicht mehr.
TKnoten
- name: string
- kanten: TList
+
+
+
+

create(n: string)
fuegeHinzu(k: TKante)
getName: string
getKanten: TList


Slide 43

43

Dokumentation der Klasse TKante

Konstruktor create (k: TKnoten; g: double)
nachher: Es ist eine gerichtete Kante mit dem Zielknoten / Nachbarknoten "k" und dem
Gewicht "g" erzeugt worden.

Anfrage getZielKnoten: string
nachher: Die Anfrage liefert den Namen des Zielknotens.
Anfrage getGewicht: double
nachher: Die Anfrage liefert das Gewicht der Kante.
Destruktor destroy
nachher: Die Kante existiert nicht mehr.

TKante
- zielKnoten: TKnoten
- gewicht: double
+ create(k: TKnoten; g: double)
+ getZielKnoten: TKnoten
+ getGewicht: double


Slide 44

44

Dokumentation der Klasse TGraph

Konstruktor create
nachher: Es ist ein neues Graphobjekt erzeugt worden. Zudem ist ein Listenobjekt zur
Verwaltung aller Knoten erzeugt worden. Es gibt noch keine Knotenobjekte, die mit dieser
Liste verwaltet werden.
Auftrag neuerKnoten(n: string)
nachher: Falls noch kein Knoten mit Namen "n" in der Liste aller Knoten vorkommt, so wird ein
neues Knotenobjekt mit dem übergebenen Parameter als Namensattributwert erzeugt und in
die Liste aller Knoten eingefügt. Ansonsten bleibt die Liste aller Knoten wie bisher.
Auftrag neueKante(n1, n2: string; g: double)
nachher: Falls noch keine Kante von Knoten "n1" zu Knoten "n2" existiert, so wird ein neues
Kantenobjekt erzeugt und in die Liste aller Kanten zum Knoten "n1" hinzugefügt.
Anfrage getAlleKnoten: TList
nachher: Die Anfrage liefert die Liste aller Knoten des Graphen.
Destruktor destroy
nachher: Der Graph existiert nicht mehr.

TGraph
- alleKnoten: TList
+
+
+
+

create
neuerKnoten(n: string)
neueKante(n1, n2: string; g: double)
getAlleKnoten: TList


Slide 45

45

Aufgabe

Ziel: einen Graphen aufbauen
Entwickeln Sie eine passende Benutzungsoberfläche.

Erzeugen Sie ein Objekt der Klasse TGraph. Benutzen Sie die von der
Klasse TGraph bereit gestellten Methoden, um die Knoten und Kanten eines
vorgegebenen Graphen zu erzeugen.


Slide 46

46

Aufgabe

Ziel: einen Graphen anzeigen
Erweitern Sie die Benutzungsoberfläche passend.

Benutzen Sie die von der Klasse TGraph bereit gestellten Methoden, um auf
die Knoten und Kanten eines zuvor erzeugten Graphen zuzugreifen und die
zugehörigen Informationen anzuzeigen. Beachten Sie, dass die von TGraph
bereit gestellten Methoden Knoten bzw. Kanten als Listen zurückgeben.
Informieren Sie sich (z. B. im Demoprogramm „Listen“), wie man auf die
Objekte einer Liste zugreift und die verwalteten Daten anzeigt.


Slide 47

47

Aufgabe

Ziel: Knoten oder Kanten eines Graphen löschen
Die Klasse TGraph enthält noch keine Methoden, mit deren Hilfe man
Knoten oder Kanten eines Graphen löschen kann. Ergänzen Sie passende
Methoden und implementieren Sie diese.


Slide 48

48

Aufgabe

Ziel: Algorithmus von Dijkstra oder Moore implementieren
Erweitern Sie die Klasse TGraph um die Möglichkeit, kürzeste Wege mit
dem Algorithmus von Dijkstra oder Abstände mit dem Algorithmus von
Moore zu bestimmen (Achtung: etwas aufwendiger).
Sie können sich auch eine fertige Lösung zu einem der drei vorgestellten
Probleme anschauen (z. B. Graph durchlaufen) und diese dann zu einer
Lösung eines anderen Problems (z. B. Abstände bestimmen) umarbeiten.


Slide 49

49

Teil 4

Zusammenfassung


Slide 50

50

Standardlösungen

Warum das Rad neu erfinden? Oft ist es sinnvoll, fertige Lösungen zu
nutzen, anstatt selbst nach Lösungen zu suchen. Im Unterricht bieten sich
oft Situationen wie:
- einen Standardalgorithmus erkunden und nutzen
- eine vorgefertigte Klasse nutzen und ggf. erkunden und erweitern
{Eingabe: Graph G; Startknoten s des Graphen}

TGraph

für alle Knoten w
setze dg(w) = ∞
setze dg(s) = 0
füge s in eine (zunächst leere) Datenstruktur D ein
solange D nicht leer ist
entnimm einen Knoten w mit minimalem dg(w) aus D
für alle Kanten {w,u}
falls dg(u) = ∞
füge u in D ein
falls dg(u) > dg(w) + g({w,u})
setze dg(u) = dg(w)+g({w,u})
{Ausgabe: gewichteter Abstand dg(w)
aller Knoten w vom Startknoten s}

- alleKnoten: TList
+
+
+
+

create
neuerKnoten(n: string)
neueKante(n1, n2: string; g: double)
getAlleKnoten: TList

*
TKante

*

*

TKnoten

- zielKnoten: TKnoten
- gewicht: double

- name: string
- kanten: TList

+ create(k: TKnoten; g: double)
+ getZielKnoten: TKnoten
+ getGewicht: double

+
+
+
+

create(n: string)
fuegeHinzu(k: TKante)
getName: string
getKanten: TList


Slide 51

51

Literaturhinweise

Folgende Materialien wurden hier benutzt:
U. Schöning: Ideen der Informatik. Oldenbourg Verlag 2002.
P. Gritzmann, R. Brandenburg: Das Geheimnis des kürzesten Weges. Springer 2002.
Mathe-Prisma: Graphen
http://www.matheprisma.uni-wuppertal.de/Module/Graphen/index.htm
D. Jonietz: Graphen
http://informatik.bildung-rp.de/fileadmin/user_upload/informatik.bildungrp.de/Weiterbildung/pdf/WB-VIII-6-Graphen.pdf


Herunterladen