SAT本地搜索的支持数据结构


20

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是子句数。我确信我们可以做得更好,因此出现了一个问题:O(VC)VC

许多本地搜索算法会翻转变量的分配,以使满足条件的子句的数量最大化。在实践中,此操作有效地支持哪些数据结构?

我觉得这是教科书经常忽略的东西。一个例子甚至是著名的Russell&Norvig书


好吧,这些家伙在硬件中构建它。显然,概率和启发式方法更受欢迎。这表明您确实不能快速选择“最佳”(毕竟只是贪婪)变量,或者通常来说,这种选择是不好的。
拉斐尔

@Raphael也许您是对的,但是不能很快选择它,但是我不敢说“选择总体上不好”。也许我误解了您的观点,但是我敢肯定,选择“正确的”变量会产生巨大的影响。谢谢,我会更深入地探讨。我认为您链接的幻灯片的其中一位作者(Hoos)有一本关于该主题的书。
Juho'4

“正确”的是最佳选择,但是否有理由相信现在最大化的选择是正确的?毕竟,这个问题是不是由(规范)贪婪解决的。
拉斐尔

Answers:


9

所需的数据结构是一个事件列表,它是每个变量的列表,其中包含该变量发生的子句。这些列表在第一次读取CNF时被构建一次。在下面的步骤3和5中使用它们,以避免扫描整个CNF公式以计算满意的子句。

比翻转每个变量更好的算法是:

  1. 仅列出不满意子句中出现的变量。
  2. x
  3. x
  4. x
  5. x
  6. x
  7. X
  8. 对在步骤1中找到的其余变量重复步骤2-7。
  9. 翻转具有步骤7中记录的最高编号的变量。

数据结构(通常也称为邻接表)的参考例如Lynce和Marques-Silva,《有效回溯SAT求解器的数据结构》,2004年。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.