17.09.2013 Aufrufe

5 Entwurfsmethoden für Algorithmen

5 Entwurfsmethoden für Algorithmen

5 Entwurfsmethoden für Algorithmen

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

Beispiel 5.2.1 (Aufzählungsbaum <strong>für</strong> das 8er Puzzle). Als weiteres Beispiel <strong>für</strong> die Darstellung<br />

des Lösungsraums eines Problems durch einen Aufzählungsbaum betrachten wir das 8er Puzzle:<br />

8 7 1 2 3<br />

4 3 5<br />

4 5 6<br />

1 6 2 7 8<br />

Wir starten mit einer Anfangskonfiguration, in dem 8 Plättchen, die von 1 bis 8 numeriert sind<br />

auf einem 3 × 3-Spielfeld angeordnet sind. Zugmöglichkeiten bestehen immer nur darin, eines<br />

der Plättchen, welches dem leeren Feld benachbart ist, auf das leere Feld zu verschieben. Gesucht<br />

ist eine Zugfolge, welche die Anfangskonfiguration in die Zielkonfiguration, in der die<br />

Plättchen – wie oben skizziert – sortiert sind, überführt.<br />

Zunächst handelt es sich hierbei um ein Erreichbarkeitsproblem in einem Graphen, dessen Knoten<br />

die Konfigurationen und Kanten die jeweiligen Zugmöglichkeiten sind. Für das 8er Puzzle<br />

hat man es mit einem Graphen mit rund 9! = 362.880 Knoten zu tun. Wesentlich dramatischer<br />

ist die Situation beim 15-Puzzle, bei dem ein Graph mit ca. 16! ≈ 20.9 ∗ 10 12 Knoten zu untersuchen<br />

ist. Geht man davon aus, daß 10 8 Knoten pro Sekunde erzeugt werden können, muß<br />

man sich immer noch ca. 40 Tage gedulden bis sämtliche Knoten generiert wurden. Offenbar<br />

benötigt man hierzu (sowie <strong>für</strong> das (n 2 − 1)er Puzzle mit n ≥ 6) einige zusätzlichen Tricks,<br />

welche die Suche nach einem Pfad zur Zielkonfiguration beschleunigen. Mehr dazu später.<br />

Der Aufzählungsbaum <strong>für</strong> das (n 2 − 1)er Puzzle ergibt sich durch “Abwickeln” des Konfigurationsgraphen<br />

in einen Baum. Die Wurzel steht <strong>für</strong> die Anfangskonfiguration, jeder andere Knoten<br />

<strong>für</strong> eine Zugfolge, die intuitiv mit der letzten Konfiguration identifiziert werden kann. Die<br />

Blätter stehen <strong>für</strong> die (Pfade zur) Zielkonfiguration und stellen somit die Lösungen dar. Man beachte,<br />

dass der Aufzählungsbaum unendlich ist, sofern nicht die Einschränkung gemacht wird,<br />

daß jede Konfiguration höchstens einmal “besucht” werden darf. <br />

Das Konzept von Aufzählungsbäumen dient lediglich der Anschauung. Für ein gegebenes Problem<br />

kann es sehr viele völlig verschiedene Aufzählungsbäume geben. Diese dienen nur als<br />

gedankliche Hilfestellung <strong>für</strong> den Entwurf (und die Analyse) eines Backtracking oder Branch<br />

& Bound Algorithmus. Letztendlich wird der Aufzählungsbaum nicht explizit konstruiert. Die<br />

prinzipielle Vorgehensweise von Backtracking besteht darin, die Knoten dynamisch im Preorder-<br />

Prinzip zu generieren und nur solche Knoten zu expandieren (d.h. deren Teilbäume zu erzeugen),<br />

<strong>für</strong> die gewisse Randbedingungen erfüllt sind. Die komplette Analyse des Aufzählungsbaums<br />

würde dagegen einem naiven Algorithmus, der “alle Möglichkeiten ausprobiert”, entsprechen.<br />

Auch das “Generieren” der Knoten des Aufzählungsbaums ist bildlich zu verstehen. Tatsächlich<br />

genügt es oftmals, nur die letzte Komponente xn eines Knotens x = 〈x1,...,xn〉 darzustellen.<br />

Die vorangegangenen Komponenten xi, i = n − 1,n − 2,...,1, ergeben sich aus dem “inversen<br />

Weg” von dem Knoten x zur Wurzel. Branch & Bound zielt darauf ab, große Teile des Aufzählungsbaums<br />

einzusparen (d.h. gar nicht erst zu generieren). Dies wird durch den Einsatz<br />

von Heuristiken erreicht, welche die Reihenfolge festlegen, in welcher die Knoten expandiert<br />

werden.<br />

167

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!