Software Entwicklung 1

Ähnliche Dokumente
Software Entwicklung 1. Graphen. Motivation. Definitionen: Graph. Annette Bieniusa / Arnd Poetzsch-Heffter

Software Entwicklung 1

12. Graphen Programmieren / Algorithmen und Datenstrukturen 2 Prof. Dr. Bernhard Humm FB Informatik, Hochschule Darmstadt Wintersemester 2012 / 2013

Lernmodul 7 Algorithmus von Dijkstra

Software Entwicklung 1

Vorlesung Datenstrukturen

Routing A lgorithmen Algorithmen Begriffe, Definitionen Wegewahl Verkehrslenkung

Graphdurchmusterung, Breiten- und Tiefensuche

Kap. 6.6: Kürzeste Wege

Vorlesung Datenstrukturen

Routing Algorithmen. Begriffe, Definitionen

Programmierung 2 Studiengang MI / WI

Kap. 6.6: Kürzeste Wege

4.2 Minimale Spannbäume: Der Algorithmus von Jarník/Prim Definition 4.2.1

Vorlesung Datenstrukturen

Algorithmen & Komplexität

Teil 2: Graphenalgorithmen

Software Entwicklung 1. Fallstudie: Arithmetische Ausdrücke. Rekursive Klassen. Überblick. Annette Bieniusa / Arnd Poetzsch-Heffter

Algorithmen und Datenstrukturen 2

Algorithmen und Datenstrukturen 2-1. Seminar -

Teil 2: Graphenalgorithmen

10. Übungsblatt zu Algorithmen I im SS 2010

Software Entwicklung 1

Organisatorisches. Programmierpraktikum Das Canadian Traveller Problem. Organisatorisches. Organisatorisches

Algorithmen und Datenstrukturen SS09. Foliensatz 16. Michael Brinkmeier. Technische Universität Ilmenau Institut für Theoretische Informatik

Informatik II, SS 2016

Praktikum 4: Delegation

Ferienkurs zur algorithmischen diskreten Mathematik Kapitel 1: Grundlagen der algorithmischen Graphentheorie

Graphenalgorithmen I. Geschickt Programmieren für den ICPC- Wettbewerb. Felix Weissenberger

ADS: Algorithmen und Datenstrukturen 2

Software Entwicklung 1

Software Entwicklung 1. Rekursion. Beispiel: Fibonacci-Folge I. Motivation. Annette Bieniusa / Arnd Poetzsch-Heffter

Fortgeschrittene Netzwerk- und Graph-Algorithmen

Programm heute. Algorithmen und Datenstrukturen (für ET/IT) Übersicht: Graphen. Definition: Ungerichteter Graph. Definition: Ungerichteter Graph

7. Dynamische Datenstrukturen Bäume. Informatik II für Verkehrsingenieure

ADS: Algorithmen und Datenstrukturen 2

1 Kürzeste Pfade in Graphen

8.4 Digraphen mit negativen Kantengewichten Grundsätzliches Betrachte Startknoten s und einen Kreis C mit Gesamtlänge < 0.

Algorithmen & Datenstrukturen 2 Praktikum 3

Kürzeste-Wege-Algorithmen und Datenstrukturen

Programmierkurs Python II

Algorithmen und Datenstrukturen

Grundlagen: Algorithmen und Datenstrukturen

Algorithmentechnik - U bung 3 4. Sitzung Tanja Hartmann 03. Dezember 2009

Wir nennen einen Pfad in einem gerichteten Graphen Zyklus, wenn der Pfad im gleichen Knoten beginnt und endet, d. h.

Software Entwicklung 1

Vorlesung Datenstrukturen

Datenstrukturen und Algorithmen (SS 2013)

Algo&Komp. - Wichtige Begriffe Mattia Bergomi Woche 6 7

Datenstrukturen & Algorithmen Lösungen zu Blatt 10 FS 16

12. Der Algorithmus von Dijkstra. Informatik II für Verkehrsingenieure

Kürzeste Wege in Graphen. Orte mit Straßenverbindungen. Coma I Rolf Möhring

Algorithmen und Datenstrukturen (ESE) Entwurf, Analyse und Umsetzung von Algorithmen (IEMS) WS 2013 / 2014 Vorlesung 12, Donnerstag, 23.

Programmiertechnik II

Institut für Programmierung und Reaktive Systeme 31. Mai Programmieren II. 12. Übungsblatt

Informatik II, SS 2014

Programmiertechnik II

Technische Universität Wien Institut für Computergraphik und Algorithmen Arbeitsbereich für Algorithmen und Datenstrukturen

Graphenalgorithmen I

Institut für Programmierung und Reaktive Systeme 28. Mai Programmieren II. 12. Übungsblatt

15. Elementare Graphalgorithmen

Datenstrukturen Teil 2. Bäume. Definition. Definition. Definition. Bäume sind verallgemeinerte Listen. Sie sind weiter spezielle Graphen

ADS 2: Algorithmen und Datenstrukturen

Graphentheorie. Yichuan Shen. 10. Oktober 2013

Algorithmen und Datenstrukturen

Übersicht. Datenstrukturen und Algorithmen. Das Rechenproblem: kürzeste Pfade. Übersicht. Vorlesung 17: Kürzeste Pfade (K24) Bellman-Ford Dijkstra

Einstieg in die Informatik mit Java

Einführung in die Informatik 2

Kürzeste (billigste) Wege

Informatik II, SS 2014

9 Minimum Spanning Trees

Graphen KAPITEL 3. Dieses Problem wird durch folgenden Graph modelliert:

Am Dienstag, den 15. Dezember, ist Eulenfest. 1/60

7. Lineare Gleichungssysteme

Kapitel 5: Graphen und Graphalgorithmen

Algorithmen und Datenstrukturen. Algorithmen und Datenstrukturen. C5.1 Einführung. C5.2 Grundlagen

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

Teil 2: Graphenalgorithmen

Kap. 5: Graphen. Carsten Gutwenger Lehrstuhl für Algorithm Engineering, LS11 Fakultät für Informatik, TU Dortmund. 17. VO DAP2 SS

3.2 Generischer minimaler Spannbaum-Algorithmus

ADS: Algorithmen und Datenstrukturen 2

Algorithmen und Datenstrukturen Tafelübung 14. Jens Wetzl 8. Februar 2012

7. Transitive Hülle. Kante des Graphen. Zusatz-Kante der transitiven Hülle

Das Heiratsproblem. Definition Matching

Graphalgorithmen I. Katharina Reif Hallo Welt -Seminar - LS 2

ADS: Algorithmen und Datenstrukturen 2

Software Entwicklung 1

ADS: Algorithmen und Datenstrukturen 2

Vorlesung Informatik 2 Algorithmen und Datenstrukturen. (20 Graphen) T. Lauer

Institut für Programmierung und Reaktive Systeme 12. Juni Programmieren II. 12. Übungsblatt

Diskrete Strukturen WS 2005/06. Ernst W. Mayr. 27. Januar Fakultät für Informatik TU München

Informatik II, SS 2014

Datenstrukturen. Mariano Zelke. Sommersemester 2012

Datenstrukturen & Algorithmen Lösungen zu Blatt 11 FS 14

Kapitel 4: Netzplantechnik Gliederung der Vorlesung

Vorkurs Informatik WiSe 16/17

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

Graphen und Bäume. A.1 Graphen

Tutoraufgabe 1 (Implementierung eines ADTs):

Transkript:

Software Entwicklung 1 Annette Bieniusa / Arnd Poetzsch-Heffter AG Softech FB Informatik TU Kaiserslautern

Graphen Literaturhinweis: Kapitel 4.5 aus R. Sedgewick, K. Wayne: Einführung in die Programmierung mit Java. 2011, Pearson Studium. Bieniusa/Poetzsch-Heffter Software Entwicklung 1 2/ 35

Motivation Graphen sind Datentypen zur Modellierung von (paarweisen) Verbindungen von Dingen. Sie eignen sich daher zur Darstellung von Netzwerken (z.b. Netzwerk von Freundschaften und Verwandschaft, von Straßen, von Nervenzellen) Funktionsgraphen in der Mathematik Verallgemeinerung von Bäumen und Listen Listenknoten haben (max.) einen Nachfolger und keine Zyklen Knoten in Binärbäumen haben (max.) zwei Nachfolger und keine Zyklen Bieniusa/Poetzsch-Heffter Software Entwicklung 1 3/ 35

Definitionen: Graph Ein gerichteter Graph (engl. digraph) G = (V, E) besteht aus einer endlichen Menge V von Knoten (engl. vertices) einer Menge E V V von Kanten (engl. edges) Ist (va, ve) eine Kante, dann nennt man va den Anfangs- oder Startknoten oder Quelle ve den Endknoten oder das Ziel der Kante. ve heißt von va direkt erreichbar und Nachfolger von va; va ist der Vorgänger von ve. Bieniusa/Poetzsch-Heffter Software Entwicklung 1 4/ 35

Anwendungsbeispiele: Graphenmodelle System Knoten Kanten Internet Webseite Link Soziales Netzwerk Person Freundschaft Software Klasse Verwendung von Objekten Transport Kreuzung Straße Biochemie Protein Interaktion Bieniusa/Poetzsch-Heffter Software Entwicklung 1 5/ 35

Abstrakter Datentyp: Graph interface Graph <T > { // Fuegt Knoten mit Markierung v hinzu void addvertex (T v); // Fuegt Kanten hinzu void addedge ( T start, T end ); // Anzahl der Kanten int numedges (); // Anzahl der Knoten int numvertices (); // Liefert alle Knoten Collection <T > vertices (); // Liefert die direkten Nachbarn eines Knotens Collection <T> neighbors (T v); } Bieniusa/Poetzsch-Heffter Software Entwicklung 1 6/ 35

Repräsentierungen von Graphen Sei G = (V, E) ein gerichteter Graph, V = {1,..., n}. G lässt sich z.b. speichern als: Adjazenzmatrix: boolesche n n-matrix, wobei der Eintrag an Position (x, y) true ist genau dann, wenn es in G eine Kante von x nach y gibt. Adjazenzlisten: Speichere für jeden Knoten die Liste der Knoten, die mittels einer Kante verbunden sind Bieniusa/Poetzsch-Heffter Software Entwicklung 1 7/ 35

Implementierung mit Adjazenzlisten Siehe Implementierung in Graph.zip! Bieniusa/Poetzsch-Heffter Software Entwicklung 1 8/ 35

Kürzeste Pfade Ein Pfad von Knoten A zu Knoten B ist die Folge von Kanten, die A und B im Graph miteinander verbindet. Ein kürzester Pfad ist ein Pfad mit einer minimalen Anzahl an Kanten in der Verbindung. Kürzeste Pfade müssen nicht eindeutig sein. Typische Fragestellungen: Existiert ein Pfad zwischen zwei gegebenen Knoten? Was ist ein kürzester Pfad zwischen zwei gegebenen Knoten? Wie groß ist die Distanz, d.h. wie lang ist ein kürzester Pfad? Bieniusa/Poetzsch-Heffter Software Entwicklung 1 9/ 35

Berechnung der Distanz I Fragestellung: Wie groß ist die Distanz von Knoten S zu allen anderen (erreichbaren) Knoten des Graphs? Beobachtung: Die Distanz des Startknotens S zu sich selbst ist 0. Die Distanz der direkten Nachbarn von S ist 1. Achtung: Die Distanz der direkten Nachbarn der direkten Nachbarn ist nicht immer 2! (Gegenbeispiel: Startknoten S!) Betrachte die Knoten in der Reihenfolge ihrer Distanz zu S! Bieniusa/Poetzsch-Heffter Software Entwicklung 1 10/ 35

Berechnung der Distanz II Algorithmische Idee: Verwalte die Knoten in einer Queue, beginnend mit dem Startknoten S. 1 Entnehme den nächsten Knoten v aus der Queue. 2 Für alle Nachbarn, für die noch keine Distanz ermittelt wurde, weise eine Distanz zu, die um eins größer ist als die Distanz von v. 3 Füge diese Nachbarn in die Queue ein. Bieniusa/Poetzsch-Heffter Software Entwicklung 1 11/ 35

Implementierung public static Map < String, Integer > d i s t a n c e T o O t h e r s ( String s, Graph < String > g) { Map < String, Integer > result = new HashMap < String, Integer >() ; Queue < String > queue = new LinkedList < String >() ; // In it i al is ie r un g mit Startknoten result. put (s,0) ; queue. add (s); // Verwalten der Queue while (! queue. isempty ()) { String v = queue. remove (); int dist = result. get (v); // Betrachte die Nachbarknoten for ( String neighbor : g. neighbors (v)) { // falls noch nicht besucht if (! result. containskey ( neighbor )) { result. put ( neighbor, dist +1) ; queue. add ( neighbor ); } } } return result ; } Bieniusa/Poetzsch-Heffter Software Entwicklung 1 12/ 35

Berechnung der kürzesten Pfade Fragestellung: Was ist ein jeweils kürzester Pfad von Knoten S zu allen anderen (erreichbaren) Knoten des Graphs? Idee: Beim Ermitteln der Distanz wird ein solcher Pfad konstruiert. Der Vorgänger auf dem Pfad ist der Nachbarknoten mit Distanz um 1 kleiner. Verwalte diese Vorgängerknoten in eigener Map, ähnlich der Distanzinformation. Der Pfad kann dann anhand dieser Information rekonstruiert werden. Bieniusa/Poetzsch-Heffter Software Entwicklung 1 13/ 35

Implementierung Informationen zu Distanzen und Pfaden werden für jeden Knoten in einem Objekt der Klasse ShortestPath verwaltet. Im Konstruktor werden gleichzeitig Distanz und Vorgänger auf dem kürzesten Pfad vorberechnet. Implementierung: siehe Graph.zip auf Homepage Bieniusa/Poetzsch-Heffter Software Entwicklung 1 14/ 35

Vom Problem zum Programm Bieniusa/Poetzsch-Heffter Software Entwicklung 1 15/ 35

Phasen der Algorithmenentwicklung 1 Konkretes Problem / Fragestellung 2 Problemabstraktion und -formulierung 3 Entwickeln einer algorithmischen Idee 4 Ermitteln wichtiger Eigenschaften des Problems 5 Grobentwurf eines Algorithmus unter Zuhilfenahme bekannter Teillösungen 6 Entwickeln bzw. Festlegen der Datenstrukturen 7 Ausarbeiten des Algorithmus Bieniusa/Poetzsch-Heffter Software Entwicklung 1 16/ 35

1. Problemformulierung Pfadplanung Entwicklung eines Routenplaners für die Nutzung eines U-Bahn-Netzes: Was ist die schnellste Verbindung von Station A nach Station B? Bieniusa/Poetzsch-Heffter Software Entwicklung 1 17/ 35

Beispiel: Paris Bieniusa/Poetzsch-Heffter Software Entwicklung 1 18/ 35

Beispiel: London Bieniusa/Poetzsch-Heffter Software Entwicklung 1 19/ 35

2. Problemabstraktion und -formulierung I U-Bahnnetz (mit Fahrtzeiten) können als Graphen modelliert werden. Modelliere die U-Bahn-Stationen und Verbindungen durch einen gerichteten Graphen mit bewerteten Kanten: U-Bahn-Stationen entsprechen Knoten. Kante entspricht einer direkten Verbindung zwischen Stationen A und B, die von A nach B befahrbar ist (ggf. auch Kante für umgekehrte Richtung). Jede Kante bekommt als Gewichtung die Zeit in Sekunden, die man im Durchschnitt für den Weg von A nach B braucht. Bieniusa/Poetzsch-Heffter Software Entwicklung 1 20/ 35

2. Problemabstraktion und -formulierung II Die Gewichtung ist eine Funktion c : E R + Gewichtete gerichtete Graphen nennt man Distanzgraphen. Damit lässt sich das Problem wie folgt formulieren: Gegeben ein Distanzgraph, der das U-Bahn-Netz modelliert, sowie zwei Knoten s (Start) und z (Ziel). Gesucht ist ein Weg s, v 1,..., v n, z mit minimaler Fahrtdauer l: l = c ((s, v 1 )) + c ((v 1, v 2 )) + + c ((v n, z)) Bieniusa/Poetzsch-Heffter Software Entwicklung 1 21/ 35

3. Entwickeln einer algorithmischen Idee Strategie: Reduktion von Problemen auf ähnlich geartete einfachere (Teil-) Probleme Reduziere die Suche des kürzesten Wegs von s nach z auf kürzeste Wege zu den Knoten auf dem Weg Bieniusa/Poetzsch-Heffter Software Entwicklung 1 22/ 35

Beispiel Aufgabe: Wie ermittelt man den kürzesten Pfad von A nach H? A" B" 4" 20" C" 8" 3" 5" F" D" 8" 1" E" 7" 15" G" 4" H" Bieniusa/Poetzsch-Heffter Software Entwicklung 1 23/ 35

Ansatz (a) Sei die Distanz des Startknotens s zu sich selbst 0. Die Distanz aller anderen Knoten sei zunächst als unendlich angenommen. (b) Besuche nun nach und nach alle Knoten des Graphen, um die minimale Distanz zu ermitteln. 1 Die Distanz zu den direkten Nachfolgern von s entspricht der Gewichtung der jeweiligen Kante, ihr Pfad-Vorgänger ist der Startknoten. 2 Solange der Zielknoten noch nicht besucht wurde, wähle den noch nicht besuchten Knoten mit der kleinsten Distanz zum Startknoten aus, ermittle seine direkten, noch unbesuchten Nachfolger und berechne die Summe der Distanz des aktuellen Knotens und des entsprechenden Kantengewichts. 3 Falls dieser Wert kleiner als die aktuell angenommene Distanz, aktualisiere sie und setze den aktuellen Knoten als Pfad-Vorgänger. (c) Ermittle schließlich den Pfad, indem vom Zielknoten ausgehend die jeweiligen Pfad-Vorgänger gesammelt werden. Bieniusa/Poetzsch-Heffter Software Entwicklung 1 24/ 35

4. Ermitteln wichtiger Eigenschaften des Problems I Die kürzesten Teilstrecken zwischen Knoten in einem Pfad bilden zusammen die kürzeste Strecke auf diesem Pfad. Die Distanz bereits besuchter Knoten zum Startknoten ist minimal. Alle Knoten, die von bereits besuchten Knoten direkt erreichbar sind, bilden einen Rand um die besuchten Knoten. In jedem Iterationsschritt wird die Menge der besuchten Knoten um einen Knoten aus dem Rand erweitert. Bieniusa/Poetzsch-Heffter Software Entwicklung 1 25/ 35

4. Ermitteln wichtiger Eigenschaften des Problems II Verfeinerung des Ansatzes: Sei B die Menge der besuchten Knoten, und R die Menge der Randknoten. 1 Bestimme für jeden Knoten r des Randes einen Vorgänger w r in B, so dass die Distanz zum Startknoten d(r) = d(s, w r ) + c ((w r, r)) minimal ist. 2 Wähle unter allen Knoten r von R den Knoten v mit minimalem d(v) aus. Erweitere B um v. Bieniusa/Poetzsch-Heffter Software Entwicklung 1 26/ 35

5. Grobentwurf des Algorithmus I Wir setzen die obigen Ansätze in einen Grobentwurf um, der auf Dijkstra zurückgeht (vgl. Ottmann, Widmayer: 8.5.1): Für jeden Knoten v verwalten wir drei zusätzliche Informationen: pred(v): dist(v): visited: Vorgänger auf dem kürzesten Weg von s kürzeste bisher ermittelte Entfernung zu s enthält alle Knoten, die bereits besucht wurden Im Folgenden notieren wir die wichtigsten Teile des Algorithmus in Form von Pseudocode. Bieniusa/Poetzsch-Heffter Software Entwicklung 1 27/ 35

5. Grobentwurf des Algorithmus II Initialisierung des Startknotens s: dist. put (s,0) ; visited. add (s); Initialisieren des Randes R: R = neuer leerer Rand ; ergaenzerand (s,r); Bieniusa/Poetzsch-Heffter Software Entwicklung 1 28/ 35

5. Grobentwurf des Algorithmus III Schrittweise Erweiterung des Randes: while R nicht leer do { // waehle naechstgelegenen Randknoten aus waehle v R mit dist. get ( v) minimal ; ergaenzerand (v,r); entferne v aus R ; visited. add (v); } Bieniusa/Poetzsch-Heffter Software Entwicklung 1 29/ 35

5. Grobentwurf des Algorithmus IV ergaenzerand (v, R) { for all w dir ektena chfolg er ( v) do { if!( visited. contains (w)) and ( dist. get (v) + c((v,w)) < dist. get (w)) { // w ist ( kuerzer ) ueber v erreichbar pred. put (w,v); dist. put (w,v. dist + c((v,w))) ; fuege w zu R hinzu ; } } } Bieniusa/Poetzsch-Heffter Software Entwicklung 1 30/ 35

6. Entwickeln bzw. Festlegen der Datenstrukturen In dieser Phase ist zu entscheiden, welche Datenstrukturen für die Realisierung des Graphen und des Randes benutzt werden sollen. Bieniusa/Poetzsch-Heffter Software Entwicklung 1 31/ 35

Benötigte Operationen auf der Graphdatenstruktur Iterieren über die Knotenmenge Iterieren über die Kantenmenge zu einem Knoten Gewichtung der Kanten auslesen Erfordert Graph-Implementierung mit gewichteten Kanten! Bieniusa/Poetzsch-Heffter Software Entwicklung 1 32/ 35

Benötigte Operationen auf dem Rand Rand als leer initialisieren Prüfen, ob Rand leer ist Wählen des Knotens mit minimaler Entfernung Entfernen eines Knotens aus dem Rand Knoten zum Rand hinzufügen bzw. Knoten im Rand modifizieren z.b. Implementierung in Form eines Heaps Bieniusa/Poetzsch-Heffter Software Entwicklung 1 33/ 35

7. Ausarbeiten des Algorithmus Aus den Entscheidungen der 6. Phase entsteht ein Feinentwurf, der präzise zu formulieren und, wo möglich, zu optimieren ist. Schließlich kann der Feinentwurf ausprogrammiert und getestet werden. Siehe nächstes Übungsblatt! Bieniusa/Poetzsch-Heffter Software Entwicklung 1 34/ 35

Bemerkung Bis auf den letzten Schritt sind alle Phasen der Algorithmenentwicklung unabhängig von Programmiersprachen. Üblicherweise rechnet man die Algorithmenimplementierung auch nicht mehr zum Bereich Algorithmen und Datenstrukturen. Softwareentwicklung hat viele Parallelen zur Algorithmenentwicklung. Auch hier hat die Programmierung eine nachgeordnete Bedeutung. Dafür liegt der Schwerpunkt nicht so sehr auf der Lösung gut eingrenzbarer schwieriger Probleme, sondern stärker auf der Bewältigung der vielen Aspekte und des Umfangs der Aufgabenstellung. Bieniusa/Poetzsch-Heffter Software Entwicklung 1 35/ 35