Blatt 10

Werbung
Dozent: Dr. Christoph Garbe
Tutoren: Niels Buwen, Marcel Gutsche, Alexander König, Daniel Stoll, Timo Wiese
10. Übungsblatt
Algorithmen und Datenstrukturen SS 2015
Abgabe bis 09.07.
Aufgabe 1: Single-Source Shortest Path Algorithmen
(9 P.)
In der Vorlesung haben Sie den Algorithmus von Bellman-Ford zur Berechnung kürzester Pfade
kennengelernt. Analysieren Sie nun dessen Arbeitsweise und wenden Sie ihn an.
a) Negative Kantengewichte
(4 P.)
Erklären Sie, welche Auswirkung die Existenz von Kanten mit negativem Gewicht auf den
Algorithmus von Bellman-Ford hat. Was passiert bei Existenz von negativen Zykeln, d.h.
ringförmigen Teilgraphen, deren summiertes Kantengewicht negativ ist?
Abbildung 1: Graphen zur Anwendung von Dijkstra- und Bellman-Ford-Algorithmus
1
Abbildung 2: Ein bipariter Graph G = (V, E).
b) Kürzester Pfad
(5 P.)
Berechnen Sie in dem gegebenen Graphen (Siehe Abb. 1) den kürzesten Pfad von a nach e,
indem sie den Algorithmus von Bellman-Ford anwenden.
Geben Sie in jedem Schritt explizit an, welche Informationen zu den Knoten gespeichert werden.
Aufgabe 2: Bipartite Graph-Matchings
(12 P.)
Ein einfacher Graph G = (V, E) (ohne Zykel und mehrfache Kanten) heisst bipartit, falls sich
seine Knoten in zwei disjunkte Teilmengen L ∈ V und R ∈ V aufteilen lassen, so dass zwischen
den Knoten innerhalb der beiden Teilmengen keine Kanten verlaufen. Es gilt also V = L ∪ R
sowie L ∩ R = ∅ und E ⊆ L × R.
Ein “Matching” M in G ist eine Menge von paarweise nicht-benachbarter Kanten, M ⊆ E.
Keine zwei Kanten in M haben somit einen gleichen Knoten.
a) Algorithmus von Ford-Fulkerson
(6 P.)
Wenden Sie den Ford-Fulkerson-Algorithmus (FFA) auf den abgebildeten bipartiten Graphen
(Abbildung 2) mit hinzugefügter Supersource S und Supersink T an. Gehen Sie davon aus,
dass Kanten ohne Kapazitätsangabe eine unendliche Kapazität haben. Wählen Sie in jeder
Iteration den flussvergrößernden Pfad (Erweiterungspfad) aus, der lexikographisch der kleinste
ist. Geben Sie den Residualgraphen nach jeder Iteration an sowie den aktuellen Fluss von S
nach T .
2
b) Flüsse in Bipartiten Graphen
(3 P.)
Sei G = (V, E) ein bipartiter Graph. Sei weiterhin G0 das korrespondierende Flussnetzwerk.
Geben Sie eine gute obere Schranke für die Länge eines beliebigen Erweiterungspfades in G0
an, der während der Ausführung des Ford-Fulkerson Algorithmus gefunden wird.
c) Maximum Bipartite Matching
(6 P.)
Unter “Maximum Bipartite Matching” versteht ein Matching M , welches die maximale Anzahl
von Knoten aus L mit denen aus R verbindet. Per Definition wird dabei genau einem Knoten
aus L genau einem aus R “zugeordnet”.
1) Wie lässt sich ein “Maximum Bipartite Matching” mit dem Ford-Fulkerson Algorithmus
finden? Welche Eigenschaft muss der bipartite Graph haben und wie müsste der Graph
in Abbildung 2 geändert werden. Begründen Sie Ihre Antwort.
2) Geben Sie das “Maximum Bipartite Matching” für den Graph in Abbildung 2 an.
Aufgabe 3: Aktualisierung des maximalen Flusses
(12 P.)
Sei G = (V, E) ein Flussnetzwerk mit Quelle s, Senke t und Integer-Kapazitäten. Für dieses
Netzwerk existiert ein maximaler Fluss von s nach t. Gehen Sie bei der Bearbeitung der
folgenden Aufgabenteile davon aus, dass der aktuelle Wert des maximalen Flusses bekannt
ist.
a) Erhöhte Kantenkapazitäten
(6 P.)
Angenommen die Kapazität einer Kante wird um 1 erhöht. Geben Sie einen Algorithmus an,
der in O(|V | + |E|) den maximalen Fluss aktualisiert!
b) Verringerte Kantenkapazitäten
(6 P.)
Nehmen Sie nun an, dass die Kapazität einer Kante um 1 verringert wird. Geben Sie einen
Algorithmus an, der in O(|V | + |E|) den maximalen Fluss aktualisiert!
3
Aufgabe 4: Dijkstra in Python
(17 P.)
In der Vorlesung haben Sie den Dijkstra-Algorithmus kennengelernt. Diesen werden Sie nun in
Python implementieren. Importieren Sie dafür bitte das Projekt AlgoDat10.zip. Dort finden Sie
einen gerichteten Graphen als Adjazentmatrix. Dieser hat für jede Kante ein positives Gewicht.
Ziel dieser Aufgabe ist es, den Dijkstra-Algorithmus zu implementieren um den kürzesten Weg
zwischen 2 Knoten zu finden.
a) Verwendung der Datenstruktur
(4 P.)
Welche der Ihnen aus der Vorlesung bekannten Datenstrukturen würden sich für die Implementierung am besten eignen? Begründen Sie ihre Antwort ausführlich und gehen Sie auf Vorteile
bzw. Nachteile ein.
b) Implementierung
(10 P.)
Implementieren Sie den Dijkstra-Algorithmus mit der von Ihnen gewählten Datenstruktur. Der
Algorithmus soll das Gewicht, sowie den kürzesten Pfad ausgeben.
c) Transponieren
(3 P.)
Was würde passieren, wenn wir den Graphen transponieren würden. Würde das Ergebnis
gleich bleiben? Wenn wir die Eingabe der Parameter von Dijkstra(A,B) vertauschen, also Dijkstra(B,A). Würde das einer Tranponierung des Graphen entsprechen? Was würde passieren,
wenn in der Adjazenzmatrix anstelle von None der Zahlenwert 0 gespeichert wird?
4
Herunterladen