O WalkSAT e o GSAT são algoritmos de busca local bem conhecidos e simples para solucionar o problema de satisfação booleana. O pseudocódigo para o algoritmo GSAT é copiado da pergunta Implementando o algoritmo GSAT - Como selecionar qual literal ativar? e apresentado abaixo.
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
Aqui mostramos a variável que maximiza o número de cláusulas satisfeitas. Como isso é feito com eficiência? O método ingênuo é inverter todas as variáveis, e para cada etapa de todas as cláusulas e calcular quantas delas são satisfeitas. Mesmo que uma cláusula pudesse ser consultada quanto à satisfação em tempo constante, o método ingênuo ainda seria executado no tempo , onde V é o número de variáveis e C o número de cláusulas. Tenho certeza de que podemos fazer melhor, daí a pergunta:
Muitos algoritmos de busca local alteram a atribuição da variável que maximiza o número de cláusulas satisfeitas. Na prática, com quais estruturas de dados essa operação é suportada com eficiência?
Isso é algo que eu sinto que os livros freqüentemente omitem. Um exemplo é até o famoso livro de Russell & Norvig .