WalkSAT et GSAT sont des algorithmes de recherche locale simples et bien connus pour résoudre le problème de satisfiabilité booléenne. Le pseudocode de l'algorithme GSAT est copié de la question Mise en œuvre de l'algorithme GSAT - Comment sélectionner le littéral à retourner? et présenté ci-dessous.
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
Ici, nous inversons la variable qui maximise le nombre de clauses satisfaites. Comment cela se fait-il efficacement? La méthode naïve consiste à retourner chaque variable et à chaque étape à travers toutes les clauses et à calculer combien d'entre elles sont satisfaites. Même si une clause pouvait être interrogée pour la satisfiabilité en temps constant, la méthode naïve s'exécuterait toujours en temps , où est le nombre de variables et le nombre de clauses. Je suis sûr que nous pouvons faire mieux, d'où la question:
De nombreux algorithmes de recherche locaux inversent l'affectation de la variable qui maximise le nombre de clauses satisfaites. Dans la pratique, avec quelles structures de données cette opération est-elle prise en charge efficacement?
C'est quelque chose que je pense que les manuels scolaires omettent souvent. Un exemple est même le célèbre livre Russell & Norvig .