L'algorithme GSAT est, pour la plupart, simple: vous obtenez une formule sous forme normale conjonctive et retournez les littéraux des clauses jusqu'à ce que vous trouviez une solution qui satisfasse la formule ou que vous atteigniez la limite max_tries / max_flips et ne trouviez aucune solution.
J'implémente l'algorithme suivant:
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
J'ai du mal à interpréter la ligne suivante:
V <- the variable whose flip yield the most important raise in the number of satisfied clauses;
N'est-ce pas le nombre maximum de clauses satisfaites que nous recherchons? Il me semble que nous essayons d'utiliser la solution ou des approximations pour trouver la solution.
J'ai pensé à quelques façons de le faire, mais ce serait bien d'entendre d'autres points de vue (l'hypothèse est qu'une fois la variable retournée une fois qu'elle est sélectionnée.):
- Générez un espace d'état avec tous les retournements possibles et recherchez dans l'espace un littéral qui donne la meilleure approximation de l'état de l'objectif.
- Sélectionnez au hasard la variable que je retournerai en commençant par les littéraux les plus courants.
- Choisissez un littéral aléatoire.