WalkSAT und GSAT sind bekannte und einfache lokale Suchalgorithmen zur Lösung des Problems der booleschen Erfüllbarkeit. Der Pseudocode für den GSAT-Algorithmus wird aus der Frage Implementieren des GSAT-Algorithmus kopiert. Wie wird ausgewählt, welches Literal umgedreht werden soll? und unten dargestellt.
procedure GSAT(A,Max_Tries,Max_Flips)
A: is a CNF formula
for i:=1 to Max_Tries do
S <- instantiation of variables
for j:=1 to Max_Iter do
if A satisfiable by S then
return S
endif
V <- the variable whose flip yield the most important raise in the number of satisfied clauses;
S <- S with V flipped;
endfor
endfor
return the best instantiation found
end GSAT
Hier drehen wir die Variable, die die Anzahl der erfüllten Klauseln maximiert. Wie geht das effizient? Die naive Methode besteht darin, jede Variable und für jeden Schritt durch alle Klauseln zu drehen und zu berechnen, wie viele davon erfüllt werden. Selbst wenn eine Klausel in konstanter Zeit auf Erfüllbarkeit abgefragt werden könnte, würde die naive Methode immer noch in der Zeit) ausgeführt, wobei die Anzahl der Variablen und die Anzahl der Klauseln ist. Ich bin sicher, wir können es besser machen, daher die Frage:
Viele lokale Suchalgorithmen kippen die Zuweisung der Variablen, wodurch die Anzahl der erfüllten Klauseln maximiert wird. Mit welchen Datenstrukturen wird diese Operation in der Praxis effizient unterstützt?
Ich habe das Gefühl, dass Lehrbücher dies oft auslassen. Ein Beispiel ist sogar das berühmte Russell & Norvig-Buch .