Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
Veröffentlicht von:Susanne Bludau Geändert vor über 10 Jahren
1
Algorithm Engineering „Symbolische Suche“
Peter Kissmann
2
Spiele Einpersonenspiele Zweipersonenspiele (n² - 1)-Puzzle Solitär
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: Clobber (4x5): 4 Gewinnt: ≤ (≈ 7 x 1013) (Allis, 1988) (tatsächlich: (≈ 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 → exponentiell weniger 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
BDDs für logische Operatoren
x1 x2 1 x1 x2 1 x1 1 x1 x2 1
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 Initialzustand I ∈ S Menge von Zielzuständen G ⊆ 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 strong pre-image image 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 solange Abbruchkriterium 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 einmal expandieren (Duplikatserkennung) Dazu: Closed-BDD front ← I wiederhole closed ← closed ∨ front front ← image(front) ∧ ⌐closed solange Abbruchkriterium 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*)
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: Mehr Informationen: Blocksworld
Original GDL-Datei: .kif Tic-Tac-Toe Mehr Informationen: (dort entwickelt; leider veraltet) (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 dabei: bereits gelöste Zustände auslassen Weiter bis Gewinn 0
39
Lösen von Einpersonenspielen
75 100 90 80 99 100 100 100 90 80 100 90 80 75
40
Ergebnisse für Solitär
Erreichbar: 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
Lösen von Zweipersonen-Nullsummenspielen
BFS für Finden erreichbarer Zustände Zwei Rü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 player 0‘s turn player 1‘s turn lost for player 0 lost for player 1
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
Einschub: Reihenfolge beim Lösen
own 100 opponent … schwierig im allgemeinen Fall eigenen Gewinn maximieren (und gegnerischen minimieren)? oder Differenz zum gegnerischen Gewinn maximieren? Hier: 2. Fall own 100 opponent …
49
Beispiel player 0‘s turn player 1‘s turn player 0 player 1 1 2 3 0/1
1 2 3 0/1 0/1 0/3 0/1 0/1 3/1 0/3 0/1 2/0 0/1 3/1 0/1 0/3 2/0 0/1 2/0 3/1 0/1 3/1 player 0‘s turn player 1‘s turn 0/1 3/1 2/0 3/1
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
51
Ergebnisse Game t0-sum tnew Clobber 3x4 - 1.1s Clobber 3x4 0-sum 1.0s
2:14:20 Clobber 4x5 0-sum 0:54:35 1:22:09 Minichess 0.7s TicTacToe 0.1s 0.2s Nim 40 0.0s
52
Überblick Wiederholung: BDDs BDD-basierte Suche
BDD-BFS, BDD-Dijkstra, BDDA* Anwendung auf allgemeine Spiele („General Game Playing“) BDDs als perfekte Hash-Funktion
53
Hashing Gegeben: Menge von Zuständen S Gesucht: Abbildung S → R ⊆ ℕ
Hashfunktion ordnet jedem Zustand einen Wert zu perfektes Hashing: Hashwert jedes Zustandes eindeutig minimales perfektes Hashing: |R| = |S|
54
Sat-Count Anzahl gespeicherter Zustände in BDD G mögliche Berechnung:
sat-count(0-Senke) ← 0, sat-count(1-Senke) ← 1 für Knoten v aus Schicht i mit 0-Nachfolger u in Schicht j > i und 1-Nachfolger w in Schicht k > i sat-count(v) ← 2j-i-1 * sat-count(u) + 2k-i-1 * sat-count(w) falls Wurzel in Schicht i: sat-count(G) ← 2i-1 * sat-count(Wurzel) Laufzeit- und Speicherbedarf: ≤ O(|G|)
55
Sat-Count (Beispiel) 1 30 14 16 4 2 2 5 3 1 1 2 1 abgedeckte Zustände:
1 30 abgedeckte Zustände: 000001 000111 001011 001101 010011 010100 010101 010110 010111 011011 011100 011101 011110 011111 100011 100100 100101 100110 100111 101011 101100 101101 101110 101111 110010 110011 110111 111010 111011 111111 14 16 4 2 2 5 3 1 1 2 1
56
Ranking Gegeben: BDD G, Zustand s
Gesucht: Hash-Wert von s (in {0, …, sat-count(G) - 1}) Vorverarbeitung: Berechne Sat-Count aller Knoten speichere diese Sat-Counts
57
Ranking rank(G,s) falls Wurzel in Schicht i
d ← Binärwert von (s1, …, si-1) gib (d+1) * lexicographic-count(G,s,Wurzel) - 1 zurück
58
Ranking lexicographic-count(G,s,v)
falls v 0-Senke, gib 0 zurück; falls v 1-Senke, gib 1 zurück falls v in Schicht i mit 0-Nachf. u in j und 1-Nachf. w in k falls si = 0 r0 ← lexicographic-count(G,s,u) d0 ← Binärwert von (si+1, …, sj-1) gib d0 * sat-count(u) + r0 zurück falls si = 1 r1 ← lexicographic-count(G,s,w) d1 ← Binärwert von (si+1, …, sk-1) gib 2j-i-1 * sat-count(u) + d1 * sat-count(w) + r1 zurück
59
Ranking (Beispiel) 1 30 16 14 4 3 5 2 v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 s ← rank(G,s) ← [()2 + 1] * lc(G,s,v0) - 1 lc(G,s,v0) ← ()2 * sc(v1) + lc(G,s,v1) lc(G,s,v1) ← * sc(v3) + (1)2 * sc(v6) + lc(G,s,v6) lc(G,s,v6) ← * sc(v9) + (01)2 * sc(v13) + lc(G,s,v13) v13 ist 1-Senke → lc(G,s,v13) ← 1 lc(G,s,v6) ← 20 * sc(v9) + 1 * sc(v13) + lc(G,s,v13) = 1 * * = 3 lc(G,s,v1) ← 20 * sc(v3) + 1 * sc(v6) + lc(G,s,v6) = 1 * * = 12 lc(G,s,v0) ← 0 * sc(v1) + lc(G,s,v1) = 12 rank(G,s) ← 1 * lc(G,s,v0) - 1 = 11
60
Unranking Gegeben: BDD G, Hash-Wert r Gesucht: zugehöriger Zustand
61
Unranking unrank(G,r) starte an der Wurzel falls Wurzel in Schicht l
(s1, …, sl-1) ← Binärrepräsentation von r div sat-count(Wurzel) r ← r mod sat-count(Wurzel) v ← Wurzel; i ← l wiederhole, bis v 0- oder 1-Senke falls v Knoten in Schicht i mit 0-Nachf. u in j 1-Nachf. w in k falls r < 2j-i-1 * sat-count(u) si ← 0; (si+1, …, sj-1) ← Binärrepräsentation von r div sat-count(u) r ← r mod sat-count(u) v ← u; i ← j falls r ≥ 2j-i-1 * sat-count(u) si ← 1; r ← r - 2j-i-1 * sat-count(u) (si+1, …, sk-1) ← Binärrepräsentation von r div sat-count(w) r ← r mod sat-count(w) v ← w; i ← k
62
Unranking (Beispiel) 1 30 16 14 4 3 5 2 s ← 1010 s ← 10101 s ← 101011
1 30 16 14 4 3 5 2 v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 r ← 19 i ← 1; r ≥ * sc(v1) = 1 * 14 = 14 s1 ← 1; r ← r * sc(v1) = * 14 = 5 r ← r mod sc(v2) = 5 mod 16 = 5 i ← 2; r < * sc(v6) = 2 * 5 = 10 s2 ← 0; (s3) ← (r div sc(v6))2 = (5 div 5)2 = 12 = 1 r ← r mod sc(v6) = 5 mod 5 = 0 i ← 4; r < * sc(v9) = 1 * 1 = 1 s4 ← 0; r ← r mod sc(v9) = 0 mod 1 = 0 i ← 5; r ≥ * sc(v12) = 2 * 0 = 0 s5 ← 1; r ← r * sc(v12) = * 0 = 0 r ← r mod sc(v11) = 0 mod 1 = 0 i ← 6; r ≥ * sc(v12) = 1 * 0 = 0 s6 ← 1; r ← r * sc(v12) = * 0 = 0 r ← r mod sc(v13) = 0 mod 1 = 0
63
Ranking und Unranking (Analyse)
Vorverarbeitung: O(|G|) Ranking pro Zustand: O(n) Unranking pro Zustand: O(n) Vorverarbeitung beschriftet jeden Knoten mit n-bit Zahl → O(n|G|) extra Bits nötig
64
Zusammenfassung Symbolische Suche zur Verringerung der Speicherlast
speichern von Zustandsmengen (als BDDs) statt einzelner Zustände Vorgänger- und Nachfolgerberechnungen (image und pre-image) liefern direkt SBFS und SBBFS Symbolische Formen von Dijkstra und A* Lösen von Spielen mittels symbolischer Suche BDDs als perfekte Hash-Funktion
Ähnliche Präsentationen
© 2024 SlidePlayer.org Inc.
All rights reserved.