Algorithm Engineering „Symbolische Suche“
description
Transcript of Algorithm Engineering „Symbolische Suche“
![Page 1: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/1.jpg)
Algorithm Engineering „Symbolische Suche“
Peter Kissmann
![Page 2: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/2.jpg)
Spiele
Einpersonenspiele(n² - 1)-PuzzleSolitär
ZweipersonenspieleTic-Tac-ToeClobberVier Gewinnt
![Page 3: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/3.jpg)
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))
![Page 4: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/4.jpg)
Motivation
Speicher sparen z.B. mittels Binären Entscheidungsdiagrammen (BDDs)
verwalten Zustandsmengensparen unnötige Knoten ein → teils exponentiell viele
Beispiel: vollständiges Lösen von allgemeinen Spielen (General Game Playing)
![Page 5: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/5.jpg)
Überblick
Wiederholung: BDDs BDD-basierte Suche BFS, Dijkstra, A* Anwendung auf allgemeine Spiele („General Game
Playing“) BDDs als perfekte Hash-Funktion
![Page 6: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/6.jpg)
Überblick
Wiederholung: BDDs BDD-basierte Suche BFS, Dijkstra, A* Anwendung auf allgemeine Spiele („General Game
Playing“) BDDs als perfekte Hash-Funktion
![Page 7: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/7.jpg)
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-SenkeZustand entsprechender Variablenbelegung in repräsentierter Menge
enthalten
![Page 8: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/8.jpg)
OBDDs (Ordered BDDs)
Feste Variablenordnung πGute Variablenordnung → exponentiell weniger Knoten
(möglicherweise)Finden guter Variablenordnung NP-schwer
Graphisch: Schichten gleicher Variablen
![Page 9: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/9.jpg)
ROBDDs (Reduced OBDDs)
Zwei Vereinfachungsregeln:
ROBDDs eindeutig Im Folgenden nur ROBDDs
x1 x1 x1
x2 x3 x3x2
![Page 10: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/10.jpg)
BDDs für logische Operatoren
x1
x2
0 1
21 xx
x1
x2
0 1
21 xx
x1
0 1
1x
x1
x2 x2
0 1
21 xx
![Page 11: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/11.jpg)
ROBDDs (Beispiele)column-x
row-x
diagonal-x
![Page 12: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/12.jpg)
Überblick
Wiederholung: BDDs BDD-basierte Suche BFS, Dijkstra, A* Anwendung auf allgemeine Spiele („General Game
Playing“) BDDs als perfekte Hash-Funktion
![Page 13: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/13.jpg)
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 ∈ Gberechne alle erreichbaren Zustände
2 Variablensätze:x für Vorgängervariablenx‘ für Nachfolgervariablen
in Variablenordnung xi und xi‘ abwechselnd (interleaved)
![Page 14: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/14.jpg)
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
xsxxTxsimage ',.
'','. xsxxTxspreimage
![Page 15: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/15.jpg)
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)
xsxxTxsimage aa ',.
![Page 16: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/16.jpg)
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 '','._ xsxxTxspreimagestrong
![Page 17: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/17.jpg)
BDD-basierte Suche
image pre-image strong pre-image
![Page 18: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/18.jpg)
Überblick
Wiederholung: BDDs BDD-basierte Suche BFS, Dijkstra, A* Anwendung auf allgemeine Spiele („General Game
Playing“) BDDs als perfekte Hash-Funktion
![Page 19: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/19.jpg)
Breitensuche (SBFS)
iterativ images berechnenreach ← Iwiederhole
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)
![Page 20: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/20.jpg)
Mögliche Verbesserung
Jeden Zustand nur einmal expandieren (Duplikatserkennung)
Dazu: Closed-BDDfront ← Iwiederhole
closed ← closed ∨ front front ← image(front) ∧ ⌐closed
solange Abbruchkriterium nicht erfüllt
![Page 21: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/21.jpg)
Bestimmung erreichbarer Zustände mittels SBFS
v: Anzahl Variablen für einen Zustandn: Anzahl BDD-Knoten zur Repräsentation aller
Zuständes: Anzahl aller erreichbarer Zustände
![Page 22: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/22.jpg)
Bestimmung erreichbarer Zustände in „Vier Gewinnt“ (SBFS)
![Page 23: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/23.jpg)
Bestimmung erreichbarer Zustände in „Vier Gewinnt“ (SBFS)
1E+00
1E+01
1E+02
1E+03
1E+04
1E+05
1E+06
1E+07
1E+08
1E+09
1E+10
1E+11
1E+12
1E+13
0 5 10 15 20 25 30 35 40
Knoten (BDD)Zustände (BDD)
Zustände (Allis-Schätzung)
![Page 24: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/24.jpg)
Bidirektionale Breitensuche (SBBFS)
I
G
Schnittgefunden
![Page 25: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/25.jpg)
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 IterationVerwendung von closed-BDDs möglich
![Page 26: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/26.jpg)
Symbolischer Dijkstra
BFS nur bei uniformen Kosten Gewichtete Transitionsrelation → „Single Source Shortest
Path“→ DijkstraKosten c ∈ {1, …, C}T = VcTc
![Page 27: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/27.jpg)
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
![Page 28: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/28.jpg)
Symbolisches A* (BDDA*)
Ähnlich Dijkstra; Expansion nach f-Wert:
Verwendung einer Heuristikz.B. aus Musterdatenbank (pattern database (PDB))Heuristik h darf nicht überschätzen (zulässig)
h = 0 → Dijkstra
vhvgvf
![Page 29: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/29.jpg)
Symbolisches A* (BDDA*)
h
g
![Page 30: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/30.jpg)
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
![Page 31: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/31.jpg)
Überblick
Wiederholung: BDDs BDD-basierte Suche BDD-BFS, BDD-Dijkstra, BDDA* Anwendung auf allgemeine Spiele („General Game
Playing“) BDDs als perfekte Hash-Funktion
![Page 32: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/32.jpg)
Überblick 2 (Lösen allgemeiner Spiele) General Game Playing Einpersonenspiele Zweipersonenspiele
Zweipersonen-NullsummenspieleZweipersonenspiele mit allgemeinen Gewinnen
![Page 33: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/33.jpg)
Überblick 2 (Lösen allgemeiner Spiele) General Game Playing Einpersonenspiele Zweipersonenspiele
Zweipersonen-NullsummenspieleZweipersonenspiele mit allgemeinen Gewinnen
![Page 34: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/34.jpg)
General Game Playing
Beschreibung für Spiele mit folgenden Eigenschaften:endlichdiskretdeterministischvollständige Information
Spiele könnenEin- oder Mehr-Personenspiele seingleichzeitige oder abwechselnde Züge ermöglichen
![Page 35: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/35.jpg)
General Game Playing „Game Description Language“ (GDL) Gegeben:
InitialzustandBestimmung legaler ZügeEffekt eines ZugesTerminierungsbedingungenVerteilung der Gewinne {0, …, 100} darin
Gesucht:Lösung erreichbarer ZuständeBestimmung optimaler Gewinn-Verteilung
![Page 36: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/36.jpg)
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.dehttp://euklid.inf.tu-dresden.de:8180/ggpserver (aktuelle Spiele etc.)
![Page 37: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/37.jpg)
Überblick 2 (Lösen allgemeiner Spiele) General Game Playing Einpersonenspiele Zweipersonenspiele
Zweipersonen-NullsummenspieleZweipersonenspiele mit allgemeinen Gewinnen
![Page 38: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/38.jpg)
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
![Page 39: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/39.jpg)
Lösen von Einpersonenspielen
75 100 90 80
99
75
80100
100
100
100
90
90
80
80
75
![Page 40: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/40.jpg)
Ergebnisse für Solitär
Erreichbar: 375 110 246 Zustände
![Page 41: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/41.jpg)
Überblick 2 (Lösen allgemeiner Spiele) General Game Playing Einpersonenspiele Zweipersonenspiele
Zweipersonen-NullsummenspieleZweipersonenspiele mit allgemeinen Gewinnen
![Page 42: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/42.jpg)
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)
![Page 43: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/43.jpg)
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
![Page 44: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/44.jpg)
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 ≠ ⊥
![Page 45: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/45.jpg)
Überblick 2 (Lösen allgemeiner Spiele) General Game Playing Einpersonenspiele Zweipersonenspiele
Zweipersonen-NullsummenspieleZweipersonenspiele mit allgemeinen Gewinnen
![Page 46: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/46.jpg)
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
![Page 47: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/47.jpg)
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 einiteriere, bis alle Zustände gelöst
![Page 48: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/48.jpg)
Einschub: Reihenfolge beim Lösen
schwierig im allgemeinen Fall
eigenen Gewinn maximieren
(und gegnerischen minimieren)?
oder Differenz zum gegnerischen
Gewinn maximieren?
Hier: 2. Fall
own
100
0
opponent
0 100
…
…
own
100
0
opponent
0 100
…
…
![Page 49: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/49.jpg)
Beispielplayer 0
play
er 1
0
0
1
1
2
2
3
3
player 0‘s turn
player 1‘s turn 0/1
0/1
0/3
2/0
3/1
2/0
2/0
3/1
3/1
0/1 3/13/1
0/10/1
0/3
0/3
0/1 3/1 0/1 2/0
0/10/1
0/1
![Page 50: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/50.jpg)
Lösen allgemeiner Zweipersonenspiele
reach ← berechneErreichbareZustände()init matrix; solved ← alle Zustände in Matrixunsolved ← reach ∧ ⌐solvedsolange 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
![Page 51: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/51.jpg)
Ergebnisse
Game t0-sum tnew
Clobber 3x4 - 1.1s
Clobber 3x4 0-sum 1.0s 1.4s
Clobber 4x5 - 2:14:20
Clobber 4x5 0-sum 0:54:35 1:22:09
Minichess 1.0s 0.7s
TicTacToe 0.1s 0.2s
Nim 40 0.0s 0.1s
![Page 52: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/52.jpg)
Überblick
Wiederholung: BDDs BDD-basierte Suche BDD-BFS, BDD-Dijkstra, BDDA* Anwendung auf allgemeine Spiele („General Game
Playing“) BDDs als perfekte Hash-Funktion
![Page 53: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/53.jpg)
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|
![Page 54: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/54.jpg)
Sat-Count
Anzahl gespeicherter Zustände in BDD G mögliche Berechnung:
sat-count(0-Senke) ← 0, sat-count(1-Senke) ← 1fü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|)
![Page 55: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/55.jpg)
Sat-Count (Beispiel)
0 1
1
1
1
30
1614
4
3522
2
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
![Page 56: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/56.jpg)
Ranking
Gegeben: BDD G, Zustand s Gesucht: Hash-Wert von s (in {0, …, sat-count(G) - 1})
Vorverarbeitung:Berechne Sat-Count aller Knotenspeichere diese Sat-Counts
![Page 57: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/57.jpg)
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
![Page 58: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/58.jpg)
Ranking
lexicographic-count(G,s,v)falls v 0-Senke, gib 0 zurück; falls v 1-Senke, gib 1 zurückfalls 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
![Page 59: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/59.jpg)
Ranking (Beispiel)
s ← 011101rank(G,s) ← [()2 + 1] * lc(G,s,v0) - 1
lc(G,s,v0) ← ()2 * sc(v1) + lc(G,s,v1)
lc(G,s,v1) ← 23-2-1 * sc(v3) + (1)2 * sc(v6) + lc(G,s,v6)
lc(G,s,v6) ← 25-4-1 * 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 * 1 + 1 * 1 + 1 = 3lc(G,s,v1) ← 20 * sc(v3) + 1 * sc(v6) + lc(G,s,v6)
= 1 * 4 + 1 * 5 + 3 = 12lc(G,s,v0) ← 0 * sc(v1) + lc(G,s,v1) = 12
rank(G,s) ← 1 * lc(G,s,v0) - 1 = 110 1
1
1
1
30
1614
4
3522
2
v0
v1 v2
v3
v4 v5 v6 v7
v8 v9 v10
v11
v12 v13
![Page 60: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/60.jpg)
Unranking
Gegeben: BDD G, Hash-Wert r Gesucht: zugehöriger Zustand
![Page 61: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/61.jpg)
Unranking
unrank(G,r)starte an der Wurzelfalls 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 ← lwiederhole, 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
![Page 62: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/62.jpg)
Unranking (Beispiel)
r ← 19i ← 1; r ≥ 22-1-1 * sc(v1) = 1 * 14 = 14
s1 ← 1; r ← r - 22-1-1 * sc(v1) = 19 - 1 * 14 = 5
r ← r mod sc(v2) = 5 mod 16 = 5
i ← 2; r < 24-2-1 * 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 < 25-4-1 * sc(v9) = 1 * 1 = 1 s4 ← 0; r ← r mod sc(v9) = 0 mod 1 = 0
i ← 5; r ≥ 26-5-1 * sc(v12) = 2 * 0 = 0 s5 ← 1; r ← r - 27-5-1 * sc(v12) = 0 - 2 * 0 = 0
r ← r mod sc(v11) = 0 mod 1 = 0
i ← 6; r ≥ 27-6-1 * sc(v12) = 1 * 0 = 0 s6 ← 1; r ← r - 27-6-1 * sc(v12) = 0 - 1 * 0 = 0
r ← r mod sc(v13) = 0 mod 1 = 0
0 1
1
1
1
30
1614
4
3522
2
v0
v1 v2
v3
v4 v5 v6 v7
v8 v9 v10
v11
v12 v13
s ← s ← 1 s ← 101 s ← 1010 s ← 10101 s ← 101011
![Page 63: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/63.jpg)
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
![Page 64: Algorithm Engineering „Symbolische Suche“](https://reader035.fdocument.pub/reader035/viewer/2022062305/56815985550346895dc6c5ad/html5/thumbnails/64.jpg)
Zusammenfassung
Symbolische Suche zur Verringerung der Speicherlastspeichern 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