SATソルバーの1-out-of-n制約のエンコード


25

私はSATソルバーを使用して問題をエンコードしていますが、SATインスタンスの一部として、ブール変数があります。 。(私はこれを「ワンホット」エンコーディングとして記述されるのを見たことがあります。)x1,x2,,xn

SATで「うち正確に1つでなければならない」という制約をエンコードしたい。SATソルバーを可能な限り効率的に実行するために、この制約をエンコードする最良の方法は何ですか?x1,,xn

この制約をエンコードする方法はたくさんあります。

  • ペアごとの制約。すべてのに対してペアワイズ制約を追加して、最大で1つのが真であることを確認してから、を追加して、少なくとも1ことを確認できます。 iはjはxはI X 1X 2X N¬xi¬xji,jxix1x2xn

    これにより、句が追加され、追加のブール変数は追加されません。Θ(n2)

  • バイナリエンコーディング。新しいブール変数 導入できますi 1i 2i lg nlgni1,i2,,ilgn(バイナリ)の整数で表すためにそのようなその(ことを確実にするために、いくつかのブール制約の追加望ましい範囲内にあります)。次に、がツリーであり、他のすべてのがfalseであることを強制する制約を追加できます。つまり、ごとに、強制する句を追加します。1 iがN I X I 、X 、J、J 、I = J X Ji1inixixjji=jxj

    これにより、句が追加され、余分なブール変数の数がわかりません。Θ(nlgn)

  • 真の値の数を数えます。 ブール加算回路のツリーを実装し、を要求し、各をfalseまたはtrueではなく0または1として扱い、Tseitin変換を使用して回路をSAT句に変換します。半加算器のツリーで十分です。各半加算器のキャリー出力を0に制限し、ツリーの最後の半加算器の最終出力を1に制限します。ツリーは任意の形状(平衡二分木、または不平衡、または何でも)。x ix1+x2++xn=1xi

    これはゲートで実行できるため、Θ n 句とΘ n )の新しいブール変数が追加されます。Θ(n)Θ(n)Θ(n)

    この方法の特別な場合は、ブール変数を導入することであるという考えと、Y iは、の値含まれている必要があり、X 1X 2X のI。この意図は、句を追加することによって実施することができ、Y I¬ X IY I¬ Y I - 1、及び¬ Y IX IY I -y1,,ynyix1x2xiyi¬xiyi¬yi1 i 0をfalseの同義語として扱う)i=1nの場合。次に、我々は制限を追加することができます¬ Y I¬ X I + 1のために、私は=12...nは-1。これは基本的に、半加算ツリーのTseitin変換と同等であり、ツリーの形状は最大限に不均衡です。¬yixiyi1y0i=1,,n¬yi¬xi+1i=1,2,,n1

  • バタフライネットワーク。nビットでバタフライネットワークを構築し、nビット入力を000 01に制約し、nビット出力をx 1 x 2x nに制約し、各2ビットバタフライゲートを独立したゲートとして扱うことができます入力をスワップするか、または制約なしに残された新しいブール値に基づいて行うかを決定します。その後、Tseitin変換を適用して、回路をSAT句に変換できます。nn00001nx1x2xn

    これにはゲートが必要であるため、Θ n lg n 節とΘ n lg n 新しいブール変数が追加されます。ΘnlgnΘnlgnΘnlgn

私が見落としている他の方法はありますか?どちらを使用すればよいですか?誰かがこれをテストしたか、実験的に試しましたか、またはこれらの経験がありますか?節の数および/または新しいブール変数の数は、SATソルバーのパフォーマンスに対するこれの影響を推定するための適切な代替メトリックですか、そうでない場合は、どのメトリックを使用しますか?


私はちょうどことに気づいたこの答えは、すなわち、SATのためのカーディナリティの制約を施行正確という制約を強制する上でいくつかの参照を持つのうちn個の変数真であるが。したがって、私の質問はk = 1である特別なケースに帰着します。おそらく、カーディナリティの制約に関する文献は、私の質問に光を当てるのに役立つでしょう。knk=1


最新のSATソルバーのほとんどは、カーディナリティー句およびその他の特別な(非CNF)制約をそのままサポートしています。
ダヴィッドホル

回答:


12

k = 1の場合、n個の変数のうちk個がtrueである特別なケースでは、KlieberとKwonによる1からN個のオブジェクトを選択するための効率的なCNFエンコーディングで説明されているコマンダー変数エンコーディングがあります。単純化:変数を小さなグループに分割し、司令官変数の状態に、変数のグループがすべてfalseまたはall-but-one falseであることを意味する句を追加します。その後、同じアルゴリズムを再帰的にコマンダー変数に適用します。プロセスの最後に、ほんの一握りの最終的な司令官変数が正しいことを要求します。結果は、O(n)新しい句とO(n)新しい変数です。

DPLLベースのソルバーでの2つの監視リテラルの遍在を考えると、O(n)句の成長は、より多くの句を追加するエンコーディングスキームに対する決定的な利点だと思います。


2
「小グループ」のサイズが2の場合、これは単なるバイナリ加算です。「コマンダー」は結果ビットであり、キャリーは偽であるとアサートされます。再帰的に行われますが、この方法は完全に一般的であり(Nの1で機能します)、実際に実用的です。
d8d0d65b3f7cf42

3

MagnusBjörkの論文では、試してみる価値のある2つの手法について説明しています。

1-out-of- 、ワンホットエンコーディングバイナリエンコーディングの両方を同時に使用できます。したがって、ワンホットエンコーディングとしてx 1x nがあり、バイナリエンコーディングとしてy 1y bがあります(b = lg n)。我々は、単一の句で、容易に「少なくとも1つ」の制約をコードすることができる:X 1X N。また、2つのエンコードを2 lg nと一致させることができます。nバツ1バツny1ybb=lgnバツ1バツn2lgn句:単にx iを追加しますまたは X Iバツ¬yj iのバイナリエンコーディングの j番目のビットが0か1かによって異なります。最後に、「最大1」の制約が自動的に続きます。これにより、SATインスタンスの残りの部分は、より便利なエンコードを使用できます。バツyjj

以下のためにアウトオブN、一つの入力にソーティングネットワークを適用することができ、X 1... X nはソート出力取得するY 1... Y nとし、その要求句追加Y kは真でありおよびy k + 1は偽です。O n lg 2 n コンパレータユニットのみを必要とする単純なソートネットワークがいくつかあります。したがって、O n lg 2を使用するエンコードを取得しますknバツ1バツny1ynykyk+1O(nlg2n)句と一時変数。O(nlg2n)

論文は

マグナスビョーク。 SATエンコード技術の成功。2009年7月25日。

以下の論文は、1アウトオブためのエンコーディングの詳細なリストを持っているKアウトオブNをそれらのそれぞれのいくつかの実験的評価と、。結論は完全に明確ではありません(コマンドのエンコードは実験でかなり良く見えます)。nkn

アラン・M・フリッシュ、ポール・A・ジャンナロス。 アットほとんど-kの制約のSATエンコーディング:いくつかの古い、いくつかの新しい、いくつかの高速、いくつか遅いです。ModRef 2010。

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