Greedy-Algorithmen SS09

Aus ProgrammingWiki
< AuK
Archivierte Version vom 2009-05-17T15:55:06+00:00. Aktuelle Version

Inhaltsverzeichnis

Dev Status

Einführung

Greedy [eng. gefräßig] - eine gefräßige Strategie für Algorithmen. Sie funktioniert nach der Methode:

"Nimm immer den besten Happen, den du kriegen kannst."

Das geschieht durch eine rechnerische Entscheidung. Die Berechnung erfolgt auf der Basis lokaler Information, also ohne Rückgriff auf vorher ermittelte Werte.


Bruchteilrucksack-Problem

Greedy


Aufbau

(define greedy
 (lambda (vorgabewert) ; z.B.: Kapazitaet der Rucksacks
  (let
      ((kandidatenliste '(......))
       (loesung? (lambda (ls) ... ))
       (okay? (lambda (ls) ... ))
       (naechster (lambda (ls) ... ))
       (modify+ (lambda (x ls) ... ))
       (modify- (lambda (x ls) ... ))
       (ziel (lambda (ls) ... ))
   (letrec
        ((helfer
           (lambda (kandidaten resultat)
            (cond
             ((loesung? resultat)(ziel resultat))
             ((and (null? kandidaten)(not (loesung? resultat)))
              (error 'greedy "Es gibt keine Loesung."))
             (else
              (let* ((neuer-kandidat (naechster kandidaten))
                     (neues-resultat (cons neuer-kandidat resultat)))
                 (if (okay? neues-resultat)
                     (helfer (modify+ neuer-kandidat kandidaten) neues-resultat)
                     (helfer (modify- neuer-kandidat kandidaten) resultat))))))))
        (helfer kandidatenliste '())))))


Anwendbarkeit

Greedy


Beispiel (Geldwechsel)

Einem Kunden wird Wechselgeld herausgegeben, wobei möglichst wenige Münzen verwendet werden sollen.

  • Zur Verfügung haben wir alle Euro-Münzen: 1, 2, 5, 10, 20, 50, 100 (1 Euro), 200 (2 Euro).
  • Die Münzen werden mit absteigendem Cent-Wert vorsortiert.
  • Die Prozedur geldwechsel ergibt Resultatliste und Anzahl der Münzen.


Die Prozedur wird benutzt um 12,93 Euro (1293 Euro-Cent) herauszugeben. <eval> (geldwechsel 1293) </eval>


Verschiedene Greedy-Algorithmen

Dijkstra

[[Bild:Dijksta_Anim.gif|thumb|284px|Dijkstras Algorithmus
(Quelle: Wikipedia)]]

Edsger W. Dijkstra auf Wikipedia

Kürzeste Wege in Graphen

Die Suche nach der kürzesten rundreise, die n gegebene Städte genau einmal besucht, gehört zu den schwierigsten Problemen, für die bisher nur Lösungsverfahren mit exponentieller Rechenzeit bekannt sind. Verzweigen und beschränken: Rundreiseproblem.

Die folgende Problem klingt noch schwieriger. Gesucht ist der kürzeste Weg von Stadt A zu Stadt B, wobei für die n betrachteten Städte eine Entfernungsmatrix gegeben ist.

Dijkstras Algorithmus

Dieses Algorithmus wurde in 1959 von Dijkstra gefunden.

Kruskal

Joseph Kruskal auf Wikipedia

Übung

1. Geldwechsel (Euro)

Berechnen Sie schriftlich, wieviele Münzen heraugegeben werden müssen, um den Betrag 15,61 Euro auszuzahlen.

001eur.png 002eur.png 005eur.png 010eur.gif 020eur.gif 050eur.gif 1eur.gif 2eur.png

Überprüfen Sie das Ergebnis mit hilfe von der Prozedur geldwechsel.


2. Geldwechsel (US Dollar)

Berechnen Sie schriftlich, wieviele Münzen heraugegeben werden müssen, um den Betrag 15,61 US Dollar auszuzahlen.

Beachten Sie darauf, dass US Cents folgende Münzen haben:

150px-Formative_Years_in_Indiana_Reverse.jpg 150px-2006_Nickel_Proof_Rev.png 150px-2005_Dime_Rev_Unc_P.png 150px-2006_Quarter_Proof.png 150px-2005_Half_Dollar_Rev_Unc_P.png 150px-LineartPresRev.png

Überprüfen Sie das Ergebnis mit hilfe von der Prozedur geldwechsel.

Hinweis: die Kandidatenliste soll im Quellcode angepasst werden.

3. Geldwechsel (Polski Złoty)

Berechnen Sie schriftlich, wieviele Münzen heraugegeben werden müssen, um den Betrag 15,61 PLN auszuzahlen.

Beachten Sie darauf, dass Polski Złoty folgende Münzen hat:

1grosz_2.png 2grosze_2.png 5groszy_2.png 10groszy_2.png 20groszy_2.png 50groszy_2.png 1zloty_2.png 2zloty_2.png 5zlotych_2.png

Überprüfen Sie das Ergebnis mit hilfe von der Prozedur geldwechsel.

Hinweis: die Kandidatenliste soll im Quellcode angepasst werden.


Kommentare