問題概要
N 個の二値変数 x1,⋯,xN(xi∈{0,1}) がある。
『いかなる場合でも x1,⋯,xN のうち1つだけ 1 をとり、それ以外は 0 をとる。』
これを ∧,∨,¬ を用いて表現せよ。
一般に、この問題を満たす状態を ExactOne(EO) と呼ぶ。
条件なしなら
x1,⋯,xN の総和が 1 になればいいので、以下で表せる
i=1∑Nxi=1
問題を分解する
『 x1,⋯,xN のうち、どれか1つのみが必ず 1 』と言うのは以下のように分解できる
- x1,⋯,xN のうち、少なくとも1つは 1 である ⋯ AtLeastOne(ALO)
- x1,⋯,xN のうち、多くとも1つは 1 である ⋯ AtMostOne(AMO)
この ALO と AMO をどちらも満たす場合、問題と等価である。
論理式の形にする
ALO
少なくとも1つが 1 の時に、真になれば良いので、
i=1⋁Nxi
上の式が真になれば良い。
AMO
多くとも1つが 1 の時に、真になれば良い。
しかし、ALO とは違い、ひと工夫が必要で 『同時に2つ以上が 1 にならないことを保証すればいい』、すなわち、 『任意の二つの変数 xi,xj が同時に 1 とならない』 を全ての組み合わせで満たせば良い。
すなわち、下の式が真になれば良い。
i=1⋀N−1j=i+1⋀N¬(xi∧xj)
このような実装は pairwise encoding と呼ばれる。
最後
Exact One は ALO, AMO が同時に満たされている状態なので、
(i=1⋁Nxi)∧(i=1⋀N−1j=i+1⋀N¬(xi∧xj))
が真になるとき、x1,…,xN のうち、ちょうど1つのみが 1 であることを表す論理式となる。
おまけ(制約数について)
この手法における制約数について考える。
- ALO: 1つの論理式で、長さが N なので、O(N)
- AMO: 任意の2つの変数の取り方が (2N) なので、O(N2)
となるので、制約数は O(N2) となる。