41
Kürzeste Wege Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut Paulus Speyer, 3.- 5.11.08

Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

Embed Size (px)

Citation preview

Page 1: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

Kürzeste WegeKürzeste Wege

Implementierung des Algorithmus von Dijkstra

Helmut Paulus Speyer, 3.-5.11.08

Page 2: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

Teil 1Teil 1

Objektorientierte Modellierung von Graphen

Page 3: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

33 GraphenGraphen

Ein Graph besteht aus– einer Menge von Knoten (Objekten)

und– einer Menge von Kanten

(Beziehungen), die die Knoten verbinden.

Ein Graph besteht aus– einer Menge von Knoten (Objekten)

und– einer Menge von Kanten

(Beziehungen), die die Knoten verbinden.

Ein Graph beschreibt eine Struktur aus Objekten und den Beziehungen zwischen ihnen.

Klassische Probleme Eulersche Wanderungen

Hamiltonsche Rundreisen

Labyrinthproblem

Problem des Handlungsreisenden

Kürzeste Wege

Page 4: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

44 Algorithmus von DijkstraAlgorithmus 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}

{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

Page 5: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

55 Algorithmus von DijkstraAlgorithmus von Dijkstra

{Eingabe: Graph G; Startknoten s, Zielknoten z des Graphen}

für alle Knoten w      setze Entfernung(w) = 0 füge s in eine (zunächst leere) Warteschlange WS ein solange erstesElement von WS <> z      entnimm den ersten Knoten w von WS      für alle Kanten {w,u} falls u noch nicht besucht          falls Entfernung(u) = 0 setze Vorgänger von u auf w              füge u in WS ein setze Entfernung(u) = Entfernung(w) + gewicht({w,u})           sonst falls Entfernung(u) > Entfernung(w) + gewicht({w,u})                setze Vorgänger von u auf w

setze Entfernung(u) = Entfernung(w) + gewicht({w,u}) füge u erneut in WS ein

{Ausgabe: Abstand des Zielknotens z vom Startknoten s}

{Eingabe: Graph G; Startknoten s, Zielknoten z des Graphen}

für alle Knoten w      setze Entfernung(w) = 0 füge s in eine (zunächst leere) Warteschlange WS ein solange erstesElement von WS <> z      entnimm den ersten Knoten w von WS      für alle Kanten {w,u} falls u noch nicht besucht          falls Entfernung(u) = 0 setze Vorgänger von u auf w              füge u in WS ein setze Entfernung(u) = Entfernung(w) + gewicht({w,u})           sonst falls Entfernung(u) > Entfernung(w) + gewicht({w,u})                setze Vorgänger von u auf w

setze Entfernung(u) = Entfernung(w) + gewicht({w,u}) füge u erneut in WS ein

{Ausgabe: Abstand des Zielknotens z vom Startknoten s}

Abgewandelte Version:

w expandieren

WS: Prioritätenwarteschlange, d. h. die Knoten werden nach ihrer Entfernung

(Priorität) geordnet einsortiert! Der Knoten mit kleinsten Entfernung steht am Anfang.

WS: Prioritätenwarteschlange, d. h. die Knoten werden nach ihrer Entfernung

(Priorität) geordnet einsortiert! Der Knoten mit kleinsten Entfernung steht am Anfang.

Page 6: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

66 Algorithmus von DijkstraAlgorithmus von Dijkstra

A

B

CD

E

F

6

101

2

12

25

16

22

56

Gesucht:

Kürzester Weg von A nach E

WS: A/0

Page 7: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

77 Algorithmus von DijkstraAlgorithmus von Dijkstra

A

B

CD

E

F

6

101

2

12

25

16

22

56

Gesucht:

Kürzester Weg von A nach E

WS:

Page 8: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

88 Algorithmus von DijkstraAlgorithmus von Dijkstra

A

B

CD

E

F

6

101

2

12

25

16

22

56

Gesucht:

Kürzester Weg von A nach E

22

10

12

0

WS: B/10, C/12, F/22

Page 9: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

99 Algorithmus von DijkstraAlgorithmus von Dijkstra

A

B

CD

E

F

6

101

2

12

25

16

22

56

Gesucht:

Kürzester Weg von A nach E

22

10

12

0

WS: C12, F22

Page 10: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

1010 Algorithmus von DijkstraAlgorithmus von Dijkstra

A

B

CD

E

F

6

101

2

12

25

16

22

56

Gesucht:

Kürzester Weg von A nach E

22

10

12

0

15

35

WS: C/12, D/15, F/22, E/35

Page 11: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

1111 Algorithmus von DijkstraAlgorithmus von Dijkstra

A

B

CD

E

F

6

101

2

12

25

16

22

56

Gesucht:

Kürzester Weg von A nach E

22

10

12

0

35

15

WS: D/15, F/22, E/35

Page 12: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

1212 Algorithmus von DijkstraAlgorithmus von Dijkstra

A

B

CD

E

F

6

101

2

12

25

16

22

56

Gesucht:

Kürzester Weg von A nach E

22

10

0

35

15

12

WS: D/15, F/22, E/35

Page 13: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

1313 Algorithmus von DijkstraAlgorithmus von Dijkstra

A

B

CD

E

F

6

101

2

12

25

16

22

56

Gesucht:

Kürzester Weg von A nach E

22

10

12

0

35

15

WS: F/22, E/35

Page 14: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

1414 Algorithmus von DijkstraAlgorithmus von Dijkstra

A

B

CD

E

F

6

101

2

12

25

16

22

56

Gesucht:

Kürzester Weg von A nach E

22

10

12

0

21

15

WS: E/21, F/22

A

B

CD

E

F

6

101

2

12

25

16

22

56

Nach Ausführung

21

0

10

12 1

5

22

Jeder besuchte Knoten enthält den minimalen Abstand zum Startknoten, sowie einen Verweis zu seinem Vorgänger im Pfad (lineare Liste).

WS: F/22

Page 15: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

1515 Implementierung von GraphenImplementierung von Graphen

TKnoten- name : string- kanten : Tkantenliste- anzahlkanten : integer- entfernung : integer- nachfolger, vorgaenger : TKnoten+ create(n : string; x,y : integer)

+ fuegeKantehinzu(nachbar : Tknoten; e : integer)

TKante

- gewicht : integer- nachbar :TKnoten+ create(k : TKnoten; e : integer)

+ gibGewicht : integer+ gibNachbar : TKnoten

*

1

Objektorientierte Lösung:

Jeder Knoten ist ein Objekt

Jede Kante ist ein Objekt

*TGraph

- anzahlKnoten : integer- knoten : TKnotenliste

- initialisiere

+ create

+ berechneWeg(start, ziel :

Tknoten)

+ gibAlleKnoten : Tknotenliste

+ gibKnoten(n : string)

+ gibAnzahlKnoten : integerDas Graphobjekt verwaltet die Knoten und Kanten und stellt den Suchalgorithmus zur

Verfügung.

Page 16: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

1616 ZielsetzungZielsetzung

Ziel ist es, ein Programm zu entwickeln, mit dessen Hilfe man kürzeste Wege im Graphen ermitteln kann. Folgende Anforderungen soll das Programm erfüllen:

/1/ Der Graph wird als Bild auf der Benutzungsoberfläche angezeigt.

/2/ Man kann sich einen kürzesten Weg von einem eingegebenen Start- zu einem eingegebenen Zielknoten berechnen und anzeigen lassen.Arbeitsschritte:

Grafik mit Delphi

Entwicklung einer (Prioritäten-)Warteschlange

Implementierung des Graphen

Implementierung des Dijkstra-Algorithmus

Page 17: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

Teil 2 Teil 2

Grafik mit Delphi

Page 18: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

1818 Zeichenfläche TCanvasZeichenfläche TCanvas

Canvas-Objekte dienen als Zeichenfläche für grafische Elemente.

Sie kapseln eine Vielzahl von Methoden zur Ausgabe von Grafik und Text in einem rechteckigen Bereich.

TCanvas

moveto(x,y : integer);

lineto(x, y : integer);

ellipse(x1,y1,x2,y2 : integer)

rectangle(x1,y1,x2,y2 : integer)

polygon(p : array of Tpoint);

TextOut(x, y: Integer; const Text: string);...

Brush : TBrush

Pen : TPen

Font : TFont...

Pinsel – Füllfarbe, Muster ... Stift – Linienfarbe, Stil ...

Schriftart – Farbe, Schrifttyp ...

Der Koordinatenursprung (0,0) ist in der linken oberen Ecke einer Komponenten, die ein Canvas-Objekt zur Verfügung stellen.

TCanvas-Werkzeuge Pen, Brush und Font, zuständig für bestimmte Teilaufgaben:

Page 19: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

1919 Wie erhält man ein TCanvas-Objekt?Wie erhält man ein TCanvas-Objekt?

TCanvas-Objekte werden von einigen Delphi-Komponenten als Property zur Verfügung gestellt: z. B.:

Formular, Paintbox, Image, Bitmap

Der Koordinatenursprung ist die linke obere Ecke der jeweiligen Komponente.

Die positive y-Achse zeigt nach unten.

Die Image-Komponente speichert die Graphik zusätzlich in einer Hintergrundbitmap, so dass das Bild automatisch anzeigt wird, wenn das Formularfenster, nachdem es verdeckt war, wieder in den Vordergrund geholt wird.

Formular und Paintbox zeichnen das Bild nur einmalig. Damit es nach dem Verdecken wieder erscheint, muss das Zeichnen der Graphik in der OnPaint-Ereignismethode der jeweiligen Komponente erfolgen. Dieses Ereignis wird vom Betriebssystem automatisch ausgelöst.

Der Koordinatenursprung ist die linke obere Ecke der jeweiligen Komponente.

Die positive y-Achse zeigt nach unten.

Die Image-Komponente speichert die Graphik zusätzlich in einer Hintergrundbitmap, so dass das Bild automatisch anzeigt wird, wenn das Formularfenster, nachdem es verdeckt war, wieder in den Vordergrund geholt wird.

Formular und Paintbox zeichnen das Bild nur einmalig. Damit es nach dem Verdecken wieder erscheint, muss das Zeichnen der Graphik in der OnPaint-Ereignismethode der jeweiligen Komponente erfolgen. Dieses Ereignis wird vom Betriebssystem automatisch ausgelöst.

Page 20: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

2020 ObjekthierarchieObjekthierarchie

Das Bild-Objekt Bild vom Typ TImage mit Hilfe seines Attributs Canvas ein Leinwand-Objekt der Klasse Tcanvas zur Verfügung. Dieses wiederum hat ein Zeichenstift-Objekt der Klasse TPen und ein Malpinsel-Objekt der Klasse Tbrush.

Die entsprechenden Attribute Pen und Brush werden als Property zur Verfügung gestellt.

Beispiel: Blaues Rechteck

Bild.Canvas.Brush.Color := clbue;

Bild.canvas.rectangle(10,10,100,20);

Beispiel: Blaues Rechteck

Bild.Canvas.Brush.Color := clbue;

Bild.canvas.rectangle(10,10,100,20);

Pinselfarbe blau

Rechteck mit der linken oberen Ecke am Punkt (X1, Y1) und der rechten unteren Ecke am Punkt (X2, Y2).

Page 21: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

2121 Aufgaben 1Aufgaben 1

1. Testen Sie das Beispielprogramm Grafiktest.exeVariieren Sie verschiedene Modi der Pinsel und StifteTesten Sie insbesondere den NotXOR-Füllmodus

2. Entwickeln Sie ein Programm, das die Bilddatei Lageplan.jpg im Formular anzeigt.

Page 22: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

Teil 3Teil 3

Entwicklung einer Warteschlange

Page 23: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

2323 Datentyp SchlangeDatentyp Schlange

Eine Schlange realisiert das Prinzip FIFO (First In First Out),

d. h. die Ausgabe erfolgt in gleicher Reihenfolge wie die Eingabe.

Spezialisierte Schlange:

:Knotennachfolger =

name = A

:Knoten

nachfolger =

name = B

:SchlangeKopf =

...

nil

Hat kennt

Das Objekt Schlange dient der Verwaltung

Mit Hilfe seines Attributs Kopf hat es Zugriff auf das erste Element

Die Knoten implementieren das Einfügen nach dem FIFO-Prinzip,neue Elemente werden vom Kopf an ans Ende gereicht

Der Nachfolger des letzten Elements zeigt immer auf nil; es ist die Stelle, wo neue Elemente eingefügt werden.

Jedes Element kennt einen Nachfolger

Kopf

Page 24: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

2424 Allgemeine SchlangeAllgemeine Schlange

:Knotennachfolger =

inhalt =

:Knoten

nachfolger =

inhalt =

:SchlangeKopf =

...

nil

kennt

kennt

Schlange für beliebige Objekte

:Object :Object

Jedes Element erhält ein Inhaltsobjekt

Page 25: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

25 KlassendiagrammKlassendiagramm25

TKnoten- inhalt : string;

- nachfolger : TKnoten;+ create (wert: string);

+ fuegeKnotenEin (nK: TKnoten)

+ gibKnotenAus (liste: TStrings);

+ setzeInhalt (wert: string);

+ setzeNachfolger (k: TKnoten);

+ gibInhalt : string;

+ gibNachfolger : TKnoten;

TSchlange

- Kopf : TKnoten

+ create+ istLeer: boolean+ einfuegeKnotenein(k : Tknoten)+ giberstesElement : TKnoten+ entferneErstes+ gibSchlangeAus(liste : TStrings)

hatkennt

Page 26: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

2626 Klasse TSchlangeKlasse TSchlange

TSchlange

- Kopf : TKnoten

+ create+ istLeer: boolean+ einfuegeKnotenein(k : Tknoten)+ giberstesElement : TKnoten+ entferneErstes+ gibSchlangeAus(liste : TStrings)

Operationen• prüfen, ob die Schlange leer ist • ein neues Element in die Warteschlange einfügen• auf das erste Element zugreifen• das erste Element der Schlange entfernen• alle Elemente ausgeben

Implementierung

TSchlange = class

protected //Attribute

kopf : TKnoten;

public //Methoden

constructor create;

destructor destroy;override;

function istLeer : boolean;

function gibErstesElement : TKnoten;

procedure entferneErstes;

procedure fuegeKnotenEin (kn: TKnoten);

procedure gibSchlangeAus (liste: TStrings);

end;

Page 27: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

2727 ImplementationImplementation

constructor TSchlange.create;

begin

kopf := TKnoten.create('leer');

end;

Im Konstruktor wird Leerelement als Kopf erzeugt.

Ein Leerelement erhält einen

Verweis auf erste Element

Schlangeobjekt erzeugen

destructor TSchlange.destroy;

begin

while kopf.gibNachfolger <> nil do entferneErstes;

kopf.Free;

inherited destroy;

end;

Alle Elemente aus Schlange entfernen und freigeben

Leerelement freigeben

Destruktor der Vorfahrklasse aufrufen um das Schlangenobjekt zu zerstören

und zerstören

Page 28: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

2828 Klasse TKnotenKlasse TKnoten

TKnoten- inhalt : string;

- nachfolger : TKnoten;+ create (wert: string);

+ fuegeKnotenEin (neuerKnoten: TKnoten)

+ gibKnotenAus (liste: TStrings);

+ setzeInhalt (wert: string);

+ setzeNachfolger (k: TKnoten);

+ gibInhalt : string;

+ gibNachfolger : TKnoten;

Die Knoten implementieren das FIFO – Prinzip

procedure TKnoten.fuegeKnotenEin (neuerKnoten: TKnoten);begin if nachfolger = nil then nachfolger := neuerKnoten else nachfolger.fuegeKnotenEin(neuerKnoten);end;

Der neue Knoten wird bis zum letzten weitergereicht

Einfügen am Ende der Schlange (FIFO – Prinzip)

Page 29: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

2929 Aufgabe 2Aufgabe 2

Aufgabe 1

Erstellen Sie ein Programm, mit dessen Hilfe die Implementierung der Klasse „TSchlange“ gestestet werden kann.

Z. B.: Es soll eine Städte [Köln;Frankfurt; ...] erstellt und angezeigt werden.

Es müssen nicht alle Methoden implementiert werden.

Benutzen Sie die vorgegebene Benutzungsoberfläche

Aufgabe 2

Fügen Sie den Knoten das Attribut entfernung hinzu. Zu Testzwecken kann der Wert zufällig beim Erzeugen des Knotens gesetzt werden.

Ändern Sie die Methode Tknoten.fuegeKnotenEin (...) so ab, dass die Knoten - abweichend vom FIFO-Prinzip - nach Entfernung geordnet eingefügt werden.

(Prioritäten-Warteschlange)

Page 30: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

30

Teil 4Teil 4

Implementierung des Graphen zum Lageplan

mit Dijkstra Algorithmus

Page 31: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

31 OOA-Klassendiagramm

Page 32: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

Sequenzdiagramm: Weg berechnen Sequenzdiagramm: Weg berechnen 32

Create()

als besucht

Page 33: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

Anhang 1Anhang 1

Entwicklung der

Prioritäten-Warteschlange durch Vererbung

Page 34: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

3434 Prioritäten-WarteschlangePrioritäten-Warteschlange

Im Unterschied zu einer gewöhnlichen Schlange werden die Dinge nach einer Priorität geordnet eingefügt und gemäß dieser Priorität wieder entnommen.

Eine solche Schlange ist also im Prinzip eine geordnete Liste. TPKnoten

- inhalt : string;

- nachfolger : TKnoten- entfernung : integer

+ create (wert: string);

+ fuegeKnotenEin(nK :TKnoten)

+ gibKnotenAus (liste: TStrings);

+ setzeInhalt (wert: string);

+ setzeNachfolger (k: TKnoten);

+ gibInhalt : string;

+ gibNachfolger : TKnoten;

Die Knoten erhalten ein weiteres Attribut (Priorität), nach denen sie geordnet werden.

Außerdem ändert sich das Einfügen.

Ein neuer Knoten wird so lange weitergereicht, bis er einen Knoten höherer Priorität erreicht.

Mit Hilfe von Vererbung kann der größte Teil des bisher geschriebenen Codes wiederverwendet werden.

Page 35: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

3535 Spezialisierung der KnotenSpezialisierung der Knoten

TKnoten- inhalt : string;

- nachfolger : TKnoten

+ create (wert: string)

+ fuegeKnotenEin (nK: TKnoten)

...

TPKnoten- entfernung : integer

+ create (wert: string; e : integer)

+ fuegeKnotenEin(nK :TKnoten)

Ist ein - Beziehung

Abgeleitete Klasse

- erhält ein Prioritätsattribut

- überschreibt die Methode zum Einfügen

Basisklasse

- Die Methode fuegeKnotenEin() wird als virtuelle Methode deklariert

Page 36: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

3636 ImplementierungImplementierung

TP_Knoten = class(TKnoten)

protected

entfernung : integer;

public

constructor create (wert: string; e : integer);

procedure fuegeKnotenEin (nK : TKnoten); override;

procedure setzeEntfernung (e: integer);

function gibEntfernung : integer;

end;

TKnoten = class protected inhalt : string; nachfolger : TKnoten; public constructor create (wert: string); procedure fuegeKnotenEin (nk: TKnoten); virtual; ... end;

Der statische Konstruktor wird neu implementiert (ersetzt).

Basisklasse

Abgeleitete klasse

Page 37: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

3737 Klasse TPSchlangeKlasse TPSchlange

constructor TPSchlange.create;

begin

kopf := TP_Knoten.create('');

end;

TSchlange

- Kopf : TKnoten

+ create ...

TPSchlange

+ create

Die Klasse TPSchlange wird von TSchlange abgleitet.

Es wird lediglich den Konstruktor geändert.

Dem geerbten Attribut Kopf wird ein TP_Knoten-Objekt zugewiesen

Page 38: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

3838 Anhang 2Anhang 2

Delphi verfügt über eine vordefinierte Klasse „TList“. Informieren Sie sich über diese Klasse mit der Delphi-Hilfe. Implementieren Sie dann die Prioritätenschlange mit dieser vordefinierten Klasse „TList“.

TList

+ Count: integer+ Items[pos: integer]: Pointer

+ create+ Delete(pos: integer)+ Insert(pos: integer; obj: Pointer)...

TList verwaltet eine Liste von Zeigern auf Objekte.

Mit Hilfe des Properties (Attribut) Items kann auf jede Objektreferenz per Index zugegriffen werden.

Der Parameter Index enthält den Index auf das Objekt, wobei das erste den Index 0 hat, der letzt den Index Count-1.

Beispiel: var Knotenliste : Tlist; Knoten : TKnoten...for i := 0 to Knotenliste.Count-1 do

begin

Knoten := Tknoten(Liste.items[i]);

Knoten.gibAus(....);

end;

Durch Typumwandlung erhält man Zugriff auf das Objekt an der Position i

Page 39: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

3939 Anhang 2Anhang 2

Implementierung der Schlange mit einem TList-Objekt

TSchlange

- liste : TList

+ create+ istLeer: boolean+ einfuegeKnotenein(k : Tknoten)+ giberstesElement : TKnoten+ entferneErstes+ gibSchlangeAus(liste : TStrings)

Die Klasse TSchlange liefert eine eingeschränkte Schnittstelle zum geschützten TList-Objekt.

Die Verwaltung der Objekte wird an das TList- Objekt delegiert.

TStringList

+ Count: integer+ Strings: array[0..] of string

+ create+ delete(p: integer)+ insert(p: integer; s: String)...

Für Listen von Strings bietet Delphi die Klasse TStringList.

Einige Attribute (Properties) und Operationen sind im nebenstehenden Klassendiagramm aufgeführt. Die Bedeutung der Bestandteile kann mit der Delphi-Hilfe ermittelt werden.

Die Delphi-Komponenten TListBox und TMemo enthalten ein Stringlistenobjekt.

Stringlisten

Page 40: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

4040 Aufgabe 3Aufgabe 3

Aufgabe 1

Implementieren Sie mit Hilfe der Delphi-Klasse TList eine Stapel.

(Lineare Liste, die das FIFO-Prinzip realisiert)

TStapel

- liste : TList

+ create+ istLeer: boolean+ einfuegeKnotenein(k : Tknoten)+ giberstesElement : TKnoten+ entferneErstes+ gibStapel(liste : TStrings)

Aufgabe 2

Entwickeln Sie eine gemeinsame Oberklasse, aus der dann Stapel und Schlange abgeleitet werden.

Page 41: Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut PaulusSpeyer, 3.-5.11.08

4141 QuellenQuellen

• Klaus Becker: Weiterbildungslehrgang X "Informatik für Gymnasien“ Kurs

http://informatik.bildung-rp.de/weiterbildungsmaterial/lehrgang-x-2005-2008/

kurs-5.html

MathPrisma:

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

H.W. Lang   FH Flensburg :  http://www.inf.fh-flensburg.de/lang/algorithmen/graph/

swisseduc.ch :

Informatik Graphbench: http://www.swisseduc.ch/informatik/graphbench/

M. Pohlig:

www.pohlig.de

Jürgen Dehmer, A. Sessler, G. Liebrich

Projekt: Tauglichkeitstester

http://www.lehrer.uni-karlsruhe.de/~za714/informatik/infkurs