Graphen und ihre Implementierung

Slides:



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

Die Schulkonsole für Lehrerinnen und Lehrer
Programmierung 1 - Repetitorium WS 2002/2003 Programmierung 1 - Repetitorium Andreas Augustin und Marc Wagner Homepage:
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (26-Graphenalgorithmen: Wiederholung und Übung) Prof. Th. Ottmann.
Vorlesung: 1 Betriebliche Informationssysteme 2003 Prof. Dr. G. Hellberg Studiengang Informatik FHDW Vorlesung: Betriebliche Informationssysteme Teil3.
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Graphen Ein Graph ist eine Kollektion von Knoten und Kanten. Knoten sind einfache Objekte. Sie haben Namen und können Träger von Werten, Eigenschaften.
Modelle und Methoden der Linearen und Nichtlinearen Optimierung (Ausgewählte Methoden und Fallstudien) U N I V E R S I T Ä T H A M B U R G November 2011.
Modelle und Methoden der Linearen und Nichtlinearen Optimierung (Ausgewählte Methoden und Fallstudien) U N I V E R S I T Ä T H A M B U R G November 2011.
Manfred Thaller, Universität zu Köln Köln 22. Januar 2009
Einführung in die Informationsverarbeitung Teil Thaller Stunde VI: Wege und warum man sie geht Graphen. Manfred Thaller, Universität zu Köln Köln.
= = = = 47 = 47 = 48 = =
Sortierverfahren Richard Göbel.
Sortierverfahren Richard Göbel.
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.
© 2006 W. Oberschelp, G. Vossen Rechneraufbau & Rechnerstrukturen, Folie 2.1.
Grundkurs Theoretische Informatik, Folie 2.1 © 2006 G. Vossen,K.-U. Witt Grundkurs Theoretische Informatik Kapitel 2 Gottfried Vossen Kurt-Ulrich Witt.
Vorlesung: 1 Betriebliche Informationssysteme 2003 Prof. Dr. G. Hellberg Studiengang Informatik FHDW Vorlesung: Betriebliche Informationssysteme Teil2.
Klausur „Diskrete Mathematik II“
Vererbung Spezialisierung von Klassen in JAVA möglich durch
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.
PKJ 2005/1 Stefan Dissmann Klassenhierarchie Person Kunde Goldkunde Lieferant Object.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste.
AC Analyse.
Schiller-Gymnasium Hof Manuel Friedrich OStR,
Rechneraufbau & Rechnerstrukturen, Folie 12.1 © W. Oberschelp, G. Vossen W. Oberschelp G. Vossen Kapitel 12.
Distanzbasierte Sprachkommunikation für Peer-to-Peer-Spiele
1. 2 Schreibprojekt Zeitung 3 Überblick 1. Vorstellung ComputerLernWerkstatt 2. Schreibprojekt: Zeitung 2.1 Konzeption des Kurses 2.2 Projektverlauf.
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Vortrag über Graphen Von Jörg Hendricks.
20:00.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik II Vorlesung 1 SS 2001 Algorithmus von Dijkstra.
„Küsse deine Freunde“ – FlexKom-App teilen
Zusatzfolien zu B-Bäumen
Effiziente Algorithmen
für Weihnachten oder als Tischdekoration für das ganze Jahr
Wir üben die Malsätzchen
Diskrete Mathematik II
Diskrete Mathematik II
Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS
Effiziente Algorithmen
Implementierung des Algorithmus von Dijkstra
Implementierung des Algorithmus von Dijkstra
NEU! 1 2. Wo kommt diese Art von Rezeptor im Körper vor?
HORIZONT 1 XINFO ® Das IT - Informationssystem PL/1 Scanner HORIZONT Software für Rechenzentren Garmischer Str. 8 D München Tel ++49(0)89 / 540.
Jan Hinzmann – – GIS Praxis II – Slide 1/10 Der Algorithmus von Dijkstra (Berechnung kürzester Wege in bewerteten Graphen) GIS Praxis II, Jan Hinzmann,
PROCAM Score Alter (Jahre)
Ertragsteuern, 5. Auflage Christiana Djanani, Gernot Brähler, Christian Lösel, Andreas Krenzin © UVK Verlagsgesellschaft mbH, Konstanz und München 2012.
Vorlesung Mai 2000 Konstruktion des Voronoi-Diagramms II
Symmetrische Blockchiffren DES – der Data Encryption Standard
1 (C)2006, Hermann Knoll, HTW Chur, FHO Quadratische Reste Definitionen: Quadratischer Rest Quadratwurzel Anwendungen.
Manfred Thaller, Universität zu Köln Köln 30. Januar 2014
Zahlentheorie und Zahlenspiele Hartmut Menzer, Ingo Althöfer ISBN: © 2014 Oldenbourg Wissenschaftsverlag GmbH Abbildungsübersicht / List.
MINDREADER Ein magisch - interaktives Erlebnis mit ENZO PAOLO
1 (C)2006, Hermann Knoll, HTW Chur, FHO Quadratische Reste Definitionen: Quadratischer Rest Quadratwurzel Anwendungen.
Informatik Datenstruktur Graph 3.3 Durchlaufen von Graphen
Schutzvermerk nach DIN 34 beachten 20/05/14 Seite 1 Grundlagen XSoft Lösung :Logische Grundschaltung IEC-Grundlagen und logische Verknüpfungen.
1 Mathematical Programming Nichtlineare Programmierung.
Technische Frage Technische Frage Bitte löse die folgende Gleichung:
Es war einmal ein Haus
Analyse der Laufzeit von Algorithmen
1 10 pt 15 pt 20 pt 25 pt 5 pt 10 pt 15 pt 20 pt 25 pt 5 pt 10 pt 15 pt 20 pt 25 pt 5 pt 10 pt 15 pt 20 pt 25 pt 5 pt 10 pt 15 pt 20 pt 25 pt 5 pt Wie.
1 Medienpädagogischer Forschungsverbund Südwest KIM-Studie 2014 Landesanstalt für Kommunikation Baden-Württemberg (LFK) Landeszentrale für Medien und Kommunikation.
Monatsbericht Ausgleichsenergiemarkt Gas – Oktober
Monatsbericht Ausgleichsenergiemarkt Gas – November
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik II Vorlesung Datenstrukturen für den Algorithmus von.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik II Vorlesung Suche des kürzesten Weges in einem Netz.
3. Die Datenstruktur Graph 3.3 Durchlaufen von Graphen
 Präsentation transkript:

Graphen und ihre Implementierung Klaus Becker 2007

Graphen Zielsetzung: Am Beispiel von Graphen TR KO RB BI KL AZ MZ FT SP 128 98 54 28 35 33 36 48 31 116 Zielsetzung: Am Beispiel von Graphen Standardalgorithmen zur Lösung von Standardproblemen erkunden eine vorgegebene Klasse zur Erledigung von Standardaufgaben benutzen (und erweitern)

Graphen und Graphenprobleme Teil 1 Graphen und Graphenprobleme

tratsCH trATsch 23. Bundeswettbewerb Informatik: siehe: http://www.mk-intern.bildung-lsa.de/Bildung/be-bundeswettbewerbinformatik2004_2005.pdf

tratsCH trATsch 23. Bundeswettbewerb Informatik:

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?

Graphen 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. B E F A D H G 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.

Typen von Graphen 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. B E B E 5 12 8 11 F F A A 6 D D 8 17 H 3 G H G C C 5 gerichteter, unbewerteter Graph ungerichteter, bewerteter Graph

Klassische Graphenprobleme Wege, Erreichbarkeit: Gibt es einen Weg zwischen Knoten X und Knoten Y? B E F A D H G C Kann Tratsch von A nach H gelangen? Kann Tratsch von H nach A gelangen?

Klassische Graphenprobleme 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? B E F A D H G 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

Klassische Graphenprobleme Euler-Weg / Euler-Kreis: Gibt es einen (geschlossenen) Weg, der jede Kante genau einmal besucht? Königsberger Brückenproblem Haus des Nikolaus

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

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

Klassische Graphenprobleme kürzeste Wege: Welcher Weg zwischen Knoten X und Knoten Y ist der kürzeste? TR KO RB BI KL AZ MZ FT SP 128 98 54 28 35 33 36 48 31 116 kürzester Weg von SP nach KO: SP -> FT -> AZ -> BI -> RB -> KO

Fallstudie: Wege in Graphen Teil 2 Graphenalgorithmen Fallstudie: Wege in Graphen

Problem 1: Graphen durchlaufen Problem: Welche Knoten kann man von einem Startknoten aus mit einem Weg entlang der Kanten erreichen? B E F A D H G C

Problem 2: Abstände bestimmen Problem: Wie viele Knoten liegt ein Zielknoten vom Startknoten entfernt?

Problem 3: kürzeste Wege bestimmen Problem: Welcher Weg von einem Startknoten zu einem Zielknoten ist am kürzesten? TR KO RB BI KL AZ MZ FT SP 128 98 54 28 35 33 36 48 31 116

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.

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

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

Beispiel Vorbereitungsschritt F B F D D C C E E S A S A Vorbereitungsschritt 1 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 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 B Wiederholungsschritt F B F D D C 1 C E E S A S A 1 1 1

Beispiel B F B F B F 1 D D 1 D 1 C 1 C 1 C E E E S A S A S A 1 1 1 1 1 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 Auswahlstrategie First In First Out -> Breitensuche Auswahlstrategie Last In First Out -> Tiefensuche B F B F 1 B F 1 D 1 1 D 1 1 D 1 C C C E E E S A S A S A 1 1 1 1 1 1 1 1

Beispiel 1 B F 1 B F 1 D 1 1 D 1 C C E E S A S A 1 1 1 1 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 Ergebnis: Von S aus gibt es Wege zu den folgenden Knoten: A, B, C, D, E. 1 B F 1 B F 1 D 1 1 D 1 C C E E S A S A 1 1 1 1 1 1

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

Beispiel Vorbereitungsschritt für alle Knoten w ∞ B F ∞ D C ∞ D ∞ C E E S A S A ∞ Vorbereitungsschritt ∞ für alle Knoten w setze dg(w) = ∞ setze dg(s) = 0 füge s in eine Datenstruktur D (hier grün) ein 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 ∞ B Wiederholungsschritt F ∞ ∞ B F ∞ ∞ D ∞ 1 D ∞ C C E E S A S A ∞ 1 ∞ ∞

Beispiel ∞ B F ∞ ∞ B F ∞ ∞ B F ∞ 1 D ∞ 1 D 2 C C 1 D 2 C E E E S A S A S A 1 1 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 ∞ B F ∞ ∞ B F ∞ 3 B F ∞ 1 D 2 1 D 2 D 2 C C 1 C E E E S A S A S A 1 1 1 ∞ 2 2

Beispiel 3 B F ∞ 3 B F ∞ 1 D 2 1 D 2 C C E E S A S A 1 1 2 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 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 ∞. 3 B F ∞ 3 B F ∞ 1 D 2 D 2 C 1 C E E S A S A 1 1 2 2

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

Beispiel Vorbereitungsschritt für alle Knoten w 3 3 B F ∞ B F ∞ 1 8 1 8 4 4 10 10 D D ∞ C ∞ C 13 13 20 16 2 20 16 2 E E S 2 19 A S 2 19 A ∞ Vorbereitungsschritt ∞ für alle Knoten w setze dg(w) = ∞ setze dg(s) = 0 füge s in eine Datenstruktur D (hier grün) ein 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 3 ∞ B Wiederholungsschritt F ∞ ∞ B F ∞ 1 8 1 8 4 4 10 10 ∞ D ∞ D ∞ C 20 C 13 13 20 16 2 20 16 2 E E S 2 19 A S 2 19 A ∞ 2 ∞ ∞

Beispiel 3 3 3 ∞ B F ∞ ∞ B F ∞ ∞ B F ∞ 1 8 1 8 1 8 4 4 4 10 10 10 20 D ∞ 20 D ∞ 20 D 30 C C C 13 13 13 20 16 2 16 2 20 16 2 20 E E E S 2 19 A S 2 19 A S 2 19 A 2 2 2 ∞ 21 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 3 3 ∞ B F ∞ ∞ B F ∞ ∞ B F ∞ 1 8 1 8 1 8 4 4 4 10 D 10 10 20 ∞ 20 D 30 20 D 23 C C C 13 13 13 20 16 2 20 16 2 20 16 2 E E E S 2 19 A S 2 19 A S 2 19 A 2 2 2 21 21 21

Beispiel 3 3 ∞ B F ∞ 31 B F ∞ 1 8 1 8 4 4 10 10 20 D 23 C 20 D 23 C 13 13 20 16 2 20 16 2 E E S 2 19 A S 2 19 A 2 2 21 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}) 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 ∞. 3 3 31 B F ∞ 31 B F ∞ 1 8 1 8 4 4 10 10 20 D 23 20 D 23 C C 13 13 20 16 2 20 16 2 E E S 2 19 A S 2 19 A 2 2 21 21

Implementierung von Graphen Teil 3 Implementierung von Graphen

Darstellung: Matrix oder Liste AZ BI/35 FT/36 KL/48 MZ/33 AZ BI FT KL KO MZ RB SP TR AZ 35 36 48 33 BI 35 28 FT 36 48 31 KL 48 116 KO 54 128 MZ 33 35 RB 28 54 98 SP 31 TR 116 128 98 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 TR KO RB BI KL AZ MZ FT SP 128 98 54 28 35 33 36 48 31 116 RB BI/28 KO/54 TR/128 SP FT/31 TR KL/116 RB/98 KO/128 Adjazenzmatrix Adjazenzliste

Einfache Version Grundidee: Die Adjazenzmatrix wird mit Hilfe einer zweidimensionalen Reihung dargestellt. AZ BI FT KL KO MZ RB SP TR AZ 35 36 48 33 BI 35 28 FT 36 48 31 KL 48 116 KO 54 128 MZ 33 35 RB 28 54 98 SP 31 TR 116 128 98 TR KO RB BI KL AZ MZ FT SP 128 98 54 28 35 33 36 48 31 116

Einfache Version Grundidee: Die Adjazenzmatrix wird mit Hilfe einer zweidimensionalen Reihung dargestellt. AZ BI FT KL KO MZ RB SP TR AZ 35 36 48 33 BI 35 28 FT 36 48 31 KL 48 116 KO 54 128 MZ 33 35 RB 28 54 98 SP 31 TR 116 128 98 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));

Objektorientierte Version TR KO RB BI KL AZ MZ FT SP 128 98 54 28 35 33 36 48 31 116 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 RB BI/28 KO/54 TR/128 SP FT/31 TR KL/116 RB/98 KO/128 Grundidee: - Jeder Knoten ist ein Objekt. - Jede Kante ist ein Objekt.

Objektorientierte Version :TList 1 2 3 AZ :TList BI/35 FT/36 KL/48 MZ/33 1 BI :TList AZ/35 MZ/35 RB/28 TGraph 2 FT :TList AZ/36 KL/48 SP/31 - alleKnoten: TList 3 KL :TList AZ/48 FT/48 TR/116 + create + neuerKnoten(n: string) + neueKante(n1, n2: string; g: double) + getAlleKnoten: TList 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 * * * 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

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 Start- zu einem eingegebenen Zielknoten berechnen und anzeigen lassen. ...

Fertige Klasse nutzen Häufig findet man zu Standardproblemen fertige Lösungen in Form implementierter Klassen. 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. 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

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

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

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

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

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.

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.

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.

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.

Teil 4 Zusammenfassung

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} 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} 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

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.bildung-rp.de/Weiterbildung/pdf/WB-VIII-6-Graphen.pdf