Implementierung des Algorithmus von Dijkstra

Slides:



Advertisements
Ähnliche Präsentationen
Vortrag von Stephanie Weirauch Jens Pleger Peter Jancke Frank Wejmelka
Advertisements

Prof. Dr. S. Albers Prof.Dr.Th Ottmann
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (26-Graphenalgorithmen: Wiederholung und Übung) Prof. Th. Ottmann.
Sortieren I - Bubblesort -
PKJ 2005/1 Stefan Dissmann Vorwoche - Klasse public class Studierende { private String name, vorname, studiengang; private int matNr, semester; private.
Lineare Suche Divide-and-Conquer-Suche Kombinationssuche
Kapitel 5. Stacks und Queues
10. Grundlagen imperativer Programmiersprachen
Synonyme: Stapel, Keller, LIFO-Liste usw.
Puck eine visuelle Programmiersprache für die Schule
Unter- und Oberklassen: Beispiel
DINAMISCHE STRUKTUREN FACHBEGRIFFE 1. DER POINTERDER POINTER 2. DER BUFFERDER BUFFER 3. DER KNOTENDER KNOTEN DIE EINFACHVERKETTETE LISTE DEFINITION DEFINITION.
Gliederung Motivation / Grundlagen Sortierverfahren
Java: Objektorientierte Programmierung
Java2D Richard Göbel.
Sortierverfahren Richard Göbel.
Java: Dynamische Datentypen
Sortierverfahren Richard Göbel.
Java: Grundlagen der Objektorientierung
Polymorphie (Vielgestaltigkeit)
WS Algorithmentheorie 13 - Kürzeste (billigste) Wege Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (27 – Kürzeste Wege) Prof. Th. Ottmann.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (21 – Kürzeste Wege) T. Lauer.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (05 – Elementare Datenstrukturen) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 6 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Klausur „Diskrete Mathematik II“
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
Vererbung Spezialisierung von Klassen in JAVA möglich durch
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
07-GraphischeObjekte Graphische Objekte in EMMA301Paint.
DVG Klassen und Objekte
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Delphi II - OOP IFB Fortbildung
Grafikprogrammierung
Listen Klaus Becker KB Listen 2 Listen Ansgar A., Speyer Claudia B., Koblenz Knut B., Neustadt Annett B., Wörrstadt Stefani D., Bad Ems Jochen F.,
Effiziente Algorithmen
Delphi TCanvas Informatik-AG. TCanvas Viele der sichtbaren in Delphi vorhanden Objekte besitzen die Eigenschaft Canvas. Übersetzt heißt Canvas Leinwand.
Diskrete Mathematik II
Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS
Effiziente Algorithmen
Animation von Dijkstra
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Binärbäume Klaus Becker 2003.
Modellierung grafischer Objekte
Graphen und ihre Implementierung
Implementierung des Algorithmus von Dijkstra
Modellierung grafischer Objekte
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
OOP-Begriffe Abstraktion Modellieren Klasse Objekt Attribute Methoden
Dynamische Datentypen
Aufgaben Version 1: Es soll eine Wetterstation mit folgenden zwei Anzeigen implementiert werden: Aktuelle Wetterbedingungen mit Temperatur und.
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Thomas Hilpold: Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger.
Informatik Datenstruktur Graph 3.3 Durchlaufen von Graphen
Polymorphie (Vielgestaltigkeit). Wenn eine Methode, wie z.B. print für verschiedene Programmteile steht (und z.B. einmal Objekte verschiedener Klassen.
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik II Vorlesung Datenstrukturen für den Algorithmus von.
Java-Kurs Übung Besprechung der Hausaufgabe
Diskrete Mathe Diskrete Mathematik I Listen Vorlesung 4.
Tutorium Software-Engineering SS14 Florian Manghofer.
C++ FÜR cOMPUTERSPIELENTWICKLER
Zwei Denkansätze zur Klasse Schlange
Implementieren von Klassen
3. Die Datenstruktur Graph 3.2 Repräsentation von Graphen
1. Die rekursive Datenstruktur Liste 1
 Präsentation transkript:

Implementierung des Algorithmus von Dijkstra Kürzeste Wege Implementierung des Algorithmus von Dijkstra Helmut Paulus Speyer, 5.-7.11.07

Objektorientierte Modellierung von Graphen Teil 1 Objektorientierte Modellierung von Graphen

Graphen Klassische Probleme Ein Graph beschreibt eine Struktur aus Objekten und den Beziehungen zwischen ihnen. Ein Graph besteht aus – einer Menge von Knoten (Objekten) und – einer Menge von Kanten (Beziehungen), die die Knoten verbinden. Klassische Probleme Eulersche Wanderungen Hamiltonsche Rundreisen Labyrinthproblem Problem des Handlungsreisenden Kürzeste Wege

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

Algorithmus von Dijkstra Abgewandelte Version: {Eingabe: Graph G; Startknoten s, Zielknoten z des Graphen} für alle Knoten w      setze dg(w) = ∞ setze dg(s) = 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 dg(u) = ∞                füge u in WS ein           falls dg(u) > dg(w) + g({w,u})                setze dg(u) = dg(w)+g({w,u}) {Ausgabe: gewichteter Abstand dg(w) des Zielknotens z vom Startknoten s} Vorteil: Geringerer Rechenaufwand bei einer einmaligen Suche

Algorithmus von Dijkstra 20 F A 10 Gesucht: Kürzester Weg von A nach E 16 12 B 25 6 E 5 C D 6 12 A B C D E F 6 10 12 25 16 20 5 Nach Ausführung 31 15 Jeder besuchte Knoten enthält den minimalen Abstand zum Startknoten, sowie einen Verweis zu seinem Vorgänger im Pfad (lineare Liste).

Implementierung von Graphen Objektorientierte Lösung: Jeder Knoten ist ein Objekt Jede Kante ist ein Objekt TKnoten - name : string kanten : Tkantenliste anzahlkanten : integer entfernung : integer nachfolger, vorgaenger : TKnoten + create(n : string; x,y : integer) + fuegeKantehinzu(nachbar : Tknoten; e : integer) TKante - entfernung : integer zielKnoten :TKnoten + create(k : TKnoten; e : integer) + gibEntfernung : integer + gibNachbar : TKnoten * 1 * TGraph - anzahlKnoten : integer knoten : Tknotenliste initialisiere + create + berechneWeg(start,ziel : Tknoten) + gibAlleKnoten : Tknotenliste + gibKnoten(n : string) + gibAnzahlKnoten : integer Das Graphobjekt verwaltet die Knoten und Kanten und stellt den Suchalgorithmus zur Verfügung

Zielsetzung 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 Graphen 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

Teil 2 Grafik mit Delphi

Zeichenflä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-Werkzeuge Pen, Brush und Font, zuständig für bestimmte Teilaufgaben: 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.

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.

Objekthierarchie Das Bild-Objekt Bild vom Typ TImage verwaltet über das Attribut Canvas ein Leinwand-Objekt der Klasse TCanvas, das wiederum ein Zeichenstift-Objekt der Klasse TPen und ein Malpinsel-Objekt der Klasse TBrush verwaltet. 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); Pinselfarbe blau Rechteck mit der linken oberen Ecke am Punkt (X1, Y1) und der rechten unteren Ecke am Punkt (X2, Y2).

Aufgaben 1 Testen Sie das Beispielprogramm Grafiktest.exe Variieren Sie verschiedene Modi der Pinsel und Stifte Testen Sie insbesondere den NotXOR-Füllmodus Entwickeln Sie ein Programm, das die Bilddatei Lageplan.jpg im Formular anzeigt.

Entwicklung einer Warteschlange Teil 3 Entwicklung einer Warteschlange

Datentyp Schlange Spezialisierte Schlange: Eine Schlange realisiert das Prinzip FIFO (First In First Out), d. h. die Ausgabe erfolgt in gleicher Reihenfolge wie die Eingabe. Spezialisierte Schlange: Kopf :Schlange Kopf = ... kennt :Knoten nachfolger = name =A kennt :Knoten nachfolger = name =B nil Jedes Element kennt einen Nachfolger 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.

Allgemeine Schlange Schlange für beliebige Objekte Kopf = ... kennt :Knoten nachfolger = inhalt = kennt :Knoten nachfolger = inhalt = nil :Object :Object Jedes Element erhält ein Inhaltsobjekt

Klasse TSchlange Operationen (Fähigkeiten) 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 Element ausgeben Implementierung TSchlange - Kopf : TKnoten + create + istLeer: boolean + einfuegeKnotenein(k : Tknoten) + giberstesElement : TKnoten + entferneErstes + gibSchlangeAus(liste : TStrings) 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;

Implementation Schlangeobjekt erzeugen und zerstören constructor TSchlange.create; begin kopf := TKnoten.create('leer'); end; Im Konstruktor wird Zeigerelement auf das Kopfelement erzeugt. Das Leerelement erhält eine Referenz auf das erste Element und zerstören destructor TSchlange.destroy; begin while kopf.gibNachfolger <> nil do entferneErstes; kopf.Free; inherited destroy; end; Alle Elemente aus der Schlange entfernen und freigeben Leerelement freigeben Destruktor der Vorfahrklasse aufrufen, um das Schlangenobjekt zu zerstören

Klasse 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 FIFO-Knoten 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)

Aufgabe 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)

Entwicklung der Prioritäten-Warteschlange durch Vererbung Teil 4 Entwicklung der Prioritäten-Warteschlange durch Vererbung

Prioritä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 bisherigen Codes wiederverwendet werden.

Spezialisierung der Knoten TKnoten - inhalt : string; - nachfolger : TKnoten + create (wert: string) + fuegeKnotenEin (nK: TKnoten) ... Basisklasse - Die Methode fuegeKnotenEin() wird als virtuelle Methode deklariert FIFO-Knoten Ist ein - Beziehung Abgeleitete Klasse - erhält ein Prioritätsattribut - überschreibt die Methode zum Einfügen TPKnoten - entfernung : integer + create (wert: string; e : integer) + fuegeKnotenEin(nK :TKnoten) Prioritäts-Knoten

Implementierung Basisklasse Abgeleitete klasse TKnoten = class protected inhalt : string; nachfolger : TKnoten; public constructor create (wert: string); procedure fuegeKnotenEin (nk: TKnoten); virtual; ... end; Abgeleitete klasse TPKnoten = 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; Der statische Konstruktor wird neu implementiert (ersetzt). Die virtuelle Methode zum Einfügen wird überschrieben.

Klasse TWarteschlange TSchlange - Kopf : TKnoten + create ... Die Klasse TWarteschlange wird von TSchlange abgleitet. Es wird lediglich den Konstruktor geändert. constructor TWarteschlange.create; begin kopf := TPKnoten.create(''); end; TWarteSchlange + create Dem geerbten Attribut Kopf wird ein TPKnoten-Objekt zugewiesen

Anhang 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 verwaltet eine Liste von Zeigern auf Objekte. TList + Count: integer + Items[pos: integer]: Pointer + create + Delete(pos: integer) + Insert(pos: integer; obj: Pointer) ... 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

Anhang 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. Stringlisten 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. TStringList + Count: integer + Strings: array[0..] of string + create + delete(p: integer) + insert(p: integer; s: String) ...

Aufgabe 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.

Quellen 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

Implementierung des Graphen zum Lageplan und mit Dijkstra Algorithmus Teil 5 Implementierung des Graphen zum Lageplan und mit Dijkstra Algorithmus

OOA-Klassendiagramm