私はSATソルバーを使用して問題をエンコードしていますが、SATインスタンスの一部として、ブール変数があります。 。(私はこれを「ワンホット」エンコーディングとして記述されるのを見たことがあります。)
SATで「うち正確に1つでなければならない」という制約をエンコードしたい。SATソルバーを可能な限り効率的に実行するために、この制約をエンコードする最良の方法は何ですか?
この制約をエンコードする方法はたくさんあります。
ペアごとの制約。すべてのに対してペアワイズ制約を追加して、最大で1つのが真であることを確認してから、を追加して、少なくとも1ことを確認できます。 iは、jはxはI X 1 ∨ X 2 ∨ ⋯ ∨ X N
これにより、句が追加され、追加のブール変数は追加されません。
バイナリエンコーディング。新しいブール変数 導入できますi 1、i 2、… 、i lg n(バイナリ)の整数で表すためにそのようなその(ことを確実にするために、いくつかのブール制約の追加望ましい範囲内にあります)。次に、がツリーであり、他のすべてのがfalseであることを強制する制約を追加できます。つまり、ごとに、強制する句を追加します。1 ≤ iが≤ N I X I 、X 、J、J 、I = J ⇔ X J
これにより、句が追加され、余分なブール変数の数がわかりません。
真の値の数を数えます。 ブール加算回路のツリーを実装し、を要求し、各をfalseまたはtrueではなく0または1として扱い、Tseitin変換を使用して回路をSAT句に変換します。半加算器のツリーで十分です。各半加算器のキャリー出力を0に制限し、ツリーの最後の半加算器の最終出力を1に制限します。ツリーは任意の形状(平衡二分木、または不平衡、または何でも)。x i
これはゲートで実行できるため、Θ (n )句とΘ (n )の新しいブール変数が追加されます。
この方法の特別な場合は、ブール変数を導入することであるという考えと、Y iは、の値含まれている必要があり、X 1 ∨ X 2 ∨ ⋯ ∨ X のI。この意図は、句を追加することによって実施することができ、Y I ∨ ¬ X I、Y I ∨ ¬ Y I - 1、及び¬ Y I ∨ X I ∨ Y I -( i 0をfalseの同義語として扱う)i=1、…、nの場合。次に、我々は制限を追加することができます¬ Y I ∨¬ X I + 1のために、私は=1、2、...、nは-1。これは基本的に、半加算ツリーのTseitin変換と同等であり、ツリーの形状は最大限に不均衡です。
バタフライネットワーク。nビットでバタフライネットワークを構築し、nビット入力を000 ⋯ 01に制約し、nビット出力をx 1 x 2 ⋯ x nに制約し、各2ビットバタフライゲートを独立したゲートとして扱うことができます入力をスワップするか、または制約なしに残された新しいブール値に基づいて行うかを決定します。その後、Tseitin変換を適用して、回路をSAT句に変換できます。
これにはゲートが必要であるため、Θ (n lg n )節とΘ (n lg n )新しいブール変数が追加されます。
私が見落としている他の方法はありますか?どちらを使用すればよいですか?誰かがこれをテストしたか、実験的に試しましたか、またはこれらの経験がありますか?節の数および/または新しいブール変数の数は、SATソルバーのパフォーマンスに対するこれの影響を推定するための適切な代替メトリックですか、そうでない場合は、どのメトリックを使用しますか?
私はちょうどことに気づいたこの答えは、すなわち、SATのためのカーディナリティの制約を施行正確という制約を強制する上でいくつかの参照を持つのうちn個の変数真であるが。したがって、私の質問はk = 1である特別なケースに帰着します。おそらく、カーディナリティの制約に関する文献は、私の質問に光を当てるのに役立つでしょう。