INTA - Übungsblatt 2. Pflichtabgabe bis zum 21.11. (Dienstag). Tragen sie ihre Lösungen auf diesem Blatt ein und geben dieses ab! Aufgabe 4 (A∗ -Heuristiken). Eine admissible Heuristik h für den A∗ ist konsistent, wenn die Dreiecksungleichung wie folgt erfüllt ist: Für alle Knoten n gilt die folgende Beziehung für alle ihre Nachfolgerknoten n’: h(n) ≤ h(n0 )+c(n, n0 ). Hierbei gibt c(n, n0 ) die Kosten für einen Schritt von Knoten n zum Knoten n0 an (beide repräsentieren ja benachbarte Zustände des Problemraums, die Info zu den Schrittkosten entsprechen den Kosten für den Schritt zwischen den Zuständen im Problemraum). Erläuterung: Diese Konsistenzbedingung ist durchaus sinnig! Wenn sie z.B. eine Schätzung für n von 15 haben und die Schrittkosten zu n0 5 betragen, dann macht es keinen Sinn, eine Schätzung von 8 für n0 zuzulassen – die ursprüngliche Schätzung für n muß bereits mindestens so genau sein (unter der hier sinnvollen Voraussetzung, dass h admissible ist), wie die Schätzung, die sich aus 8 + 5 = 13 für n ergeben würde. Umgekehrt muß also die Schätzung für n0 schlechter sein, als wir aus den bereits bekannten Informationen ableiten können: wir wissen, dass der Weg von n zum Ziel nicht billiger sein kann, als 15 (weil h admissible ist), außerdem wissen wir, dass es 5 kostet, um von n nach n0 zu kommen – n0 kann also bestenfalls 5 Kosteneinheiten näher am Ziel sein, als n, also kann es nicht kürzer als 15 − 5 = 10 von n0 zum Ziel sein (wohl aber noch deutlich teuer, wenn nämlich die Schätzung für n nicht besonders gut war...). Ihre Aufgabe ist es, eine Funktion h für die Problemstellung auf dem ersten Übungsblatt (Aufgabe 1–3) anzugeben, die zwar admissible, aber nicht konsistent ist. Extrapunkte gibt es, wenn ihre heuristischen Werte den A∗ , wenn er auf Wiederholungen achtet, in die Irre führen! Aufgabe 5 (Alternative Algorithmen zu A∗ ). Geben sie die resultierende Knoten-Besuchs-Sequenz für einen der Algorithmen IDA∗ (Folie 18 in den Freiburger Folien zu informierter Suche) oder RBFS (Folie 19 ebenda) an. Beziehen sie sich dabei auf den Suchbaum auf Folie 12 der Lösungshinweise zum Blatt 1, verwenden sie insbesondere die angegebenen Knotenbezeichnungen. Welchen Algorithmus haben sie verwendet? ______ K0, Hinweis: Beide Algorithmen suchen natürlich nur nach einer (genauer: der optimalen) Lösung! Die Algorithmen finden sie auch in Kap. 4 von Russell/Norvig. 1 Aufgabe 6 (Branch-and-Bound). Betrachten Sie das 0-1-Rucksack-Problem: Sie haben eine Menge G = {1, ..., n} von Gegenständen i, die ein Gewicht w(i) und einen Wert v(i) haben. Sie haben außerdem einen Rucksack R mit einer maximalen Aufnahmekapazität von wmax . Sie wollen nun P eine Teilmenge S ⊆ G der Gegenstände so auswählen, dass sie (1) P gemeinsam in den Rucksack passen, also s∈S w(s) ≤ wmax , und (2) den Wert des Rucksacks, also v(R) = s∈S v(s), über alle möglichen Auswahlen von Teilmengen von G maximieren. Eine generelle Vorgehensweise ist das sogenannte Branch-and-Bound. Die Grundidee ist, dass man zwar im Prinzip alle möglichen Kombinationen von Gegenständen überprüft, aber so früh wie möglich Kombinationen und ihre “Nachfolger” außer acht läßt, wenn man weiß, dass keine Verbesserung eintreten kann oder sie ohnehin ungültig sein werden. Im Detail wird wie folgt vorgegangen: wir bauen einen Entscheidungsbaum. Auf jeder Ebene entscheiden wir darüber, ob ein Gegenstand in den Rucksack aufgenommen wird oder eben nicht. Gegenstand Gewicht Wert 1 10 60 2 20 100 3 30 115 Mit diesem Beispiel (wmax ist übrigens 50) ergibt sich ein Baum “denkbarer” Kombinationen, s. unten. Jetzt bewerten wir jeden Knoten mit zwei Zahlen: (1) Die erste Zahl gibt an, wieviel an Wert wir noch erreichen können, wenn wir unterstellen, dass wir alle Gegenstände, die wir noch nicht angeschaut haben, noch aufnehmen werden (dabei ignorieren wir die Kapazitätsbeschränkung!). (2) Die zweite Zahl gibt an, wieviel an Kapazität noch zur Verfügung steht. K0:Leer [275,50] (Ja) | (Nein) Gegenstand 1? ----------------------------------| | K1:{1} [275,40] K2:Leer [215,50] (Ja) | (Nein) (Ja) | (Nein) Gegenstand 2? --------------------------------| | | | K3:{1,2} [275,20] K4:{1} [ ] K5:{2} [ ] K6:Leer [ ] J | N J | N J | N J | N Gegenstand 3? -------------------------------------| | | | | | | | K7:{1,2,3} K8:{1,2} K9:{1,3} K10:{1} K11:{2,3} K12:{2} K13:{3} K14:Leer [ ] [160,20] [ ] [ ] [ ] [ ] [ ] [ ] Zu Beginn können wir “theoretisch” noch alle Gegenstände einpacken, also insgesamt 275 an Wert für den Rucksack realisieren. Wir haben zudem noch wmax = 50 an Kapazität zur Verfügung. Schauen wir uns zunächst die erste Entscheidung an. Wenn wir Gegenstand 1 aufnehmen, dann haben wir bereits 60 an Wert realisiert und weitere 215 können wir bestenfalls noch hinzunehmen, also bleibt unsere Grenze des größten noch erreichbaren Wertes für diesen Knoten des Baumes bei 275. Die (Rest-)Kapazität hingegen haben wir durch die Aufnahme von Gegenstand 1 um 10 reduziert (verbleiben also 40). Wenn wir uns gegen die Aufnahme von Gegenstand 1 entscheiden, dann lassen wir einen Wert von 60 aus dem Rucksack heraus, wir können also höchstens noch 215 realisieren. Dafür verbleibt uns aber noch die volle Kapazität. Mit der gleichen Logik können wir die restlichen Knoten bewerten. Tun Sie das oben direkt im Baum! 2 An den Bewertungen auf unterster Ebene (die Blätter) können wir direkt den realisierten Wert der repräsentierten Kombination ablesen. Außerdem können wir erkennen, ob die Kombination überhaupt zulässig ist (die Restkapazität darf nicht negativ sein). Das macht natürlich immer noch fürchterlich viel Mühe, weil wir alle Knoten bewerten müssen! Wieviele Knoten (inkl. Blätter!) gibt es, wenn es n Gegenstände gibt? _____ Aber: Wir können Teile des Baumes abschneiden! (d.h., wenn wir den Baum nach und nach generieren, dann werden wir diese Bereiche nie besuchen!) Hierzu können wir zwei Regeln verwenden: 1. Wenn ein Knoten eine negative Kapazität aufweist, dann brauchen wir ihn nicht weiter zu betrachten. Auch alle seine Kinder sind uninteressant, denn auch sie hätten negative Kapazität! (Weil unser Beispiel so klein ist, ist das hier eher unspannend). 2. Angenommen, wir würden den Wert l einer ersten halbwegs ordentlichen Lösung kennen. Wenn die obere Grenze des erreichbaren Wertes eines Knotens k nicht größer ist als l, dann ist dieser Knoten (und alle seine Kinder!) uninteressant (und wir können den Baum “beschneiden”). Welche Expansionsreihenfolge ergibt sich nun, wenn wir mit dem Wurzelknoten beginnen, und dann jeweils den momentan vielversprechendsten Knoten zuerst expandieren (und dabei die erste Regel beachten) und dessen Kinder in eine PQueue, also eine geordnete Liste, einstellen. Bedenken Sie: Knoten werden nur expandiert, wenn ihr “Wert” (also der bestenfalls noch erreichbare Wert) größer als die aktuelle Grenze ist. Vergessen sie bei ihrem Vorgehen nicht die Knoten, die sie schon eingestellt haben! Die Grenze werden wir mit 0 beginnen und jeweils anpassen, wenn wir ein Blatt mit nicht-negativer Restkapazität finden, dessen Wert größer ist, als die momentane Grenze. Lösung: (setzen sie die Liste fort) K0, K , 3 Aufgabe 7 (Alpha-Beta-Search). Betrachten sie folgenden kleinen Spielbaum. Tragen Sie zunächst die Bewertungen ein, die sich aus dem MinMaxAlgo für die inneren Knoten ergeben würden. Streichen Sie dann diejenigen Blätter bzw. Knoten, die sie bei optimaler Vorgehensreihenfolge bei der AlphaBeta-Suche streichen könnten. Optional: Tragen sie die Alpha und Beta-Werte (initialisiert auf minus bzw. plus ∞ zu Beginn), die beim Aufruf der inneren Knoten bei der oben gefundenen Reihenfolge gelten, neben den Knoten ein (links den Alpha-Wert, rechts den Beta-Wert). Folgen sie dabei dem Algorithmus auf Seite 21 des Foliensatzes Games. Max: [ ] | -------------------------------------| | Min: [ ] [ ] | | --------------------------------------| | | | Max: [ ] [ ] [ ] [ ] | | | | --------------------------------------| | | | | | | | Min: [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] | | | | | | | | --------------------------------------| | | | | | | | | | | | | | | | | | | | | | | | | | | 6 5 3 2 3 3 3 3 4 5 6 8 9 2 8 1 3 4 2 2 3 4 7 5 9 3 1 4