DS Vorlesung - TU Chemnitz

Werbung
Vorlesung Datenstrukturen
Graphen (2)
Spannbäume
Kürzeste Wege
Dr. Frank Seifert
Vorlesung Datenstrukturen - Sommersemester 2016
Folie 455
Wiederholung
Traversierung eines Graphen via Tiefendurchlaufs / Breitendurchlauf
1. Wähle einen beliebigen Knoten aus dem Graph
2. Lege diesen Knoten in einem Stapel / einer Schlange ab
3. Solange der Stapel / die Schlange nicht leer ist
• Entnimm einen Knoten v aus dem Stapel / der Schlange
• Wenn v nicht markiert ist, dann
• Markiere v als besucht
• Füge alle zu v adjazenten, nicht markierten Knoten dem Stapel / der Schlange hinzu
Dr. Frank Seifert
Vorlesung Datenstrukturen - Sommersemester 2016
Folie 456
Spannbaum
Grundidee
Aufgrund der systematischen Verarbeitung der Knoten eines Graphen sowie des Ignorierens
bereits besuchter Knoten kann man aus der Reihenfolge der besuchten Knoten des Graphen
einen Baum konstruieren, der alle Graphknoten enthält, die vom Startknoten aus erreichbar sind.
Erzeugung
Man generiert aus dem jeweils im Traversierungsalgorithmus verarbeiteten (noch nicht
markierten) Knoten v einen Baum, bei dem v immer die (Teilbaum-)Wurzel seiner (noch nicht
markierten) adjazenten Knoten darstellt, folgt dem Weg der Verarbeitung und entfernt
gegebenenfalls bei Markierung eines Knotens Duplikate auf schon existierenden Ebenen.
Spannwald
Falls nicht alle Knoten des Graphen im Spannbaum enthalten sind, können wir den Vorgang für
die nicht besuchten Knoten wiederholen und erhalten dann einen Wald von Spannbäumen.
Dr. Frank Seifert
Vorlesung Datenstrukturen - Sommersemester 2016
Folie 457
Gewichtete Graphen
Verallgemeinerung von Graphen
Sehr viele Probleme auf Graphen beruhen auf der Auswertung einer Kostenfunktion, die Kanten
ein Gewicht zuordnet, z.B. Routenplanung (Distanzen zwischen Städten, Übertragungskosten von
Energie im Energieverbund, Informationsweg zwischen Kommunikationspartnern im Internet, ...)
Realisierung
• Adjazenzmatrix: Wir speichern die tatsächlichen Gewichte der Kanten statt der Binärgewichte
(Kante vorhanden / keine Kante).
• Adjazenzliste:
Wir erweitern die Liste der adjazenten Knoten um eine Strukturkomponente,
die das Gewicht der Kante zum aktuellen Knoten aufnimmt.
Einschränkung
Negative Gewichte sind nicht erlaubt. Diese Forderung stellt jedoch keine wirkliche
Einschränkung dar, da sich Graphen entsprechend umformen lassen (Gallo, Pallottino, 1986).
Dr. Frank Seifert
Vorlesung Datenstrukturen - Sommersemester 2016
Folie 458
Kürzester Weg zwischen zwei Knoten
Algorithmus von Dijkstra
Berechnet von einem gegebenen Startknoten aus die kürzesten Wege zu allen Knoten
eines Graphen (die von diesem Startknoten aus erreichbar sind).
Allgemeines Funktionsprinzip
Für jeden Knoten u wird zusätzlich festgehalten, zu welchen günstigsten Gesamtkosten
und über welchen Vorgängerknoten u vom Startknoten aus am günstigsten erreichbar ist.
Falls ein Knoten v gefunden werden kann, über den man kostengünstiger zu u gelangt,
werden die Gesamtkosten aktualisiert und der Vorgängerknoten von u auf v gesetzt.
Startzustand
Initialisiere alle Knoten mit Kosten ∞
Initialisiere Startknoten mit Kosten 0
Dr. Frank Seifert
Vorlesung Datenstrukturen - Sommersemester 2016
Folie 459
Algorithmus von Dijkstra
Eingabe
• Gewichteter Graph mit Knotenmenge V und Kantenmenge E mit Kantengewicht w(e∈E)
• Startknoten s∈V
Pseudocode
K(v) = ∞ für alle v∈V
// Initialisierung der Gesamtkosten eines Knotens
K(s) = 0
// Startknoten hat Kosten 0
R=V
// Menge noch zu untersuchender Knoten
Solange R nicht leer ist
Wähle v∈R mit kleinstem K(v)
// Verwende immer den „billigsten Knoten“
Entferne v aus R
Für alle zu v adjazenten Knoten u mit u∈R
Wenn K(v) + w(v,u) < K(u)
Dr. Frank Seifert
// u ist über v billiger zu erreichen
K(u) = K(v) + w(v,u)
// aktualisiere Kosten von u
Vorgänger(u) = v
// aktualisiere Vorgänger von u
Vorlesung Datenstrukturen - Sommersemester 2016
Folie 460
Kürzeste Wege zwischen allen Knoten
Floyd-Warshal-Algorithmus
Wir testen für alle möglichen Kantenkombinationen (j,k), ob man über irgendeinen dritten
Knoten i günstiger (bzw. überhaupt) von j nach k gelangen kann, also ob w(j,i) + w(i,k) < w(j,k).
Wenn ja, aktualisieren wir das Gewicht w(j,k).
Voraussetzung
Darstellung des gewichteten Graphen mittels Adjazenzmatrix.
Ergebnis
for i = 1 to |V|
Modifizierte Adjazenzmatrix, die die günstigsten Verbindungen zwischen allen Knoten (auch indirekter Art) enthält.
for j = 1 to |V|
for k = 1 to |V|
if w(j,i) + w(i,k) < w(j,k)
Besonderheit
w(j,k) = w(j,i) + w(i,k)
Negative Gewichte sind direkt möglich.
Dr. Frank Seifert
Vorlesung Datenstrukturen - Sommersemester 2016
Folie 461
Floyd-Warshall-Algorithmus
Zyklenerkennung
Der Floyd-Warshall-Algorithmus beinhaltet eine implizite Zyklenerkennung.
Voraussetzung
Die Elemente der Hauptdiagonalen der Adjazenzmatrix müssen mit ∞ initialisiert
werden.
Ergebnis
Falls nach der Ausführung des Algorithmus mindestens ein Gewicht auf der
Hauptdiagonalen ungleich ∞ ist, dann existiert (mindestens) ein Zyklus im
Graphen.
Dr. Frank Seifert
Vorlesung Datenstrukturen - Sommersemester 2016
Folie 462
Bewertung der Verfahren
Dijkstra-Algorithmus
Floyd-Warshall-Algorithmus
• berechnet die kürzesten Wege zwischen
allen Knoten eines Graphen
• berechnet die kürzesten Wege / Kosten
zwischen einem Startknoten und allen
anderen Knoten
• negative Gewichte sind direkt möglich
• nur positive Gewichte sind möglich
• sehr hohe Berechnungskomplexität O(|V|3)
• hohe Berechnungskomplexität O(|V|2)
Fazit (für Berechnung der kürzesten Wege zwischen allen Knoten)
• für lichte Graphen bietet sich die |V|-malige Berechnung des kürzesten Weges zwischen
jedem v∈V und den anderen Knoten nach der Methode von Dijkstra an
• für dichte Graphen ist die Laufzeit des Floyd-Warshall-Algorithmus akzeptabel
Dr. Frank Seifert
Vorlesung Datenstrukturen - Sommersemester 2016
Folie 463
Ein Anwendungsbeispiel
Weg- bzw. Zielsuche in einem Labyrinth:
Dr. Frank Seifert
Vorlesung Datenstrukturen - Sommersemester 2016
Folie 464
Modellierung des Labyrinths als Graph
Jeden Punkt im Labyrinth, an dem sich eine Wahlmöglichkeit für den Weg bietet oder ein Weg
endet, modellieren wir als Knoten und alle verbindenden Wege als Kanten eines Graphen.
Da die Wege im Labyrinth in beide Richtungen beschritten werden können, sind die Kanten
ungerichtet.
Dr. Frank Seifert
Vorlesung Datenstrukturen - Sommersemester 2016
Folie 465
Suchen in Graphen
Suchen mittels Graphtraversierung
Mit Hilfe der Graphmodellierung des Labyrinths können wir mit Hilfe der bekannten
Traversierungsalgorithmen einen Weg durch das Labyrinth von dessen Eingang (dem Startknoten)
zum Ausgang (einem Zielknoten) finden.
Im Gegensatz zur Traversierung aller Knoten können wir die Suche abbrechen, sobald wir einen
Zielknoten gefunden haben.
Tiefensuche & Breitensuche
Analog zum Tiefen- oder Breitendurchlauf eines Graphen bezeichnen wir das korrespondierende
Suchverfahren als Tiefen- oder Breitensuche.
Wegsuche & Zielsuche
Je nach Aufgabenstellung kann sowohl der Zielknoten als auch der Weg dahin (oder auch beides)
gefordert sein. Deshalb unterscheiden wir Suchalgorithmen bezüglich Weg- oder Zielsuche:
• Beispiel für Zielsuche: Floyd-Warshall-Algorithmus
• Beispiel für Wegsuche: Navigation eines Roboters durch ein Labyrinth (via Dijkstra-Algorithmus)
Dr. Frank Seifert
Vorlesung Datenstrukturen - Sommersemester 2016
Folie 466
Weg- und Zielsuche im Labyrinth
www.onlinekunst.de/malbuch/labyrinth.html
Dr. Frank Seifert
Vorlesung Datenstrukturen - Sommersemester 2016
Folie 467
Ende der Vorlesung
Dr. Frank Seifert
Vorlesung Datenstrukturen - Sommersemester 2016
Folie 468
Herunterladen