GSAT算法在大多数情况下是直截了当的:您获得了合取范式的公式,然后翻转子句的文字,直到找到满足该公式的解,或者达到了max_tries / max_flips限制,而没有找到解。
我正在实现以下算法:
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
我在解释以下行时遇到了麻烦:
V <- the variable whose flip yield the most important raise in the number of satisfied clauses;
我们不是在寻找满足的最大数量的子句吗?在我看来,我们正在尝试使用解决方案或其近似值来找到解决方案。
我已经想到了一些方法来做到这一点,但最好能听到其他观点(假设是一旦变量被选中,一旦变量被翻转。):
- 生成具有所有可能翻转的状态空间,并在该空间中搜索文字,以得到与目标状态最佳近似的文字。
- 从更常见的文字开始随机选择要翻转的变量。
- 选择一个随机文字。