640 likes | 743 Views
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
E N D
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: ≈ 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))
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)
Überblick • Wiederholung: BDDs • BDD-basierte Suche • BFS, Dijkstra, A* • Anwendung auf allgemeine Spiele („General Game Playing“) • BDDs als perfekte Hash-Funktion
Überblick • Wiederholung: BDDs • BDD-basierte Suche • BFS, Dijkstra, A* • Anwendung auf allgemeine Spiele („General Game Playing“) • BDDs als perfekte Hash-Funktion
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
OBDDs (Ordered BDDs) • Feste Variablenordnungπ • Gute Variablenordnung → exponentiellweniger Knoten (möglicherweise) • Finden guter Variablenordnung NP-schwer • Graphisch: Schichten gleicher Variablen
ROBDDs (Reduced OBDDs) • Zwei Vereinfachungsregeln: • ROBDDs eindeutig • Im Folgenden nur ROBDDs x1 x1 x1 x2 x3 x2 x3
x1 x1 x1 x1 x2 x2 x2 x2 0 1 0 1 0 1 0 1 BDDs für logische Operatoren
ROBDDs (Beispiele) column-x row-x diagonal-x
Überblick • Wiederholung: BDDs • BDD-basierte Suche • BFS, Dijkstra, A* • Anwendung auf allgemeine Spiele („General Game Playing“) • BDDs als perfekte Hash-Funktion
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)
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
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)
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
BDD-basierte Suche • image • pre-image • strong pre-image
Überblick • Wiederholung: BDDs • BDD-basierte Suche • BFS, Dijkstra, A* • Anwendung auf allgemeine Spiele („General Game Playing“) • BDDs als perfekte Hash-Funktion
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)
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
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
Bidirektionale Breitensuche (SBBFS) Schnitt gefunden I G
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
Symbolischer Dijkstra • BFS nur bei uniformen Kosten • Gewichtete Transitionsrelation → „Single Source Shortest Path“→Dijkstra • Kosten c ∈ {1, …, C} • T = VcTc
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
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
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
Überblick • Wiederholung: BDDs • BDD-basierte Suche • BDD-BFS, BDD-Dijkstra, BDDA* • Anwendung auf allgemeine Spiele („General Game Playing“) • BDDs als perfekte Hash-Funktion
Überblick 2 (Lösen allgemeiner Spiele) • General Game Playing • Einpersonenspiele • Zweipersonenspiele • Zweipersonen-Nullsummenspiele • Zweipersonenspiele mit allgemeinen Gewinnen
Überblick 2 (Lösen allgemeiner Spiele) • General Game Playing • Einpersonenspiele • Zweipersonenspiele • Zweipersonen-Nullsummenspiele • Zweipersonenspiele mit allgemeinen Gewinnen
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
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
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.)
Überblick 2 (Lösen allgemeiner Spiele) • General Game Playing • Einpersonenspiele • Zweipersonenspiele • Zweipersonen-Nullsummenspiele • Zweipersonenspiele mit allgemeinen Gewinnen
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
99 80 75 100 90 80 75 Lösen von Einpersonenspielen 100 100 100 90 80 100 90 80 75
Ergebnisse für Solitär • Erreichbar: 375 110 246 Zustände
Überblick 2 (Lösen allgemeiner Spiele) • General Game Playing • Einpersonenspiele • Zweipersonenspiele • Zweipersonen-Nullsummenspiele • Zweipersonenspiele mit allgemeinen Gewinnen
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)
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
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 ≠⊥
Überblick 2 (Lösen allgemeiner Spiele) • General Game Playing • Einpersonenspiele • Zweipersonenspiele • Zweipersonen-Nullsummenspiele • Zweipersonenspiele mit allgemeinen Gewinnen
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
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
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
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
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