WalkSAT和GSAT是解决布尔可满足性问题的众所周知的简单本地搜索算法。从实现GSAT算法-如何选择要翻转的文字的问题中复制了GSAT算法的伪代码。并在下面介绍。
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是变量数,C是子句数。我确信我们可以做得更好,因此出现了一个问题:
许多本地搜索算法会翻转变量的分配,以使满足条件的子句的数量最大化。在实践中,此操作有效地支持哪些数据结构?
我觉得这是教科书经常忽略的东西。一个例子甚至是著名的Russell&Norvig书。
好吧,这些家伙在硬件中构建它。显然,概率和启发式方法更受欢迎。这表明您确实不能快速选择“最佳”(毕竟只是贪婪)变量,或者通常来说,这种选择是不好的。
—
拉斐尔
@Raphael也许您是对的,但是不能很快选择它,但是我不敢说“选择总体上不好”。也许我误解了您的观点,但是我敢肯定,选择“正确的”变量会产生巨大的影响。谢谢,我会更深入地探讨。我认为您链接的幻灯片的其中一位作者(Hoos)有一本关于该主题的书。
—
Juho'4
“正确”的是最佳选择,但是否有理由相信现在最大化的选择是正确的?毕竟,这个问题是不是由(规范)贪婪解决的。
—
拉斐尔