2-Sat 値を取得する方法
-
22-09-2019 - |
質問
2-Sat のアルゴリズムを検索すると、問題の決定形式のアルゴリズムが返されます。すべての条項を満たす法的な値セットは存在しますか。ただし、それでは満足のいくブール値のセットを簡単に見つけることはできません。
2-Sat インスタンスを満たす正当な値のセットを効率的に見つけるにはどうすればよいでしょうか?
私は C++ で boost ライブラリを使用して作業していますが、簡単に統合できるコードを歓迎します。
前もって感謝します
解決
あなたは2-SATへの有効な割り当てが存在するかどうかを検出するための決定アルゴリズムを持っている場合は、あなたが実際に実際の割り当てを見つけるためにそれを使用することができます。
最初は、式全体で2-SAT決定アルゴリズムを実行します。それが有効な割り当てがあると言うと仮定します。
今X_1がリテラルの場合、割り当ては0ですが、今(インスタンス変数x_1 OR X_3表示された場合、あなたはまた必要性のために、このためのいくつかの他のリテラルを割り当てる必要があります得られた発現のために2-SATを計算するX_1 )を1に設定X_3へ。
その結果expresionは2充足された場合は、、あなたは1に、0であることを他のテイクX_1をX_1を取ることができます。
今、あなたは、各リテラルについては、これを見つけることができます。
、より効率的なアルゴリズムについては、私はあなたが含意グラフのアプローチを使用してみてくださいお勧めします。
あなたがここでより多くの情報を見つけることができます: http://en.wikipedia.org/wiki/ 2-充足する
関連部分
2充足のインスタンスであります 解ける場合にのみ、すべての変数があれば インスタンスの異なるに属し の強連結成分 の否定よりも含意グラフ 同じ変数。強くので、 連結成分は、に見出すことができます 基づくアルゴリズムにより線形時間 深さ優先探索、同じ線 拘束時間がにだけでなく、適用されます 2-充足
各強連結成分におけるリテラルのいずれか、すべてゼロ又は全て1である。
他のヒント
Tomas Feder による、2 衛星問題のすべての解をリストするアルゴリズムが少なくとも 1 つあります。 http://www.springerlink.com/content/j582276p06276l12/