コンテンツにスキップ

Exact One

Exact One | Twil3akine.org

問題概要

NN 個の二値変数 x1,,xN  (xi{0,1})x_1, \cdots, x_N \; (x_i \in \{ 0, 1 \}) がある。

『いかなる場合でも x1,,xNx_1, \cdots, x_N のうち1つだけ 11 をとり、それ以外は 00 をとる。』 これを ,  ,  ¬\wedge, \; \vee, \; \neg を用いて表現せよ。

一般に、この問題を満たす状態を Exact  One(EO)Exact \; One(EO) と呼ぶ。


条件なしなら

x1,,xNx_1, \cdots, x_N の総和が 11 になればいいので、以下で表せる

i=1N  xi  =  1\sum\limits_{i=1}^{N} \; x_{i} \; = \; 1

問題を分解する

x1,,xNx_1, \cdots, x_N のうち、どれか1つのみが必ず 11 』と言うのは以下のように分解できる

  • x1,,xNx_1, \cdots, x_N のうち、少なくとも1つは 11 である \cdots At  Least  One(ALO)At \; Least \; One(ALO)
  • x1,,xNx_1, \cdots, x_N のうち、多くとも1つは 11 である \cdots At  Most  One(AMO)At \; Most \; One(AMO)

この ALOALOAMOAMO をどちらも満たす場合、問題と等価である。


論理式の形にする

ALO

少なくとも1つが 11 の時に、真になれば良いので、

i=1N  xi\bigvee_{i=1}^{N} \; x_i

上の式が真になれば良い。

AMO

多くとも1つが 11 の時に、真になれば良い。 しかし、ALOALO とは違い、ひと工夫が必要で 『同時に2つ以上が 11 にならないことを保証すればいい』、すなわち、 『任意の二つの変数 xi,  xjx_i, \; x_j が同時に 11 とならない』 を全ての組み合わせで満たせば良い。

すなわち、下の式が真になれば良い。

i=1N1  j=i+1N  ¬  (xixj)\bigwedge_{i=1}^{N-1} \; \bigwedge_{j=i+1}^{N} \; \neg \;(x_{i} \wedge x_{j})

このような実装は pairwise encoding と呼ばれる。


最後

Exact One は ALO, AMO が同時に満たされている状態なので、

(i=1N  xi)    (i=1N1  j=i+1N  ¬  (xixj))\left( \bigvee_{i=1}^{N} \; x_i \right) \; \wedge \; \left( \bigwedge_{i=1}^{N-1} \; \bigwedge_{j=i+1}^{N} \; \neg \;(x_{i} \wedge x_{j}) \right)

が真になるとき、x1,,xNx_1,\dots,x_N のうち、ちょうど1つのみが 11 であることを表す論理式となる。


おまけ(制約数について)

この手法における制約数について考える。

  • ALO: 1つの論理式で、長さが NN なので、O(N)O(N)
  • AMO: 任意の2つの変数の取り方が (N2)\tbinom{N}{2} なので、O(N2)O(N^2)

となるので、制約数は O(N2)O(N^2) となる。