WalkSAT e GSAT sono algoritmi di ricerca locale ben noti e semplici per risolvere il problema di soddisfacibilità booleana. Lo pseudocodice per l'algoritmo GSAT viene copiato dalla domanda Implementazione dell'algoritmo GSAT - Come selezionare quale letterale capovolgere? e presentato di seguito.
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
Qui capovolgiamo la variabile che massimizza il numero di clausole soddisfatte. Come viene fatto in modo efficiente? Il metodo ingenuo è quello di capovolgere ogni variabile, e per ogni passaggio attraverso tutte le clausole e calcolare quante di esse vengono soddisfatte. Anche se una clausola potesse essere interrogata per soddisfacibilità in tempo costante, il metodo ingenuo verrebbe comunque eseguito in tempo , dove V è il numero di variabili e C il numero di clausole. Sono sicuro che possiamo fare di meglio, da qui la domanda:
Molti algoritmi di ricerca locali capovolgono l'assegnazione della variabile che massimizza il numero di clausole soddisfatte. In pratica, con quali strutture di dati questa operazione è supportata in modo efficiente?
Questo è qualcosa che sento come se i libri di testo spesso omettessero. Un esempio è persino il famoso libro di Russell & Norvig .