1 / 64

Algorithm Engineering „Symbolische Suche“

Algorithm Engineering „Symbolische Suche“. Peter Kissmann. Spiele. Einpersonenspiele (n² - 1)-Puzzle Solitär Zweipersonenspiele Tic-Tac-Toe Clobber Vier Gewinnt. Motivation. Zustandsraumexplosion #erreichbare Zustände: (n²-1)-Puzzle: (n²)!/2 15-Puzzle: ≈ 10 13

tea
Download Presentation

Algorithm Engineering „Symbolische Suche“

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Algorithm Engineering „Symbolische Suche“ Peter Kissmann

  2. Spiele • Einpersonenspiele • (n² - 1)-Puzzle • Solitär • Zweipersonenspiele • Tic-Tac-Toe • Clobber • Vier Gewinnt

  3. Motivation • Zustandsraumexplosion • #erreichbare Zustände: • (n²-1)-Puzzle: (n²)!/2 • 15-Puzzle: ≈ 1013 • 24-Puzzle: ≈ 7,8 x 1024 • 35-Puzzle: ≈ 1,9 x 1041 • Solitär: 375 110 246 • Clobber (4x5): 26 787 440 • 4 Gewinnt: ≤ 70 728 639 995 483 (≈ 7 x 1013) (Allis, 1988) (tatsächlich: 4 531 985 219 092 (≈ 4,5 x 1012))

  4. Motivation • Speicher sparen z.B. mittels Binären Entscheidungsdiagrammen(BDDs) • verwalten Zustandsmengen • sparen unnötige Knoten ein → teils exponentiell viele • Beispiel: vollständiges Lösen von allgemeinen Spielen (General Game Playing)

  5. Überblick • Wiederholung: BDDs • BDD-basierte Suche • BFS, Dijkstra, A* • Anwendung auf allgemeine Spiele („General Game Playing“) • BDDs als perfekte Hash-Funktion

  6. Überblick • Wiederholung: BDDs • BDD-basierte Suche • BFS, Dijkstra, A* • Anwendung auf allgemeine Spiele („General Game Playing“) • BDDs als perfekte Hash-Funktion

  7. BDDs (Binary Decision Diagrams) • Repräsentieren Zustandsmenge • gerichteter azyklischer Graph von Wurzel zu 0- oder 1-Senke • Knoten für (binäre) Variablen • Zwei Ausgänge: low und high (auch 0 und 1) • Pfad von Wurzel bis 1-Senke • Zustand entsprechender Variablenbelegung in repräsentierter Menge enthalten

  8. OBDDs (Ordered BDDs) • Feste Variablenordnungπ • Gute Variablenordnung → exponentiellweniger Knoten (möglicherweise) • Finden guter Variablenordnung NP-schwer • Graphisch: Schichten gleicher Variablen

  9. ROBDDs (Reduced OBDDs) • Zwei Vereinfachungsregeln: • ROBDDs eindeutig • Im Folgenden nur ROBDDs x1 x1 x1 x2 x3 x2 x3

  10. x1 x1 x1 x1 x2 x2 x2 x2 0 1 0 1 0 1 0 1 BDDs für logische Operatoren

  11. ROBDDs (Beispiele) column-x row-x diagonal-x

  12. Überblick • Wiederholung: BDDs • BDD-basierte Suche • BFS, Dijkstra, A* • Anwendung auf allgemeine Spiele („General Game Playing“) • BDDs als perfekte Hash-Funktion

  13. BDD-basierte Suche (Voraussetzungen) • S Menge aller Zustände • InitialzustandI∈ S • Menge von ZielzuständenG⊆ S • Transitionsrelation T ⊆ S x S • beschreibt Zustandsübergänge durch Vorgänger und Nachfolger • mögliche Ziele: • finde kürzesten Pfad von I nach g ∈G • berechne alle erreichbaren Zustände • 2 Variablensätze: • x für Vorgängervariablen • x‘ für Nachfolgervariablen • in Variablenordnung xi und xi‘ abwechselnd (interleaved)

  14. BDD-basierte Suche • Finden von Nachfolgern (image) • Relationales Produkt: • Finden von Vorgängern (pre-image) analog: • zusätzlich: nach jedem (pre-)image: • Verschieben der Variablen

  15. BDD-basierte Suche • Partitionierte Berechnung: • T = VaTa für alle Aktionen a • ∃ und ∨kommutieren • (entsprechend auch für pre-image) • Vorteil: Berechnung monolithischer Transitionsrelation teuer (Zeit und Speicher)

  16. BDD-basierte Suche • Finden der Vorgänger, deren Nachfolger alle in s liegen (strong pre-image): • strong pre-image auf pre-image zurückführbar → Übungsaufgabe

  17. BDD-basierte Suche • image • pre-image • strong pre-image

  18. Überblick • Wiederholung: BDDs • BDD-basierte Suche • BFS, Dijkstra, A* • Anwendung auf allgemeine Spiele („General Game Playing“) • BDDs als perfekte Hash-Funktion

  19. Breitensuche (SBFS) • iterativ images berechnen • reach ←I • wiederhole • newBDD ← image(reach) ∧⌐reach • reach ← reach ∨ newBDD • solangeAbbruchkriterium nicht erfüllt • mögliche Abbruchkriterien: • newBDD =⊥ (alle Zustände bestimmt) • reach ∧ G ≠⊥ (kürzester Weg zum Ziel gefunden)

  20. Mögliche Verbesserung • Jeden Zustand nur einmalexpandieren (Duplikatserkennung) • Dazu: Closed-BDD • front ←I • wiederhole • closed ← closed ∨ front • front ← image(front) ∧⌐closed • solangeAbbruchkriterium nicht erfüllt

  21. Bestimmung erreichbarer Zustände mittels SBFS • v: Anzahl Variablen für einen Zustand • n: Anzahl BDD-Knoten zur Repräsentation aller Zustände • s: Anzahl aller erreichbarer Zustände

  22. Bestimmung erreichbarer Zustände in „Vier Gewinnt“ (SBFS)

  23. Bestimmung erreichbarer Zustände in „Vier Gewinnt“ (SBFS)

  24. Bidirektionale Breitensuche (SBBFS) Schnitt gefunden I G

  25. Bidirektionale Breitensuche (SBBFS) • BFS von Start und Ziel „gleichzeitig“ • Ende, wenn Suchfrontenüberschneiden • ffront ←I, bfront ←G • wiederhole • falls vorwärts • ffront ← image(ffront) • sonst • bfront ← pre-image(bfront) • solange ffront ∧ bfront =⊥ • Auswahlkriterium etwa Zeit der letzten Iteration • Verwendung von closed-BDDs möglich

  26. Symbolischer Dijkstra • BFS nur bei uniformen Kosten • Gewichtete Transitionsrelation → „Single Source Shortest Path“→Dijkstra • Kosten c ∈ {1, …, C} • T = VcTc

  27. Symbolischer Dijkstra • open0←I, closed ←⊥, g ← 0 • wiederhole • falls (openg∧G≠⊥) STOPP • openg← openg∧⌐closed • für c ← 1, …, C • openg+c← openg+c∨ imagec(openg) • closed ← closed ∨ openg • g ← g + 1

  28. Symbolisches A* (BDDA*) • Ähnlich Dijkstra; Expansion nach f-Wert: • Verwendung einer Heuristik • z.B. aus Musterdatenbank (pattern database (PDB)) • Heuristik h darf nichtüberschätzen (zulässig) • h = 0 → Dijkstra

  29. Symbolisches A* (BDDA*) h g

  30. Symbolisches A* (BDDA*) • open(0,h(I)) ←I, closed(0, …, |h|) ←⊥, f ← h(I) • wiederhole • für g ← 0, …, f • h ← f - g • falls (h = 0 & open(g, h) ∧G≠ ⊥) STOPP • open(g, h) ← open(g, h) ∧⌐ closed(h) • für c ← 1, …, C • succc← imagec(open(g, h)) • für hsucc← 0, …, |h| • open(g + c, hsucc) ← open(g + c, hsucc) ∨ (succc∧ hsucc) • closed(h) ← closed(h) ∨ open(g, h) • f← f + 1

  31. Überblick • Wiederholung: BDDs • BDD-basierte Suche • BDD-BFS, BDD-Dijkstra, BDDA* • Anwendung auf allgemeine Spiele („General Game Playing“) • BDDs als perfekte Hash-Funktion

  32. Überblick 2 (Lösen allgemeiner Spiele) • General Game Playing • Einpersonenspiele • Zweipersonenspiele • Zweipersonen-Nullsummenspiele • Zweipersonenspiele mit allgemeinen Gewinnen

  33. Überblick 2 (Lösen allgemeiner Spiele) • General Game Playing • Einpersonenspiele • Zweipersonenspiele • Zweipersonen-Nullsummenspiele • Zweipersonenspiele mit allgemeinen Gewinnen

  34. General Game Playing • Beschreibung für Spiele mit folgenden Eigenschaften: • endlich • diskret • deterministisch • vollständige Information • Spiele können • Ein- oder Mehr-Personenspiele sein • gleichzeitige oder abwechselnde Züge ermöglichen

  35. General Game Playing • „Game Description Language“ (GDL) • Gegeben: • Initialzustand • Bestimmung legaler Züge • Effekt eines Zuges • Terminierungsbedingungen • Verteilung der Gewinne {0, …, 100} darin • Gesucht: • Lösung erreichbarer Zustände • Bestimmung optimaler Gewinn-Verteilung

  36. General Game Playing • Beispiele: • Blocksworld • Original GDL-Datei: .kif • Tic-Tac-Toe • Original GDL-Datei: .kif • Mehr Informationen: • http://games.stanford.edu (dort entwickelt; leider veraltet) • http://www.general-game-playing.de • http://euklid.inf.tu-dresden.de:8180/ggpserver (aktuelle Spiele etc.)

  37. Überblick 2 (Lösen allgemeiner Spiele) • General Game Playing • Einpersonenspiele • Zweipersonenspiele • Zweipersonen-Nullsummenspiele • Zweipersonenspiele mit allgemeinen Gewinnen

  38. Lösen von Einpersonenspielen • Erst: Erreichbare Zustände finden (BFS) • Dann: Rückwärtssuche • Start: Zielzustände mit Gewinn 100 • BFS (rückwärts) • Weiter: Zielzustände mit Gewinn 99 • BFS (rückwärts) • dabei: bereits gelöste Zustände auslassen • Weiter bis Gewinn 0

  39. 99 80 75 100 90 80 75 Lösen von Einpersonenspielen 100 100 100 90 80 100 90 80 75

  40. Ergebnisse für Solitär • Erreichbar: 375 110 246 Zustände

  41. Überblick 2 (Lösen allgemeiner Spiele) • General Game Playing • Einpersonenspiele • Zweipersonenspiele • Zweipersonen-Nullsummenspiele • Zweipersonenspiele mit allgemeinen Gewinnen

  42. Lösen von Zweipersonen-Nullsummenspielen • Mögliche Gewinne: 0, 50, 100 • Jeder Spieler versucht, möglichst hohen Gewinn zu erreichen • Lösung liefert Verteilung der Gewinne (bei optimaler Spielweise)

  43. player 0‘s turn player 1‘s turn lost for player 0 lost for player 1 Lösen von Zweipersonen-Nullsummenspielen • BFS für Finden erreichbarer Zustände • ZweiRückwärtssuchen (eine pro Spieler): • Start bei verlorenen Zielzuständen • Bestimmung verlorener Vorgänger (2 Schritte) • für alle Züge, die Spieler durchführen kann, kann Gegenspieler Zug zu verlorenem Zustand wählen (pre-image und strong pre-image) • Iterieren, solange neue Zustände gefunden

  44. Lösen von Zweipersonen-Nullsummenspielen • reach ← berechneErreichbareZustände() • für jeden Spieler p ∈ {0, 1} • front ← verlorenp← reach ∧ gewinn(p, 0) ∧G∧ zugp • gewonnen1-p← reach ∧ gewinn(p, 0) ∧G∧ zug1-p • wiederhole • pred ← pre-image(front) ∧ reach • gewonnen1-p← gewonnen1-p∨ pred • front ← strong-pre-image(gewonnen1-p) ∧ reach ∧⌐verlorenp • verlorenp← verlorenp∨ front • solange front ≠⊥

  45. Überblick 2 (Lösen allgemeiner Spiele) • General Game Playing • Einpersonenspiele • Zweipersonenspiele • Zweipersonen-Nullsummenspiele • Zweipersonenspiele mit allgemeinen Gewinnen

  46. Lösen allgemeiner Zweipersonenspiele • Mögliche Gewinne ∈ {0, …, 100} • Verwendung von (101 x 101)-Matrix • Zustand an Position (i, j): • i Punkte für Spieler 0 • j Punkte für Spieler 1 • falls unvollständig, Verwendung als Endspieldatenbank

  47. Lösen allgemeiner Zweipersonenspiele • Eine Vorwärts- und eine Rückwärtssuche • finde alle Vorgänger, deren Nachfolger alle gelöst sind (strong pre-image) • finde optimales Bucket für diese (pre-image) • füge sie ein • iteriere, bis alle Zustände gelöst

  48. own own 0 0 … … 100 100 0 0 … … opponent opponent 100 100 Einschub: Reihenfolge beim Lösen • schwierig im allgemeinen Fall • eigenen Gewinn maximieren (und gegnerischen minimieren)? • oder Differenz zum gegnerischen Gewinn maximieren? • Hier: 2. Fall

  49. 0/1 player 0 0 1 2 3 0 0/1 0/3 0/1 1 player 1 0/1 0/3 0/1 2/0 2 3 2/0 2/0 0/3 player 0‘s turn 2/0 0/1 0/1 player 1‘s turn 0/1 3/1 3/1 3/1 0/1 3/1 3/1 0/1 3/1 Beispiel

  50. Lösen allgemeiner Zweipersonenspiele • reach ← berechneErreichbareZustände() • init matrix; solved ← alle Zustände in Matrix • unsolved ← reach ∧⌐solved • solange unsolved ≠⊥ • für jeden Spieler p ∈ {0, 1} • solvable ← strong-pre-image(solved) ∧ unsolved ∧ zugp • falls solvable ≠ ⊥ • matrix ← fügeZuständeEin(solvable, p, matrix) • solved ← solved ∨ solvable • unsolved ← unsolved ∧⌐solvable

More Related