Algorithmen und Komplexität

Ähnliche Dokumente
Algorithmen und Datenstrukturen 2

Dynamische Programmierung

Übersicht. Aktivitäten-Auswahl-Problem. Greedy Algorithmen. Aktivitäten-Auswahl-Problem. Aktivitäten-Auswahl-Problem. Datenstrukturen & Algorithmen

Datenstrukturen & Algorithmen

Algorithmen und Datenstrukturen

19. Dynamic Programming I

Algorithmen und Datenstrukturen 1 Kapitel 3

Dynamische Programmierung. Problemlösungsstrategie der Informatik

Wiederholung. Divide & Conquer Strategie

Entscheidungsbäume. Definition Entscheidungsbaum. Frage: Gibt es einen Sortieralgorithmus mit o(n log n) Vergleichen?

11. Übung Algorithmen I

Algorithmen I - Tutorium 28 Nr. 12

Algorithmen und Datenstrukturen 2 VU 3.0 Nachtragstest SS Oktober 2016

Top-down Bottom-up Divide & Conquer Dynamisches Programmieren Caching (Memoization) Branch-and-Bound Greedy

Algorithmen und Komplexität Lösungsvorschlag zu Übungsblatt 8

Der Dreyfus-Wagner Algorithmus für das Steiner Baum Problem

19. Dynamic Programming I

Algorithmen und Datenstrukturen 2

Dynamisches Programmieren - Problemstruktur

Algorithmen I. Tutorium Sitzung. Dennis Felsing

16. All Pairs Shortest Path (ASPS)

Datenstrukturen und Algorithmen. Christian Sohler FG Algorithmen & Komplexität

19. Dynamic Programming I

Hallo Welt für Fortgeschrittene

Dynamische Programmierung II

Algorithmen und Datenstrukturen

Das Problem des Handlungsreisenden

Algorithmische Bioinformatik 1

Grundbegriffe der Informatik

Programmierung 2. Dynamische Programmierung. Sebastian Hack. Klaas Boesche. Sommersemester

Algorithmen & Komplexität

Perlen der Informatik I Wintersemester 2012 Aufgabenblatt 7

Einführung in die Objektorientierte Programmierung Vorlesung 17: Dynamische Programmierung. Sebastian Küpper

Datenstrukturen und Algorithmen (SS 2013)

Dynamische Programmierung

Berechnung von Abständen

Fortgeschrittene Netzwerk- und Graph-Algorithmen

Algebraische und arithmetische Algorithmen

Graphentheorie. Kürzeste Wege. Kürzeste Wege. Kürzeste Wege. Rainer Schrader. 25. Oktober 2007

Grundbegriffe der Informatik Musterlösung zu Aufgabenblatt 9

5 BINÄRE ENTSCHEIDUNGS- DIAGRAMME (BDDS)

Fortgeschrittene Netzwerk- und Graph-Algorithmen

Informatik I Übung, Woche 48: Nachbesprechung Aufgabe 10.1: Implementation von wechselgeld.pas

6. Algorithmen auf Zeichenketten

Anwendungen dynamischer Programmierung in der Biologie

Algorithmen und Datenstrukturen (für ET/IT)

Entscheidungsverfahren für die Software-Verifikation. 4 - BDDs

Lösungsvorschlag Serie 2 Rekursion

Algorithmen und Datenstrukturen 1 VL Übungstest WS Januar 2011

Algorithmen und Datenstrukturen 2

1 Einführung. 2 Grundlagen von Algorithmen. 3 Grundlagen von Datenstrukturen. 4 Grundlagen der Korrektheit von Algorithmen

21. Greedy Algorithmen. Aktivitätenauswahl, Fractional Knapsack Problem, Huffman Coding Cormen et al, Kap. 16.1, 16.3

Informatik I Übung, Woche 47: Nachtrag zur dynamischen Programmierung

Lösungen von Übungsblatt 12

Numerisches Programmieren, Übungen

5.4 Das Rucksackproblem

Grundbegriffe der Informatik

Vorkurs Informatik WiSe 16/17

Vorlesung 3: Graphenalgorithmen. Markus Püschel David Steurer Peter Widmayer. PDF download goo.gl/ym3spq

6. Transitive Hülle. 6.1 Min-Plus-Matrix-Produkt und Min-Plus-Transitive Hülle Ring Z(+, ) Semiring N(+, )

Vorkurs Informatik WiSe 15/16

Methoden für den Entwurf von Algorithmen

Vorkurs Informatik WiSe 15/16

Graphenalgorithmen und lineare Algebra Hand in Hand Prof. Dr. Henning Meyerhenke

Viele verschiedene Primfaktoren mit wenigen Operationen. Dominik Reichl. Betreuer: Dr. Bernd Borchert, Dr. Klaus Reinhardt. Prof. Dr. K.-J.

Stud.-Nummer: Datenstrukturen & Algorithmen Seite 1

Aufwand und Komplexität Vorlesung vom Komplexität und Effizienz

3.3 Optimale binäre Suchbäume

2. Repräsentationen von Graphen in Computern

Theoretische Informatik 1

Algorithmen und Datenstrukturen 2

9 Minimum Spanning Trees

( )= c+t(n-1) n>1. Stand der Vorlesung Komplexität von Algorithmen (Kapitel 3)

Transkript:

Algorithmen und Komplexität Dynamische Programmierung Markus Ullrich Norbert Baum Fachbereich Informatik - IIb07 Hochschule Zittau/Görlitz 28. Mai 2009 1 / 29

Wie sieht es mit langen Ketten aus? A 1 A 2 A 3 A n (120x17) (17x56) (56x37) (110x112) n>5 2 / 29

Wie sieht es mit langen Ketten aus? A 1 A 2 A 3 A n (120x17) (17x56) (56x37) (110x112) n>5 Auftreten in der Praxis: Verflechtungsproblem Finite Elemente (z.b. im Maschinenbau) 2 / 29

Anwendung: Matrix-Ketten-Multiplikation Quelle: http://www.dasautoblog.com/2007/06/interessantes_w.html 3 / 29

1 Eigenschaften 2 Iterative Berechnung 3 Rekursive Berechnung 4 Optimale Teilstruktur 5 Lösung des Matrizenproblems 4 / 29

Bottom-up-Ansatz Teile und Herrsche Top-down-Ansatz nur die nötigsten Teilprobleme werden berechnet doppelte Berechnungen möglich Dynamisches Programmieren Bottom-up-Ansatz alle Teilprobleme werden berechnet eintragen bereits berechneter Werte in Tabelle keine erneute Berechnung erforderlich 5 / 29

Schwierigkeiten selten unabhängige und überlappungsfreie Teilprobleme unausgewogene Teilprobleme nicht immer gilt die Optimalitätsbedingung Anzahl der zu lösenden Teilprobleme zu groß 6 / 29

Überlappende Teilprobleme immer wieder lösen der selben Teilprobleme = Überlappende Teilprobleme Gesamtzahl der verschiedenen Teilprobleme muss möglichst klein sein durch speichern in Tabelle kann darin bei Bedarf nachgeschlagen werden Aber: Mehrfachberechnungen durch rekursive Lösung kann vorkommen 7 / 29

Iterativ oder rekursiv? Ist die iterative Berechnung der rekursiven vorzuziehen? 8 / 29

Iterativ oder rekursiv? Iterativ Vorteile: keine doppelte Berechnung von Werten Nachteile: Berechnung unnötiger Werte möglich rekursiven Ansatz transformieren ist schwierig und fehleranfällig Rekursiv Vorteile: keine unnötigen Werte werden berechnet Wiederverwendung des rekursiven Ansatzes Nachteile: doppelte Berechnung von Werten möglich 9 / 29

Iterativ oder rekursiv? Memoizing rekursive Berechnung mit Tabelle für Teillösungen Eintrag schon vorhanden? übernehmen sonst berechnen und eintragen Allgemein gilt: lösen aller Teilprobleme erforderlich iterative Lösung um konstanten Faktor schneller (da konstant: vernachlässigbar) sonst: Rekursion mit memoizing 10 / 29

Rückkehr des Rucksackproblems Rucksackproblem Optimierungsproblem der Kombinatorik Optimale Auswahl von n-gegenständen mit dem Ziel des maximalen Werts und nicht Überschreitung des Gewichts Beladung von Schiffen, LKWs, Gepäckträgern in den Alpen... 11 / 29

Implementation 0, i = 0 wert(i, g) = wert(i 1, g), i > 0 und g g i < 0 max(wert(i 1, g), wert(i 1, g g i ) + w i ), sonst 12 / 29

Implementation 0, i = 0 wert(i, g) = wert(i 1, g), i > 0 und g g i < 0 max(wert(i 1, g), wert(i 1, g g i ) + w i ), sonst Psudocode iterativ FOR i := 1 TO Anzahl der gegenstaende STEP 1 DO Kopiere die zeileneu auf zeilealt gi := das Gewicht vom dem aktuellen Gegenstand(i) FOR g := 0 TO kapazitaet STEP 1 Do wenn g < gi dann zeileneu[g] := zeilealt[g] sonst temp := zeilealt[g-gi] + Wert von gegenstaend[i] zeileneu[g] := Max(temp, zeilealt[g]) wenn_ende next next 12 / 29

Dimension der Tabelle & Aufwandsbetrachtung Dimension der Tabelle baut sich aus den Gegenständen und der Kapazität zusammen Zeilen stellen Gegenstände dar Spalten die einzelnen Kapazitäten eine zusätzliche Spalte und Zeile für die Initialisierung Auwandsbetrachtung scheinbar linearer Aufwand, wenn man K als Konstante auffasst jedoch hängt K mit n zusammen exponentieller Aufwand 13 / 29

Aufrufbeispiel 0, i = 0 wert(i, g) = wert(i 1, g), i > 0 und g g i < 0 max(wert(i 1, g), wert(i 1, g g i ) + w i ), sonst Kapazität = 5 Nr Gewicht Wert 1 4 1 2 1 4 3 3 2 4 2 3 14 / 29

Aufrufbeispiel 0, i = 0 wert(i, g) = wert(i 1, g), i > 0 und g g i < 0 max(wert(i 1, g), wert(i 1, g g i ) + w i ), sonst Kapazität = 5 Nr Gewicht Wert 1 4 1 2 1 4 3 3 2 4 2 3 0 1 2 3 4 5 0 0 0 0 0 0 0 1 0 14 / 29

Aufrufbeispiel 0, i = 0 wert(i, g) = wert(i 1, g), i > 0 und g g i < 0 max(wert(i 1, g), wert(i 1, g g i ) + w i ), sonst Kapazität = 5 Nr Gewicht Wert 1 4 1 2 1 4 3 3 2 4 2 3 0 1 2 3 4 5 0 0 0 0 0 0 0 1 0 0 14 / 29

Aufrufbeispiel 0, i = 0 wert(i, g) = wert(i 1, g), i > 0 und g g i < 0 max(wert(i 1, g), wert(i 1, g g i ) + w i ), sonst Kapazität = 5 Nr Gewicht Wert 1 4 1 2 1 4 3 3 2 4 2 3 0 1 2 3 4 5 0 0 0 0 0 0 0 1 0 0 0 0 14 / 29

Aufrufbeispiel 0, i = 0 wert(i, g) = wert(i 1, g), i > 0 und g g i < 0 max(wert(i 1, g), wert(i 1, g g i ) + w i ), sonst Kapazität = 5 Nr Gewicht Wert 1 4 1 2 1 4 3 3 2 4 2 3 0 1 2 3 4 5 0 0 0 0 0 0 0 1 0 0 0 0 1 14 / 29

Aufrufbeispiel 0, i = 0 wert(i, g) = wert(i 1, g), i > 0 und g g i < 0 max(wert(i 1, g), wert(i 1, g g i ) + w i ), sonst Kapazität = 5 Nr Gewicht Wert 1 4 1 2 1 4 3 3 2 4 2 3 0 1 2 3 4 5 0 0 0 0 0 0 0 1 0 0 0 0 1 1 14 / 29

Aufrufbeispiel 0, i = 0 wert(i, g) = wert(i 1, g), i > 0 und g g i < 0 max(wert(i 1, g), wert(i 1, g g i ) + w i ), sonst Kapazität = 5 Nr Gewicht Wert 1 4 1 2 1 4 3 3 2 4 2 3 0 1 2 3 4 5 0 0 0 0 0 0 0 1 0 0 0 0 1 1 2 0 14 / 29

Aufrufbeispiel 0, i = 0 wert(i, g) = wert(i 1, g), i > 0 und g g i < 0 max(wert(i 1, g), wert(i 1, g g i ) + w i ), sonst Kapazität = 5 Nr Gewicht Wert 1 4 1 2 1 4 3 3 2 4 2 3 0 1 2 3 4 5 0 0 0 0 0 0 0 1 0 0 0 0 1 1 2 0 4 14 / 29

Aufrufbeispiel 0, i = 0 wert(i, g) = wert(i 1, g), i > 0 und g g i < 0 max(wert(i 1, g), wert(i 1, g g i ) + w i ), sonst Kapazität = 5 Nr Gewicht Wert 1 4 1 2 1 4 3 3 2 4 2 3 0 1 2 3 4 5 0 0 0 0 0 0 0 1 0 0 0 0 1 1 2 0 4 4 4 14 / 29

Aufrufbeispiel 0, i = 0 wert(i, g) = wert(i 1, g), i > 0 und g g i < 0 max(wert(i 1, g), wert(i 1, g g i ) + w i ), sonst Kapazität = 5 Nr Gewicht Wert 1 4 1 2 1 4 3 3 2 4 2 3 0 1 2 3 4 5 0 0 0 0 0 0 0 1 0 0 0 0 1 1 2 0 4 4 4 4 14 / 29

Aufrufbeispiel 0, i = 0 wert(i, g) = wert(i 1, g), i > 0 und g g i < 0 max(wert(i 1, g), wert(i 1, g g i ) + w i ), sonst Kapazität = 5 Nr Gewicht Wert 1 4 1 2 1 4 3 3 2 4 2 3 0 1 2 3 4 5 0 0 0 0 0 0 0 1 0 0 0 0 1 1 2 0 4 4 4 4 5 14 / 29

Aufrufbeispiel 0, i = 0 wert(i, g) = wert(i 1, g), i > 0 und g g i < 0 max(wert(i 1, g), wert(i 1, g g i ) + w i ), sonst Kapazität = 5 Nr Gewicht Wert 1 4 1 2 1 4 3 3 2 4 2 3 0 1 2 3 4 5 0 0 0 0 0 0 0 1 0 0 0 0 1 1 2 0 4 4 4 4 5 3 0 14 / 29

Aufrufbeispiel 0, i = 0 wert(i, g) = wert(i 1, g), i > 0 und g g i < 0 max(wert(i 1, g), wert(i 1, g g i ) + w i ), sonst Kapazität = 5 Nr Gewicht Wert 1 4 1 2 1 4 3 3 2 4 2 3 0 1 2 3 4 5 0 0 0 0 0 0 0 1 0 0 0 0 1 1 2 0 4 4 4 4 5 3 0 4 4 14 / 29

Aufrufbeispiel 0, i = 0 wert(i, g) = wert(i 1, g), i > 0 und g g i < 0 max(wert(i 1, g), wert(i 1, g g i ) + w i ), sonst Kapazität = 5 Nr Gewicht Wert 1 4 1 2 1 4 3 3 2 4 2 3 0 1 2 3 4 5 0 0 0 0 0 0 0 1 0 0 0 0 1 1 2 0 4 4 4 4 5 3 0 4 4 4 14 / 29

Aufrufbeispiel 0, i = 0 wert(i, g) = wert(i 1, g), i > 0 und g g i < 0 max(wert(i 1, g), wert(i 1, g g i ) + w i ), sonst Kapazität = 5 Nr Gewicht Wert 1 4 1 2 1 4 3 3 2 4 2 3 0 1 2 3 4 5 0 0 0 0 0 0 0 1 0 0 0 0 1 1 2 0 4 4 4 4 5 3 0 4 4 4 6 14 / 29

Aufrufbeispiel 0, i = 0 wert(i, g) = wert(i 1, g), i > 0 und g g i < 0 max(wert(i 1, g), wert(i 1, g g i ) + w i ), sonst Kapazität = 5 Nr Gewicht Wert 1 4 1 2 1 4 3 3 2 4 2 3 0 1 2 3 4 5 0 0 0 0 0 0 0 1 0 0 0 0 1 1 2 0 4 4 4 4 5 3 0 4 4 4 6 6 14 / 29

Aufrufbeispiel 0, i = 0 wert(i, g) = wert(i 1, g), i > 0 und g g i < 0 max(wert(i 1, g), wert(i 1, g g i ) + w i ), sonst Kapazität = 5 Nr Gewicht Wert 1 4 1 2 1 4 3 3 2 4 2 3 0 1 2 3 4 5 0 0 0 0 0 0 0 1 0 0 0 0 1 1 2 0 4 4 4 4 5 3 0 4 4 4 6 6 4 0 14 / 29

Aufrufbeispiel 0, i = 0 wert(i, g) = wert(i 1, g), i > 0 und g g i < 0 max(wert(i 1, g), wert(i 1, g g i ) + w i ), sonst Kapazität = 5 Nr Gewicht Wert 1 4 1 2 1 4 3 3 2 4 2 3 0 1 2 3 4 5 0 0 0 0 0 0 0 1 0 0 0 0 1 1 2 0 4 4 4 4 5 3 0 4 4 4 6 6 4 0 4 14 / 29

Aufrufbeispiel 0, i = 0 wert(i, g) = wert(i 1, g), i > 0 und g g i < 0 max(wert(i 1, g), wert(i 1, g g i ) + w i ), sonst Kapazität = 5 Nr Gewicht Wert 1 4 1 2 1 4 3 3 2 4 2 3 0 1 2 3 4 5 0 0 0 0 0 0 0 1 0 0 0 0 1 1 2 0 4 4 4 4 5 3 0 4 4 4 6 6 4 0 4 4 14 / 29

Aufrufbeispiel 0, i = 0 wert(i, g) = wert(i 1, g), i > 0 und g g i < 0 max(wert(i 1, g), wert(i 1, g g i ) + w i ), sonst Kapazität = 5 Nr Gewicht Wert 1 4 1 2 1 4 3 3 2 4 2 3 0 1 2 3 4 5 0 0 0 0 0 0 0 1 0 0 0 0 1 1 2 0 4 4 4 4 5 3 0 4 4 4 6 6 4 0 4 4 7 14 / 29

Aufrufbeispiel 0, i = 0 wert(i, g) = wert(i 1, g), i > 0 und g g i < 0 max(wert(i 1, g), wert(i 1, g g i ) + w i ), sonst Kapazität = 5 Nr Gewicht Wert 1 4 1 2 1 4 3 3 2 4 2 3 0 1 2 3 4 5 0 0 0 0 0 0 0 1 0 0 0 0 1 1 2 0 4 4 4 4 5 3 0 4 4 4 6 6 4 0 4 4 7 7 7 14 / 29

ohne memoizing 0, i = 0 wert(i, g) = wert(i 1, g), i > 0 und g g i < 0 max(wert(i 1, g), wert(i 1, g g i ) + w i ), sonst 15 / 29

ohne memoizing 0, i = 0 wert(i, g) = wert(i 1, g), i > 0 und g g i < 0 max(wert(i 1, g), wert(i 1, g g i ) + w i ), sonst Pseudocode rekursiv Prozedur: gesamtwertrekursiv Parameter: int i, int kapazitaet rekursiveaufrufe := rekursiveaufrufe+1 wenn i == 0 dann 0 sonst wenn gi > kapazitaet dann gesamtwertrekursiv(i-1,kapazitaet) sonst max(gesamtwert(i-1,kapazitaet), gesamtwert(i-1,kapazitaet-gi)+wi) wenn_ende wenn_ende 15 / 29

ohne memoizing Aufrufbeispiel gesamtwertrekursiv(120); rekursiveaufrufe; Ergebnis rekursiv ohne memoizing: 183 Rekursive Aufrufe: 2026 Feststellungen selbes Ergebnis wie iterativ erheblich mehr rekursive Aufrufe als Teilprobleme 16 / 29

mit memoizing Pseudocode mit memoizing Prozedur: gesamtwertmemo Parameter: int i, int kapazitaet wenn memoliste (i,kapazitaet) enthält dann memoliste(i,kapazitaet) sonst memoliste hinzufügen ((i,kapazitaet), gesamtwertrekursiv(i,kapazitaet)) wenn_ende 17 / 29

mit memoizing Aufrufbeispiel gesamtwertrekursivmemo(120); rekursiveaufrufe; getlengthmemoliste(); 1.Aufruf Ergebnis rekursiv mit memoizing: 183 Rekursive Aufrufe: 502 Länge der Memoliste: 501 18 / 29

mit memoizing Aufrufbeispiel gesamtwertrekursivmemo(120); rekursiveaufrufe; getlengthmemoliste(); 1.Aufruf Ergebnis rekursiv mit memoizing: 183 Rekursive Aufrufe: 502 Länge der Memoliste: 501 2.Aufruf Ergebnis rekursiv mit memoizing: 183 Rekursive Aufrufe: 1 Länge der Memoliste: 501 18 / 29

Fazit Vorteile Rekursion mit Memoizing mindestens so schnell wie iterativ keine Berechnung nicht benötigter Teillösungen keine fehleranfällige Transformation nötig rekursive Variante mit memoizing sollte bevorzugt werden 19 / 29

Weitere Anwendungen Quelle: http://www.fotoeinsichten.de/sonnenblume/sonnenblume.jpg 20 / 29

Vorgehensweise beim Aufdecken Allgemeines Muster 1 Problem auf Entscheidungen zurückführen 2 es wird angenommen, dass die richtigen Entscheidungen getroffen werden 3 darauß die Teilprobleme ableiten 4 Nachweis das Teilprobleme selbst optimal sein müssen Faustregel - Menge der Teilprobleme möglichst klein halten 21 / 29

Beispiel: Ungewichteter einfacher Pfad Gegeben: ein gerichteter Graph G = (V, E) die Knoten u, v V 22 / 29

Beispiel: Ungewichteter einfacher Pfad Ungewichteter kürzester Pfad Gesucht: kürzester Pfad p = u v mit u v Einteilung in Teilpfade: p 1 = u w und p 2 = w v Summe der Kanten in p 1 und p 2 = Summe der Kanten in p Nachweis: p 1 und p 2 müssen optimal sein 23 / 29

Beispiel: Ungewichteter einfacher Pfad Ungewichteter längster Pfad Gesucht: längster Pfad p = u v mit u v p muss ein einfacher Pfad sein Vorgehen analog zum kürzesten Pfad Einteilung in Teilpfade: p 1 = u w und p 2 = w v Aber: Teilprobleme sind nicht optimal Es existiert keine optimale Teilstruktur für dieses Problem. 24 / 29

Naive Lösung 25 / 29

Naive Lösung Anzahl der Klammerungen zählen 1, wenn n = 1 P(n) = n 1 P(k)P(n k), wenn n 2 k=1 exponentieller Aufwand: 2 n schlechte Lösung! 25 / 29

Lösen mit dynamischer Programmierung Die Struktur einer optimalen Klammerung jede Matrix A i besitzt die Dimension p i 1 x p i Berechnung des Produktes A i A i+1 A j = A i..j mit i j Gilt i < j, dann existiert ein k mit i k < j welches das Produkt A i..j zwischen A k und A k+1 aufspaltet. Kosten von A i..k + Kosten von A k+1..j = Kosten von A i..j ist A i..j optimal geklammert, so müssen auch A i..k und A k+1..j optimal geklammert sein 26 / 29

Lösen mit dynamischer Programmierung Eine rekursive Lösung m[i, j] = Minimum der skalaren Operationen zu Berechnung von A i..j gilt i = j, sind keine Operationen notwendig m[i, i] = 0 für i < j, teilt optimale Klammerung das Produkt A i..j zwischen A k und A k+1 Erinnerung: jede Matrix A i besitzt die Dimension p i 1 x p i m[i, j] = m[i, k] + m[k + 1, j] + p i 1 p k p j 27 / 29

Lösen mit dynamischer Programmierung Eine rekursive Lösung 0, falls i = j m[i, j] = min {m[i, j] = m[i, k] + m[k + 1, j] + p i 1 p k p j }, falls i < j i k<j 28 / 29

Danke für ihre Aufmerksamkeit 29 / 29