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

多くのローカル検索アルゴリズムは、満たされた節の数を最大化する変数の割り当てを反転します。実際には、この操作はどのデータ構造で効率的にサポートされていますか?

これは、教科書がしばしば省略しているように感じるものです。一例は、有名なラッセルとノーヴィグの本ですらあります。


まあ、これらの人はハードウェアでそれを構築します。どうやら、確率的およびヒューリスティックなアプローチがより一般的です。それは、あなたが実際に「最良の」(結局は欲張りだけである)変数をすぐに選択できないこと、またはこの選択は一般に良くないことを示唆します。
ラファエル

@Raphaelたぶん、あなたはそれを非常に迅速に選択することはできないことは正しいかもしれませんが、「選択は一般に良くない」と言うことを敢えてしないでしょう。あなたの主張を誤解したかもしれませんが、「正しい」変数を選択することは大きな影響を与えると確信しています。おかげで、もう少し詳しく掘り下げます。リンクしたスライドの著者の1人(Hoos)がこのテーマに関する本を持っていると思います。
-Juho

「正しい」ものが最適ですが、現在最大化されているものが正しいものであると信じる理由はありますか?結局のところ、問題は(正規の)欲張りによって解決できません
ラファエル

回答:


9

必要なデータ構造は、発生リスト、変数が発生する節を含む各変数のリストです。これらのリストは、CNFが最初に読み取られたときに一度作成されます。これらは、満たされた句をカウントするためにCNF式全体をスキャンすることを避けるために、以下のステップ3および5で使用されます。

すべての変数を反転させるよりも優れたアルゴリズムは次のとおりです。

  1. 満たされていない句で発生する変数のみのリストを作成します。
  2. x
  3. x
  4. x
  5. x
  6. x
  7. バツ
  8. 手順1で見つかった残りの変数について、手順2〜7を繰り返します。
  9. 手順7で記録された最大数の変数を反転します。

データ構造の参照(隣接リストとも呼ばれる)は、たとえば Lynce and Marques-Silva、Efficient Data Structures for Backtracking SAT solvers、2004などです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.