Hallo Welt für Fortgeschrittene

Ähnliche Dokumente
Hallo Welt für Fortgeschrittene

S=[n] Menge von Veranstaltungen J S kompatibel mit maximaler Größe J

Informatik II Greedy-Algorithmen

Übrigens: um den Algorithmus im Unterricht einzuführen, sind keine Formeln notwendig! Warum reicht die normale ASCII-Codierung nicht aus?

ADS: Algorithmen und Datenstrukturen 2

4 Greedy-Algorithmen (gierige Algorithmen)

Babeș-Bolyai Universität Cluj Napoca Fakultät für Mathematik und Informatik Grundlagen der Programmierung MLG5005. Paradigmen im Algorithmenentwurf

Dynamisches Huffman-Verfahren

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

Überblick. TSP Vergleich der Lösungen. Das Travelling Salesman Problem. Nearest-Neighbor Heuristik für TSP

Dynamische Programmierung

Klausur Informatik-Propädeutikum (Niedermeier/Hartung/Nichterlein, Wintersemester 2012/13)

Musterlösung zur Hauptklausur Theoretische Grundlagen der Informatik Wintersemester 2013/14

Datenstrukturen & Algorithmen

Dynamische Programmierung. Problemlösungsstrategie der Informatik

Dynamisches Programmieren - Problemstruktur

Literatur. Dominating Set (DS) Dominating Sets in Sensornetzen. Problem Minimum Dominating Set (MDS)

Problem: Finde für Alphabet mit n Zeichen einen Binärcode, der die Gesamtlänge eines Textes (über diesem Alphabet) minimiert.

Approximationsalgorithmen: Klassiker I. Kombinatorische Optimierung Absolute Gütegarantie Graph-Coloring Clique Relative Gütegarantie Scheduling

Algorithmen & Programmierung. Rekursive Funktionen (1)

Kapitel 2: Analyse der Laufzeit von Algorithmen Gliederung

Das Briefträgerproblem

11.1 Grundlagen - Denitionen

Very simple methods for all pairs network flow analysis

Algorithmische Bioinformatik 1

Ein Dieb raubt einen Laden aus; um möglichst flexibel zu sein, hat er für die Beute nur einen Rucksack dabei

Randomisierte Algorithmen 2. Erste Beispiele

Aufgabe 4.2 Sei G = (V, E, l) ein ungerichteter, gewichteter und zusammenhängender Graph.

Algorithmen II Vorlesung am

Proseminar Kodierverfahren bei Dr. Ulrich Tamm Sommersemester 2003 Thema: Codierung von Bäumen (Prüfer Codes...)

Codierung, Codes (variabler Länge)

Algorithmen II Vorlesung am

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

Kapitel 9 Algorithm. Geometrie. Kürzeste Abstände Konvexe Hülle

13 Java 4 - Entwurfsmuster am Beispiel des Rucksackproblems

6. Komprimierung. (Text)komprimierung ist ein Wechsel der Repräsentation von Daten, so daß sie weniger

5.2 Das All-Pairs-Shortest-Paths-Problem (APSP-Problem) Kürzeste Wege zwischen allen Knoten. Eingabe: Gerichteter Graph G =(V, E, c)

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

Geometrische Algorithmen

kontextfreie Grammatiken Theoretische Informatik kontextfreie Grammatiken kontextfreie Grammatiken Rainer Schrader 14. Juli 2009 Gliederung

Einführung in die Programmierung

Algorithmen mit konstantem Platzbedarf: Die Klasse REG

6. Übungsblatt zu Algorithmen II im WS 2011/2012

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

Suchen und Sortieren Sortieren. Heaps

Sortieralgorithmen. Inhalt: InsertionSort BubbleSort QuickSort. Marco Block

Vorlesung 4 BETWEENNESS CENTRALITY

Algorithmen und Datenstrukturen 2

Viel Spaÿ! Aufgabe 0.1. Laufzeit unter Verdoppelung (-)

Anmerkungen zur Übergangsprüfung

Minimal spannender Baum

Datenstrukturen & Algorithmen Lösungen zu Blatt 6 FS 14

TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK

Datenstrukturen & Algorithmen

Grundlagen der Programmierung

Ein Graph ist ein Paar (V,E), wobei V eine Menge von Knoten und E eine Menge von Kanten (v,w) mit v,w in V ist.

Technische Universität München Zentrum Mathematik Propädeutikum Diskrete Mathematik. Weihnachtsblatt

Der linke Teilbaum von v enthält nur Schlüssel < key(v) und der rechte Teilbaum enthält nur Schlüssel > key(v)

Geometrie I. Sebastian Redinger Informatik 2 Programmiersysteme Martensstraße Erlangen

Kürzeste Wege in Graphen. Maurice Duvigneau Otto-von-Guericke Universität Fakultät für Informatik

JAVA - Suchen - Sortieren

15 Optimales Kodieren

Datenbankanwendung. Prof. Dr.-Ing. Sebastian Michel TU Kaiserslautern. Wintersemester 2014/15.

3.1 Konstruktion von minimalen Spannbäumen Es gibt zwei Prinzipien für die Konstruktion von minimalen Spannbäumen (Tarjan): blaue Regel rote Regel

Vollständige Induktion

Algorithmen & Datenstrukturen 1. Klausur

Sortierverfahren für Felder (Listen)

Kombinatorische Optimierung

Alle bislang betrachteten Sortieralgorithmen hatten (worst-case) Laufzeit Ω(nlog(n)).

Übersicht. Datenstrukturen und Algorithmen. Übersicht. Divide-and-Conquer. Vorlesung 9: Quicksort (K7)

Prof. Dr. Heinrich Müller; Dr. Frank Weichert 7. September 2015

Kostenmaße. F3 03/04 p.188/395

1. Motivation / Grundlagen 2. Sortierverfahren 3. Elementare Datenstrukturen / Anwendungen 4. Bäume / Graphen 5. Hashing 6. Algorithmische Geometrie

Algorithmen und Datenstrukturen

Approximationsalgorithmen

5.4 Das Rucksackproblem

Anwendungen von Netzwerkfluss. Wojciech Polcwiartek Institut für Informatik FU Berlin

Studiengang Informatik der FH Gießen-Friedberg. Sequenz-Alignment. Jan Schäfer. WS 2006/07 Betreuer: Prof. Dr. Klaus Quibeldey-Cirkel

22. Algorithmus der Woche Partnerschaftsvermittlung Drum prüfe, wer sich ewig bindet

Theoretische Grundlagen der Informatik

Kapiteltests zum Leitprogramm Binäre Suchbäume

Informatik II, SS 2014

11. Woche: Turingmaschinen und Komplexität Rekursive Aufzählbarkeit, Entscheidbarkeit Laufzeit, Klassen DTIME und P

SS11 Effiziente Algorithmen 5. Kapitel: Dynamische Programmierung

Ferienkurs zur algorithmischen diskreten Mathematik Kapitel 3: Minimal aufspannende Bäume und Matroide

Graphen: Datenstrukturen und Algorithmen

ADS: Algorithmen und Datenstrukturen 2

11. Rekursion, Komplexität von Algorithmen

Es sei a 2 und b 2a 1. Definition Ein (a, b)-baum ist ein Baum mit folgenden Eigenschaften:

Eine Baumstruktur sei folgendermaßen definiert. Eine Baumstruktur mit Grundtyp Element ist entweder

Vorlesung Datenstrukturen

Binary Decision Diagrams (Einführung)

13. Binäre Suchbäume

Einführung in die Informatik 1

Wie löst man Mathematikaufgaben?

Universität des Saarlandes

Stefan Schmid TU Berlin & T-Labs, Berlin, Germany. Reduktionen in der Berechenbarkeitstheorie

Klausur C-Programmierung / / Klingebiel / 60 Minuten / 60 Punkte

Definition Ein gerichteter Graph G = (V, E) ist ein Graph von geordneten Paaren (u, v) mit u V und v V.

Durchschnitt von Matroiden

Transkript:

Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Informatik 2 Programmiersysteme Martensstraße 3 91058 Erlangen

Gliederung Einführung - Ein simples Beispiel - Definition - Abgrenzung zu DP - Code-Template Beispiele - Scheduling-Algorithmen - Fractional-Knapsack - Münzwechsel - Huffman-Kodierung - JingleRingle - FuzzyLife Zusammenfassung & Quellen Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 2

Einführung Ein simples Beispiel Tankstellenproblem: Gegeben sind eine Menge von Tankstellen mit ihrem Abstand zum Startpunkt, unser Zielpunkt, und die Reichweite unseres Autos mit einer Tankfüllung Gesucht ist die minimale Anzahl der Tankstopps Wie machen wir das schnell und einfach? Gierig! Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 3

Einführung Ein simples Beispiel Gierige Lösung: 1. Wir sortieren die Tankstellen absteigend nach ihrer Entfernung zum Startpunkt 2. Wiederhole, solange das Ziel nicht in Reichweite ist: 1. Durchsuche Tankstellenliste, bis erste erreichbare Tankstelle gefunden 2. Erhöhe Tankstoppzähler um 1 3. Falls Tankstelle vor dem Ziel liegt, setze Position auf gewählte Tankstelle Sonst: Setze Position auf Ziel, terminiere Wichtige Frage: Wie muss ein Problem beschaffen sein, um durch ein solches intuitives, gieriges Verfahren eine korrekte und optimale Lösung gestatten? Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 4

Einführung - Definiton Definition: Ein gieriger Algorithmus (greedy algorithm) löst ein Optimierungsproblem durch eine sukzessive Auswahl des lokalen Optimums der aktuellen Teillösung. Nota bene: Nicht jedes Optimierungsproblem ist gierig lösbar (Überraschung!) Manche Probleme sind gierig lösbar, liefern aber für manche Eingaben kein globales Optimum Formulieren wir die erforderlichen Eigenschaften eines gierig lösbaren Problems: Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 5

Einführung wichtige Eigenschaften Optimal substructure (aka optimale Substruktur): Die Lösung des Gesamtproblems ist zusammengesetzt aus optimalen Lösungen der Teilprobleme Das genügt offensichtlich nicht! Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 6

Einführung wichtige Eigenschaften Optimal substructure (aka optimale Substruktur): Die Lösung des Gesamtproblems ist zusammengesetzt aus optimalen Lösungen der Teilprobleme Das genügt offensichtlich nicht! Greedy-choice-property: Es ist möglich, in einem iterativen Verfahren durch schrittweise Auswahl der lokal optimalen Teillösung das globale Optimum zu erreichen. Durch die gierige Wahl entsteht immer höchstens ein kleineres Teilproblem. Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 7

Einführung wichtige Eigenschaften Optimal substructure (aka optimale Substruktur): Die Lösung des Gesamtproblems ist zusammengesetzt aus optimalen Lösungen der Teilprobleme Das genügt offensichtlich nicht! Greedy-choice-property: Es ist möglich, in einem iterativen Verfahren durch schrittweise Auswahl der lokal optiḿalen Teillösung das globale Optimum zu erreichen. Durch die gierige Wahl entsteht immer höchstens ein kleineres Teilproblem. Mit dieser letzten Eigenschaft wird bereits ein Unterschied zu DP deutlich. Die Unterscheidung im Allgemeinen: Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 8

Einführung greedy choice vs. DP Dynamische Programmierung - Lösung wird aus bereits gewonnen Teillösungen zusammengestzt Gierige Wahl - Lösung wird sukzessive gierige Wahl gewonnen - Im allgemeinen rekursiv - im Allgemeinen iterativ - erfordert komplexe Überlegungen - intuitiv - benötigt zusätzlichen Speicher - kein inhärenter zusätzlicher Speicherbedarf Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 9

Einführung - Code-Template Ein grobes Muster für die Implementierung einer gierigen Lösung: 1. Sortiere Grundmenge nach einem passenden Kriterium (Wird zum Teil auch in 2. miterledigt, siehe wiki-dijkstra) 2. Solange Lösung nicht vollständig 1. Wähle lokales Optimum und füge es der Lösung hinzu 2. Entferne gegebenfalls gewähltes Element 3. Gebe Lösungsmenge zurück Das funktioniert nicht immer, es gibt aber eine Menge Probleme, die man mit dem Muster beherrschen kann. Dabei gibt es einige Dinge zu beachten... Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 10

Einführung Einige Hinweise Die Auswahl des passenden Sortierkriteriums kann einigermaßen knifflig werden siehe Interval Scheduling Die eigentliche gierige Wahl, also das Befüllen der Lösungsmenge, kann in vielen Fällen in O(n) durchgeführt werden, und wird damit von der Komplexität des Sortierens meist O(n*logn) dominiert Manche Probleme erfordern das Entfernen des in jedem Schritt gewählten Elements aus der Grundmenge nicht, manche verbieten es sogar; also Problemstellung beachten Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 11

Einführung Einige Hinweise Die Auswahl des passenden Sortierkriteriums kann einigermaßen knifflig werden siehe Interval Scheduling Die eigentliche gierige Wahl, also das Befüllen der Lösungsmenge, kann in vielen Fällen in O(n) durchgeführt werden, und wird damit von der Komplexität des Sortierens meist O(n*logn) dominiert Manche Probleme erfordern das entfernen des in jedem Schritt gewählten Elements aus der Grundmenge nicht, manche verbieten es sogar; also Problemstellung beachten Grundlegend ist allerdings vor allem die Frage, ob es für ein bestimmtes Problem überhaupt eine optimale gierige Lösung gibt! Also: Beispiele, Beispiele, Beispiele! Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 12

Beispiele Scheduling Algorithmen (1): Raumplanung Problemstellung: Gegeben: Eine Menge von Lehrveranstaltungen mit ihren Zeitfenstern als offene Intervalle Gesucht; Minimale Anzahl von Räumen, so dass alle Veranstaltungen stattfinden können Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 13

Beispiele Scheduling Algorithmen (1) Raumplanung Algorithmus in Pseudocode: d: Anzahl der benötigten Räume n: Anzahl der Lehrveranstaltungen 1. Sortiere Lehrveranstaltungen nach Beginn ihres Zeitfensters; d := 0 2. for i = 1 to n Falls i-te Veranstaltung kompatibel mit einem vorhandenen Raum: Plane diese Veranstaltung in den passenden Raum Sonst: d := d+1, Plane Veranstaltung in den neu allokierten Raum 3. Fertig, d ist die minimal benötigte Anzahl der Räume Implementierungshinweise: Speichere für jeden Klassenraum das Ende des letzten eingeplanten Zeitfensters, halte Räume in PriorityQueue Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 14

Beispiele Scheduling Algorithmen (1) Raumplanung Intuitiv sieht diese Lösung richtig aus, es werden offensichtlich keine zwei Lehrveranstaltungen zur selben Zeit in denselben Raum geplant; aber ist sie optimal? Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 15

Beispiele Scheduling Algorithmen (1) Raumplanung Intuitiv sieht diese Lösung richtig aus, es werden offensichtlich keine zwei Lehrveranstaltungen zur selben Zeit in denselben Raum geplant; aber ist sie optimal? Ja! Beweis: Sei d die Anzahl der Räume, die der gierige Algorithmus bestimmt Raum d wurde allokiert, weil eine Veranstaltung j in keinen der d-1 anderen Räume geplant werden konnte Da wir nach Anfangszeitpunkt sortiert haben, startet keine der konfligierenden Veranstaltungen nach start(j) Also gibt es d konfligierende Veranstaltungen zum Zeitpunkt start(j) + eps, wobei eps sehr klein und positiv Also werden mindestens d Räume benötigt Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 16

Beispiele Scheduling Algorithmen (2) Interval Scheduling Problemstellung: Gegeben: Eine Menge von jobs gegeben durch ihren jeweiligen Start und Endzeitpunkt Gesucht: Maximale Menge paarweise kompatibler, d. h. Überschneidungsfreier jobs Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 17

Beispiele Scheduling Algorithmen (2) Interval Scheduling Problemstellung: Gegeben: Eine Menge von jobs gegeben durch ihren jeweiligen Start und Endzeitpunkt Gesucht: Maximale Menge paarweise kompatibler, d. h. Überschneidungsfreier jobs Entscheidend ist hier das Sortierkriterium! Welche Möglichkeiten gibt es? Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 18

Beispiele Scheduling Algorithmen (2) Interval Scheduling 1. Möglichkeit: jobs sortieren nach Dauer. Gegenbeispiel: Zeit Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 19

Beispiele Scheduling Algorithmen (2) Interval Scheduling 2. Möglichkeit: jobs sortieren nach frühestem Beginn. Gegenbeispiel: Zeit Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 20

Beispiele Scheduling Algorithmen (2) Interval Scheduling 3. Möglichkeit: jobs sortieren nach Anzahl der Konflikte. Gegenbeispiel: Zeit Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 21

Beispiele Scheduling Algorithmen (2) Interval Scheduling 4. Sortiere jobs aufsteigend nach Endzeitpunkt das ist korrekt! Codeskizze: 1. Sortiere Jobliste aufsteigend nach Endzeitpunkt 2. Solange Jobliste nicht leer a. Entnehme Jobs aus der Liste, bis einer kompatibel oder die Liste leer ist b. Füge gefundenen Job in Ablaufplan ein c. Gehe zu 2. 3.Ablaufplan korrekt und optimal Beweisidee: Zeige, dass Annahme, dass gefundener Ablaufplan nicht optimal ist, zum Widerspruch führt siehe Quelle Kleinberg/Tardos Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 22

Beispiele Scheduling Algorithmen (2) Interval Scheduling Beispielablaufplan: Zeit Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 23

Beispiele Scheduling Algorithmen (2) Interval Scheduling Beispielablaufplan: Zeit Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 24

Beispiele Scheduling Algorithmen (2) Interval Scheduling Beispielablaufplan: Zeit Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 25

Beispiele Scheduling Algorithmen (2) Interval Scheduling Beispielablaufplan: Zeit Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 26

Beispiele Scheduling Algorithmen (2) Interval Scheduling Beispielablaufplan: Zeit Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 27

Beispiele Scheduling Algorithmen (3) Offline-Caching Problemstellung: Gegeben: Ein vollständiger Ablaufplan, d. h. unter anderem alle Seiten, die während des Ablaufes in den Cache geladen werden müssen Gesucht: Seite, die ersetzt werden sollte, falls wir in einen vollen Cache weitere Seiten laden müssen Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 28

Beispiele Scheduling Algorithmen (3) Offline-Caching Lösung: Farthest in the future 1. Sortiere die Seiten im Cache aufsteigend nach dem nächsten Termin, zu dem sie angesprochen werden 2. Ersetze letzte Seite in der Liste durch zu ladende neue Seite Entscheidend ist hier, dass es offline einen fertigen Ablaufplan gibt. Wird dieser online erstellt, ist nicht bekannt, welche Seite am weitesten in der Zukunft erst wieder gebraucht wird. In dem Fall gibt es Alternativen wie LFU, LRU, MFU,... Diese Verfahren führen nicht zwangsläufig zu optimalen Ergebnissen! Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 29

Beispiele Fractional Knapsack Das Rucksackproblem ist aus DP bekannt: Dieses Problem ist NP-vollständig, einen intuitiven GreedyAlgorithmus finden wir also nicht. Dasselbe gilt bekanntlich auch für das 0-1-KnapsackProblem... Es gibt aber eine vereinfachte Variante des Problems, die sich bequem gierig lösen lässt! Fractional Knapsack Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 30

Beispiele Fractional Knapsack Problemstellung: Gegeben: Ein Behälter mit einer Größe G. Eine Menge von Gegenständen mit einer Größe g und einem Wert w Gesucht: Eine maximal wertvolle Auswahl aus den gegeben Gegenständen, wobei die Gegenstände teilbar sind! Zum Beispiel: Welche Speisen muss ich am Büffet auswählen, damit meine Mahlzeit am wertvollsten wird, ohne, dass mir die Sachen vom Teller fallen? Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 31

Beispiele Fractional Knapsack Pseudocode nach unserem Muster: 1. Sortiere die Liste S der Gegenstände absteigend nach Wert 2. Solange G > 0: 1. Entnehme erstes Element aus S. 2. Ist seine Größe kleiner G, so füge es der Lösung hinzu, verringere G um diese Größe. 3. Ist die Größe des Gegenstandes > G, füge soviel wie möglich davon dem Ergebnis hinzu, setze G := 0. 3. Fertig; die Lösungsmenge ist die optimale Auswahl Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 32

Beispiele Fractional Knapsack Ein kleines Beispiel: Der Teller fasst 12 Nahrungsvolumeneinheiten. Auf dem Büffet liegen: Hühnchen, Größe 13, Wert 2 Euro/Einheit Wachteleier, Größe 2, Wert 6 Euro/Einheit Brot, Größe 20, Wert 1 Euro/Einheit Kaviar, Größe 4, Wert 10 Euro/Einheit Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 33

Beispiele Fractional Knapsack 1. Sortieren nach Wert: Wachteleier, Größe 2, Wert 6 Euro/Einheit Kaviar, Größe 4, Wert 10 Euro/Einheit Hühnchen, Größe 13, Wert 2 Euro/Einheit Brot, Größe 20, Wert 1 Euro/Einheit Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 34

Beispiele Fractional Knapsack 1. Sortieren nach Wert: Kaviar, Größe 4, Wert 10 Euro/Einheit Wachteleier, Größe 2, Wert 6 Euro/Einheit Hühnchen, Größe 13, Wert 2 Euro/Einheit Brot, Größe 20, Wert 1 Euro/Einheit 2. G = 12 > 0: Nehme Kaviar; g(kaviar) = 4 < G, also: packe Kaviar auf den Teller, reduziere G um 4, gehe zu 2. Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 35

Beispiele Fractional Knapsack 1. Sortieren nach Wert: Kaviar, Größe 4, Wert 10 Euro/Einheit Wachteleier, Größe 2, Wert 6 Euro/Einheit Hühnchen, Größe 13, Wert 2 Euro/Einheit Brot, Größe 20, Wert 1 Euro/Einheit 2. G = 8 > 0: Nehme Wachteleier; g(wachteleier) = 2 < G, also: packe Wachteleier auf den Teller, reduziere G um 2, gehe zu 2. Lösung: 4 Einheiten Kaviar Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 36

Beispiele Fractional Knapsack 1. Sortieren nach Wert: Kaviar, Größe 4, Wert 10 Euro/Einheit Wachteleier, Größe 2, Wert 6 Euro/Einheit Hühnchen, Größe 13, Wert 2 Euro/Einheit Brot, Größe 20, Wert 1 Euro/Einheit 2. G = 6 > 0: Nehme Hühnchen; g(hühnchen) = 13 > G, also: packe G Einheiten Hünchen auf den Teller, reduziere G auf 0 Lösung: 4 Einheiten Kaviar, 2 Einheiten Wachteleier Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 37

Beispiele Fractional Knapsack 1. Sortieren nach Wert: Kaviar, Größe 4, Wert 10 Euro/Einheit Wachteleier, Größe 2, Wert 6 Euro/Einheit Hühnchen, Größe 13, Wert 2 Euro/Einheit Brot, Größe 20, Wert 1 Euro/Einheit 2. G = 6 > 0: Nehme Hühnchen; g(hühnchen) = 13 > G, also: packe G Einheiten Hünchen auf den Teller, reduziere G auf 0 3. Fertig: Lösung ist optimal Lösung: 4 Einheiten Kaviar, 2 Einheiten Wachteleier, 6 Einheiten Hühnchen Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 38

Beispiele - Münzwechsel Problemstellung: Gegeben: - Geldbetrag G - Eine Währung W, gegeben als eine Menge von Münzwerten Gesucht: - Geringste Anzahl an Münzen, um den Betrag auszuzahlen Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 39

Beispiele - Münzwechsel Gegebene Währung: Euromünzen Gesucht: kleinste Menge von Münzen um 0,97 Euro herauszugeben Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 40

Beispiele - Münzwechsel Wir bauen den Algorithmus mit dem Template... 1. Wir sortieren die Euromünzen absteigend nach ihrem Betrag 2. Solange Betrag > 0 1. Wähle größte Münze, deren Wert kleiner als der Betrag ist, und füge sie der Lösung hinzu 2. Reduziere den Betrag um den Wert der gewählten Münze 3. Gib Lösungsmenge zurück Restbetrag 97 Cent Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 41

Beispiele - Münzwechsel Wir bauen den Algorithmus mit dem Template... 1. Wir sortieren die Euromünzen absteigend nach ihrem Betrag 2. Solange Betrag > 0 1. Wähle größte Münze, deren Wert kleiner als der Betrag ist, und füge sie der Lösung hinzu 2. Reduziere den Betrag um den Wert der gewählten Münze 3. Gib Lösungsmenge zurück Restbetrag 47 Cent Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 42

Wir bauen den Algorithmus mit dem Template... 1. Wir sortieren die Euromünzen absteigend nach ihrem Betrag 2. Solange Betrag > 0 1. Wähle größte Münze, deren Wert kleiner als der Betrag ist, und füge sie der Lösung hinzu 2. Reduziere den Betrag um den Wert der gewählten Münze 3. Gib Lösungsmenge zurück Restbetrag 27 Cent Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 43

Beispiele - Münzwechsel Wir bauen den Algorithmus mit dem Template... 1. Wir sortieren die Euromünzen absteigend nach ihrem Betrag 2. Solange Betrag > 0 1. Wähle größte Münze, deren Wert kleiner als der Betrag ist, und füge sie der Lösung hinzu 2. Reduziere den Betrag um den Wert der gewählten Münze 3. Gib Lösungsmenge zurück Restbetrag 7 Cent Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 44

Beispiele - Münzwechsel Wir bauen den Algorithmus mit dem Template... 1. Wir sortieren die Euromünzen absteigend nach ihrem Betrag 2. Solange Betrag > 0 1. Wähle größte Münze, deren Wert kleiner als der Betrag ist, und füge sie der Lösung hinzu 2. Reduziere den Betrag um den Wert der gewählten Münze 3. Gib Lösungsmenge zurück Restbetrag 2 Cent Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 45

Beispiele - Münzwechsel Wir bauen den Algorithmus mit dem Template... 1. Wir sortieren die Euromünzen absteigend nach ihrem Betrag 2. Solange Betrag > 0 1. Wähle größte Münze, deren Wert kleiner als der Betrag ist, und füge sie der Lösung hinzu 2. Reduziere den Betrag um den Wert der gewählten Münze 3. Gib Lösungsmenge zurück Restbetrag 0 Cent...Fertig Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 46

Beispiele - Münzwechsel Für manche Währungen finden wir nicht immer eine optimale Lösung... Währung: 1, 2, 5, 10, 20, 25, 50, 100, 200, 300, 500 Betrag: 40 gierige Wahl liefert 25, 10, 5... Optimal wäre aber 20, 20! Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 47

Beispiele - Münzwechsel Für manche Währungen finden wir nicht immer eine optimale Lösung... Währung: 1, 2, 5, 10, 20, 25, 50, 100, 200, 300, 500 Betrag: 40 gierige Wahl liefert 25, 10, 5... Optimal wäre aber 20, 20! Für manche Währungen finden wir nicht für jeden auszahlbaren Betrag eine Lösung... Währung: 3, 10, 25, 50, 100 Betrag: 42 gierige Wahl liefert 25, 10, 3, 3...??? Aber eine Lösung existiert: 10, 10, 10, 3, 3, 3, 3 Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 48

Beispiele - Huffman-Codierung Problemstellung: Gegeben: Ein Alphabet A mit relativen oder absoluten Auftrittshäufigkeiten seiner Zeichen Gesucht: Eine präfixfreie optimale Codierung des Alphabets Idee: Wir sortieren die Zeichen nach ihrer Häufigkeit, und bauen daraus sukzessive einen Codierungsbaum auf... Wie genau? Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 49

Beispiele - Huffman-Codierung 1. Sortiere Liste L der Zeichen nach Auftrittshäufigkeit 2. for( i = 1; i < L.length 1; i++) 1. x := L.min(), L.remove(x) 2. y := L.min(), L.remove(y) 3. z := new Node(x+y), z.left := x, z.right := y 4. Füge z an der richtigen Stelle in die sortierte Liste ein 3. gebe letztes verbliebenes Listenelement zurück dabei handelt es sich um die Wurzel des Codierungsbaumes Probieren wir es aus... Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 50

Beispiele - Huffman-Codierung Alphabet mit Häufigkeiten; a: 15 e: 24 i: 13 o: 8 u: 5 y: 33 Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 51

Beispiele - Huffman-Codierung Alphabet mit Häufigkeiten; a: 15 e: 24 i: 13 o: 8 u: 5 y: 33 1. Sortieren: u: 5 o: 8 i: 13 a: 15 e: 24 y: 33 Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 52

Beispiele - Huffman-Codierung Alphabet mit Häufigkeiten; a: 15 e: 24 i: 13 o: 8 u: 5 y: 33 1. Sortieren: u: 5 o: 8 i: 13 a: 15 e: 24 y: 33 2. Baum konstruieren: i: 13 a: 15 e: 24 y: 33 13 u: 5 o: 8 Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 53

Beispiele - Huffman-Codierung Alphabet mit Häufigkeiten; a: 15 e: 24 i: 13 o: 8 u: 5 y: 33 1. Sortieren: u: 5 o: 8 i: 13 a: 15 e: 24 y: 33 2. Baum konstruieren: a: 15 e: 24 26 13 u: 5 y: 33 i: 13 o: 8 Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 54

Beispiele - Huffman-Codierung Alphabet mit Häufigkeiten; a: 15 e: 24 i: 13 o: 8 u: 5 y: 33 1. Sortieren: u: 5 o: 8 i: 13 a: 15 e: 24 y: 33 2. Baum konstruieren: y: 33 26 39 13 u: 5 i: 13 a: 15 e: 24 o: 8 Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 55

Beispiele - Huffman-Codierung Alphabet mit Häufigkeiten; a: 15 e: 24 i: 13 o: 8 u: 5 y: 33 1. Sortieren: u: 5 o: 8 i: 13 a: 15 e: 24 y: 33 2. Baum konstruieren: 59 26 13 u: 5 y: 33 a: 15 39 e: 24 i: 13 o: 8 Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 56

Beispiele - Huffman-Codierung Alphabet mit Häufigkeiten; a: 15 e: 24 i: 13 o: 8 u: 5 y: 33 1. Sortieren: u: 5 o: 8 i: 13 a: 15 e: 24 y: 33 2. Baum konstruieren: 98 59 26 13 u: 5 y: 33 39 a: 15 e: 24 i: 13 o: 8 Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 57

Beispiele Huffman - Codierung Um die Codierung zu gewinnen, beschriftet man jede Kante zu einem linken Kind mit 1, und jede zu einem rechten mit 0, sodass sich die Codewörter als die Pfade zu den Blättern ergeben; a: 01 e: 00 i: 110 o: 1111 u: 1110 y: 10 Anmerkung; Für den Beweis der Optimalität empfiehlt sich ein Rekurs auf die Entropie...wir verlassen uns mal drauf. Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 58

Beispiele - JingleRingle Problemstellung: Ein Online-Rollenspiel operiert mit zwei Währungen, Jingles und Ringles, die man nach folgendem System austauschen kann: 1. Der Käufer zahlt dem Verkäufer X Ringles 2. Der Verkäufer gibt ihm dafür ein Jingle 3. Der Verkäufer bezahlt eine Steuer von floor((x*tax)/100) Man besitzt beliebig viele Ringles Kredit, aber keine Jingles, man erhält eine Liste von Kaufangeboten und eine von Verkausangeboten, wie hoch ist der maximal mögliche Profit in Ringles? Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 59

Beispiele - JingleRingle Einige Anmerkungen zur Lösung: Eine Lösung besteht aus Paaren von Kauf und Verkaufsangeboten Es ist egal, in welcher Reihenfolge wir die Paare auswählen; wichtig ist nur, welche Paare wir wählen Wir wollen Paare aus Angeboten so zusammenstellen, dass die Summe der Profit maximal wird Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 60

Beispiele - JingleRingle Lösungsalgorithmus: 1. a) Sortiere Verkaufsangeboteliste V aufsteigend also so, dass der billigste Jingle an erster Stelle steht b) Sortiere Kaufangeboteliste K absteigend also so, dass das Angebot mit den meisten Ringles für einen Jingle an erster Stelle steht c) profit := 0 2. for i = 0 to min(k.length, V.length) Falls (K[i] tax(k[i])) > V[i]: profit += K[i] tax(k[i]) V[i] 3. Gebe profit zurück Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 61

Beispiel - FuzzyLife Problemstellung Grundlage ist das Game of life : Auf einem unendlich großen Gitter sind lebendige und tote Zellen. Welche Zellen tot und welche Zellen lebendig sind, ändert sich von Runde zu Runde in Abhängigkeit von der Lebendigkeit ihrer Nachbarn nach folgendem Muster: 1. Jede lebende Zelle mit weniger als zwei oder mehr als drei lebendigen Nachbarn stirbt 2. Jede tote Zelle mit genau drei lebenden Nachbarn wird lebendig 3. Alle anderen Zellen verbleiben in ihrem Zustand Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 62

Beispiele - FuzzyLife Wir erhalten nun: Einen Ausschnitt des Gitters mit maximal 50x50 Zellen Jede Zelle im Gitter ist entweder lebendig ('1'), tot ('0'), oder ihr Zustand ist unbekannt ('?') Alle an den Gitterausschnitt angrenzenden Zellen sind tot Keine Zelle grenzt an mehr als eine Zelle mit einem '?' Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 63

Beispiele - FuzzyLife Gesucht: Die Belegung der Zellen mit '?' als tot oder lebendig, so dass nach der nächsten Runde möglichst viele Zellen lebendig sind Essentiell ist hier die Feststellung, dass man die Zellen mit '?' unabhängig betrachten kann aufgrund unserer letzten Vorgabe! Daher ist eine gierige Lösung möglich! Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 64

Beispiele - FuzzyLife //di und dj nutzen wir, um bequem alle Zellen um eine //bestimmte Zelle herum betrachten zu können final int[] di = new int[]{1, 1, 1, 0,-1,-1,-1, 0, 0}; final int[] dj = new int[]{1, 0,-1,-1,-1, 0, 1, 1, 0}; // in grid wird nachher das übergebene Gitter gespeichert, //plus einen zusätzlichen Rahmen von toten Zellen char[][] grid; Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 65

Beispiele - FuzzyLife Hilfsmethode alive, die überprüft, ob eine Zelle in der nächsten Runde leben würde: boolean alive(int i, int j) { int k, na = 0; for (k=0; k<8; k++) //über die Nachbarn von grid[i][j] iterieren, lebendige zählen if (grid[i+di[k]][j+dj[k]]=='1') na++; //Anzahl lebendiger Zellen mit unseren //Überlebensbedingungen abgleichen return ((na==3) (g[i][j]=='1' && na==2)) } Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 66

Beispiele - FuzzyLife Hilfsmethode count, die berechnet, wie viele benachbarte Zellen überleben, wenn man an einer Gitterzelle einen bestimmten Wert einfügt: int count(char v, int i, int j) { int k, na=0; grid[i][j] = v; //iteriere über alle Nachbarn und die Zelle selbst for (k=0; k<9; k++) //wäre die Zelle in der nächsten Runde am Leben, erhöhe Zähler if (alive(i+di[k], j+dj[k])) na++; return na; } Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 67

Beispiele - FuzzyLife public int survivingcells(string[] g) { int i, j, n0, n1; int SZI = grid.length+4; int SZJ = grid[0].length()+4; grid = new char[szi][szj]; //grid initialisieren mit übergebenen Werten plus Doppel - Rand for (i=0; i<szi; i++){ for (j=0; j<szj; j++){ if (i-2<0 i-2>=szi-4 j-2<0 j-2>=szj-4) grid[i][j] = '0'; //tote Felder um das übergeben Gitter else grid[i][j] = g[i-2].charat(j-2); } } Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 68

Beispiele - FuzzyLife //Iteriere über alle Punkte des übergebenen Gitters for (i=2; i<szi-2; i++) for (j=2; j<szj-2; j++) //wenn ein Feld unbekannt ist if (grid[i][j]=='?') { //berechne, wie viele Felder jeweils in der nächsten Runde //leben würden, wenn das Feld lebendig oder tot wäre n0 = count('0',i,j); n1 = count('1',i,j); //jetzt steht '1' in der Zelle grid{i][j]; falls aber '0' mehr lebende //Zellen erzeugt, wechseln if (n0>n1) grid[i][j]='0'; } Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 69

Beispiele - FuzzyLife n1=0; //Das Gitter ist jetzt optimal besetzt, berechne //Gesamtzahl der überlebenden Zellen in der nächsten //Runde for (i=1; i<szi-1; i++) for (j=1; j<szj-1; j++) if (alive(i,j)) n1++; return n1; } Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 70

Zusammenfassung Gierige Algorithmen bestehen meist aus einer Sortierung, und danach einer sukzessiven Auswahl lokaler Optima, die in einem global optimalen Ergebnis resultiert Sie laufen meist in O(n*log(n)), bedingt durch die erforderliche Sortierung Im Gegensatz zu DP sind sie meist intuitiv zu entwickeln, es muss jedoch nachgewiesen werden, das sie optimale Ergebnisse liefern Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 71

Quellen Jon Kleinberg, Éva Tardos: Algorithm Design Hallo Welt 2008: Christoph Erhardt Gierige Algorithmen http://theory.cs.uiuc.edu/~jeffe/teaching/algorithms/notes/04greedy.pdf http://de.wikipedia.org/wiki/euromünzen http://apps.topcoder.com/forums/?module=thread&threadid=69 http://apps.topcoder.com/wiki/display/tc/tco'10+qualificatio n+round+2 Hallo Welt für Fortgeschrittene Gierige Algorithmen Christoph Merdes Folie 72