Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Greedy-Algorithmus Greedy-Algorithmen sind mit dem dynamischen Programmieren verwandt, jedoch einfacher. Die Grundsituation ist dieselbe: Es geht um ein.

Ähnliche Präsentationen


Präsentation zum Thema: "Greedy-Algorithmus Greedy-Algorithmen sind mit dem dynamischen Programmieren verwandt, jedoch einfacher. Die Grundsituation ist dieselbe: Es geht um ein."—  Präsentation transkript:

1 Greedy-Algorithmus Greedy-Algorithmen sind mit dem dynamischen Programmieren verwandt, jedoch einfacher. Die Grundsituation ist dieselbe: Es geht um ein Optimierungsproblem; es soll sukzessiv eine optimale Lösung - in Bezug auf eine gegebene Bewertungsfunktion - konstruiert werden. Während man beim dynamischen Programmieren solche optimale Lösung für alle kleineren Teilprobleme konstruiert und mit Hilfe dieser in einer Tabelle eingetragenen Daten die nächst größere optimale Lösung konstruiert, verzichtet man bei Greedy auf die Buchführung mittels einer Tabelle. Stattdessen wird der nächste Erweiterungsschritt zu einer (hoffentlich) optimalen Lösung lediglich auf Grund der lokal verfügbaren Informationen getätigt.

2 Annahme: Es gibt eine Gewichtsfunktion w,
die die „Güte“ einer Lösung (auch einer Teillösung) misst. Es soll eine Lösung mit maximalen w-Wert konstruiert werden. 1. Starte mit der leeren Lösung. 2. Erweitere die bisher konstruierte Teillösung wie folgt: Wenn zur Erweiterung dieser Teillösung k Erweiterungs-möglichkeiten zur Verfügung stehen, die auf die vergrößerten Teillösungen l1, ... , lk führen, wähle diejenige Teillösung li mit w (li) maximal. Der Name Greedy = gefräßig erklärt sich dadurch, dass ein Greedy-Algorithmus nach der Methode „Nimm immer das größte Stück“ vorgeht. Dieses Greedy-Prinzip kann in vielen Fällen funktionieren und tatsächlich auf eine optimale Lösung führen - ohne den Aufwand, der bei dynamischem Programmieren betrieben werden muss.

3 Gesucht: optimaler Präfixcode, d. h. c : S -> {0,1}*, so daß
Huffman-Codes Gegeben: S = {a1, ..., an} Alphabet, pi Wahrscheinlichkeit oder Häufigkeit von ai. Gesucht: optimaler Präfixcode, d. h. c : S -> {0,1}*, so daß 1) kein Codewort c(ai) Anfangsstück des Codes eines anderen Zeichens c(aj) ist, und 2) die mittlere Codewortlänge n i = 1 S pi * |c(ai)| minimal ist. Beispiel: {a,b,c,d,e,f} p: Code: a 0,45 0 b 0,13 101 c 0,12 100 d 0,16 111 e 0, f 0,

4 Dieser Code hat eine mittlere Codewortlänge - bezogen auf die
gegebene Wahrscheinlichkeitsverteilung - von: 0,45*1 + 0,13*3 + 0,12*3 + 0,16*3 + 0,09*4 + 0,05*4 = 2, 24 Tatsächlich ist dieser Präfixcode optimal. Ein Präfixcode zeichnet sich dadurch aus, dass Codewörter nur an den Blättern anzutreffen sind. Ein Präfixcode ist eindeutig entzifferbar; das heißt, in einer fortlaufenden Folge von Nullen und Einsen können die Codewörter ( deren Beginn und Ende) eindeutig identifiziert werden.

5 Code läßt sich als Codebaum darstellen: (nach links 0, nach rechts 1)
a 1 1 1 c b d 1 f e

6 Wenn beispielsweise die Folge
gegeben ist, so ist die Decodierung eindeutig möglich, indem man den Codebaum wie einen endlichen Automaten verwendet; man startet in der Wurzel und jedesmal wenn man auf ein eckiges Kästchen stößt, hat man ein Codewort erkannt: c a f f e e Präfixcodes sind nicht die einzigen eindeutig entzifferbaren Codes.

7 Greedy-Algorithmus generiert diesen Baum auf folgende Weise:
Initialisierung: pro Zeichen 1 Baum mit 1 Blatt, Label ist die Wahrscheinlichkeit der Zeichen Konstruktion: wähle die beiden Bäume mit niedrigstem Label, verknüpfe sie durch neue Wurzel. Label des neuen Baumes ist Summe der Labels der ursprünglichen Bäume. Die Konstruktion ist abgeschlossen, wenn nur noch 1 Baum übrig ist. Codierung von Texten: 1. Im 1. Durchlauf Häufigkeit der Symbole zählen (oder von Standardhäufigkeiten ausgehen). 2. Codebaum als Bitstring codieren und mit Code abspeichern. Beim Decodieren den Codebaum decodieren und dann den Text rekonstruieren. Platzersparnis für Deutsch oder Englisch ca 40%!

8 Der Huffman-Algorithmus konstruiert einen optimalen Codebaum .
Behauptung: Seien a1, ... , an so durchnummeriert, dass p (a1)  p(a2)  ...  p(an) . Dann gibt es einen optimalen Codebaum B, so dass die beiden Blätter a1 und a2 einen gemeinsamen Vaterknoten haben. Beweis: Durch Induktion nach n. Idee: Für n=1 ist der Huffmann-Codebaum optimal. Für n>1 löst der Huffmann-Algorithmus nach Induktionsvoraussetzung die Aufgabenstellung (a1 , a2 , a3 , ... an) mit p ((a1, a2 ))= p (a1) + p(a2) optimal. Das Ergebnis ist der Baum B. Indem wir das Blatt (a1, a2 ) expandieren und die zwei neuen Blätter a1 und a2 anfügen, erhalten wir als Ergebnis genau einen Baum B‘. Wenn es nun einen optimalen Codebaum C für (a1 , a2 , a3 , ... an) gäbe, dann wäre dieser Baum identisch mit B‘, d.h. a1 und a2 haben einen gemeinsamen Vaterknoten.

9 Sei E eine endliche Menge, U eine Menge von Teilmengen von E.
Teilmengensystem Sei E eine endliche Menge, U eine Menge von Teilmengen von E. (E,U) heißt Teilmengensystem, falls gilt: 1. {} Î U; 2. A subseteq B, B Î U => A Î U Das zu (E, U) gehörige Optimierungsproblem besteht darin, für eine beliebige Gewichtsfunktion w : E   eine in U maximale Menge T ( bzgl.  ) zu finden, deren Gesamtgewicht w (T) =  w ( e ) maximal ist. e  T

10 Der einem Teilmengensystem (E, U) und Gewichtsfunktion
w : E   zugeordnete kanonische Greedy-Algorithmus für diese Aufgabe arbeitet wie folgt: Ordne alle Elemente in E nach absteigendem Gewicht: w ( e1 )  ...  w (en ) T = 0; for ( k = 1; k = n; k++) if ( T  {ek}  U ) T = T  {ek}; Ausgabe der Lösung T; (Soll alternativ eine maximale Menge in U mit minimalem Gewicht gefunden werden, so ordne man zu Beginn die Elemente von E nach aufsteigendem Gewicht). Dieser Algorithmus liefert allerdings nicht immer die optimale Lösung.

11 Beispiel: Sei E = { e1 , e2 , e3 } U = { 0, {d1 }, {e2 }, {e3 }, {e2,e3 } } mit w(e1) = 3 w(e2) = w(e3) = 2 Dann liefert der kanonische Greedy-Algorithmus die Lösung T = {e1} mit w(T) = 3, während die optimale Lösung dagegen T‘ = {e2,e3} mit w(T‘) = 4 ist.

12 Austauscheigenschaft
Der kanonische Greedy-Algorithmus funktioniert ( in Bezug auf jede mögliche Gewichtsfunktion) genau dann, wenn das Teilmengensystem (E,U) ein Matroid ist. Diese algebraische Struktur verlangt ein zusätzliches Axiom, nämlich die Austauscheigenschaft: A, B  U, |A| < |B|   x  B - A : A { x }  U Das obige Beispiel stellt kein Matroid dar, denn die Austauscheigenschaft ist bei A = { e1 } und B = { e2 , e3 } verletzt.

13 Satz: Sei (E,U) ein Teilmengensystem. Der kanonische
Greedy-Algorithmus liefert für das zugehörige Optimierungsproblem ( in Bezug auf jede beliebige Gewichtsfunktion w : E  ) die optimale Lösung, genau dann wenn (E, U) ein Matroid ist. Beweis: () Annahme, die Austauschbarkeit gelte nicht. Dann gibt es A und B in U mit |A| < |B| , so dass für alle b B - A gilt A  { b } U. Sei r = |B|. Die Gewichtsfunktion w : E   sei definiert durch r + 1, x  A, r, x  B - A, 0, sonst w(x) =

14 Der Greedy-Algorithmus wählt dann eine Menge T
mit A  T und T  (B - A) = 0. Also ist w (T) = ( r + 1) * |A|  (r + 1) ( r - 1) = r2 - 1. Wählt man stattdessen eine Lösung T‘  B, so hat diese den Wert w(T‘)  r * |B| = r2. Der Greedy-Algorithmus liefert in diesem Fall also nicht die optimale Lösung. Wenn man also bei einem Problem, bei dem sich der Greedy-Ansatz anbietet, feststellt, dass die zugrundeliegende algebraische Struktur ein Matroid ist, dann hat man mit Hilfe dieses Satzes „automatisch“ gezeigt, dass Greedy die optimale Lösung liefert.

15 Auftragsplanung: Gegeben: Menge A von n "Aufträgen", jeweils in einer Zeiteinheit zu bewältigen, zu jedem Auftrag i gibt es Gewinn pi und Termin di , an dem er abgeschlossen sein muß (sonst kein Gewinn) Gesucht: Menge M von Aufträgen, so daß a) M sich so sortieren läßt, dass jeder Auftrag vor seinem Abschlußtermin erledigt wird und b) der Gesamtgewinn maximal ist.

16 Beispiel: Auftragsplanung
Job Gewinn Deadline 4 5 3 Lösung Gewinn 3,2,4 40 4,2 30 1,2, beste Lösung

17 Greedy Algorithmus: Ordne Aufträge nach absteigenden Gewinnen: p1  p2  ...  pn; A := {}; for ( i= 1; i = n ; i++) if ( A È {i} ist zulässige Lösung) A = A È {i}; Gib A aus Bemerkung: 1. Es ist wesentlich, daß eine Menge von Aufträgen erzeugt wird, die dann noch in Reihenfolge gebracht werden muß, nicht direkt eine Folge. 2. Aus diesem Algorithmus erhält man den kanonischen Greedy-Algorithmus, wenn man statt der Gewinne eine entsprechende Wertefunktion w verwendet.

18 Die Korrektheit des Auftragsplanungs-Algorithmus ergibt sich direkt aus der entsprechenden Matroideigenschaft: E: Menge A von Aufträgen U: Menge L(A) von zulässigen Lösungen, d.h. Aufträgen, so daß Sortierung entsprechend deadline möglich ist Es gilt offensichtlich (A, L(A)) ist Teilmengensystem. Nachweis der Austauscheigenschaft: Sei b ein Element in Y-X mit größter (= spätester) deadline. Dieses Element kann zu X hinzugefügt werden, ohne Lösungseigenschaft zu verletzen.


Herunterladen ppt "Greedy-Algorithmus Greedy-Algorithmen sind mit dem dynamischen Programmieren verwandt, jedoch einfacher. Die Grundsituation ist dieselbe: Es geht um ein."

Ähnliche Präsentationen


Google-Anzeigen