2
SATソルバーの1-out-of-n制約のエンコード
私はSATソルバーを使用して問題をエンコードしていますが、SATインスタンスの一部として、ブール変数があります。 。(私はこれを「ワンホット」エンコーディングとして記述されるのを見たことがあります。)x1,x2,…,xnx1,x2,…,xnx_1,x_2,\dots,x_n SATで「うち正確に1つでなければならない」という制約をエンコードしたい。SATソルバーを可能な限り効率的に実行するために、この制約をエンコードする最良の方法は何ですか?x1,…,xnx1,…,xnx_1,\dots,x_n この制約をエンコードする方法はたくさんあります。 ペアごとの制約。すべてのに対してペアワイズ制約を追加して、最大で1つのが真であることを確認してから、を追加して、少なくとも1ことを確認できます。 iは、jはxはI X 1 ∨ X 2 ∨ ⋯ ∨ X N¬xi∨¬xj¬xi∨¬xj\neg x_i \lor \neg x_ji,ji,ji,jxixix_ix1∨x2∨⋯∨xnx1∨x2∨⋯∨xnx_1 \lor x_2 \lor \cdots \lor x_n これにより、句が追加され、追加のブール変数は追加されません。Θ(n2)Θ(n2)\Theta(n^2) バイナリエンコーディング。新しいブール変数 導入できますi 1、i 2、… 、i lg nlgnlgn\lg ni1,i2,…,ilgni1,i2,…,ilgni_1,i_2,\dots,i_{\lg n}(バイナリ)の整数で表すためにそのようなその(ことを確実にするために、いくつかのブール制約の追加望ましい範囲内にあります)。次に、がツリーであり、他のすべてのがfalseであることを強制する制約を追加できます。つまり、ごとに、強制する句を追加します。1 ≤ iが≤ N I X I 、X 、J、J 、I = J ⇔ X Jiii1≤i≤n1≤i≤n1 …