3.3.12. 選択関数 Selection

選択関数 Selectionは,添字つき 0-1 整数変数の中で一つだけを 1 に固定したい場合に用います. 同様の記述は Sum 関数を用いる事でも可能ですが,制約充足問題ソルバ wcsp/wls 利用時には利点があります. wcsp を利用する際には,内部的には複数の 0-1 整数変数を用意する替わりに一つの離散変数を用意するため, 内部処理が高速化されます. wls を利用する際は Selection 関数を用いると内部で探索戦略が変更され,より効率的な探索を行います. wcsp/wls 以外ではハード制約の Sum(…)==1 と等価です.

次の例では,3つ の 0-1 整数変数 z[1], z[2], z[3] のうち一つだけを 1 にするよう指定しています.:

i = Element(value=[1, 2, 3])
z = BinaryVariable(index=i)
problem = Problem()
problem += Selection(z[i], i)

すべての添字について演算を行う場合は第二引数の添字は省略することもできます.:

problem += Selection(z[i])

Sum 関数を利用した場合,次のようになります.:

problem += Sum(z[i], i) == 1

Selection 関数の引数には,条件式を指定することもできます. 次の例では,z[1], z[2]のうち一つだけを1にするよう指定しています.:

p += Selection(z[i<=2])

範囲指定の方法については 範囲演算関数 Sum, Prod も参考にしてください.

Selection を用いた制約に明示的に制約式種を指定することはできませんが,常に HardConstraint 扱いとなります.