实现GSAT算法-如何选择要翻转的文字?


20

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;

我们不是在寻找满足的最大数量的子句吗?在我看来,我们正在尝试使用解决方案或其近似值来找到解决方案。

我已经想到了一些方法来做到这一点,但最好能听到其他观点(假设是一旦变量被选中,一旦变量被翻转。):

  • 生成具有所有可能翻转的状态空间,并在该空间中搜索文字,以得到与目标状态最佳近似的文字。
  • 从更常见的文字开始随机选择要翻转的变量。
  • 选择一个随机文字。

Answers:


12

我们不是在寻找满足的最大数量的子句吗?

是的,我们正在寻找一种能满足子句最大数量的分配(最好是所有子句)。为此,我们问自己:“哪个单一变量会使我们在达到目标时最接近该目标?” 然后翻转它。

在我看来,我们正在尝试使用解决方案或其近似值来找到解决方案。

如果我们问“多次翻转的哪种组合会产生最佳结果?”,则使用该解决方案。或简单地说“哪个任务最好?”。但这不是我们正在做的,我们只是向前迈出了一步。使用解决方案的近似值似乎是一个准确的描述。但是,这没有错。这就是贪婪策略的工作原理。

生成具有所有可能翻转的状态空间,并在该空间中搜索文字,以得到与目标状态最佳近似的文字。

对。

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.