2016-08-12 14 views
1

私はChoco Solverを使用していてint varsの配列が与えられているので、配列内の少なくとも1つのvarが静的値... IntConstraintFactory#countに似ていますが、次のdocとChoco Solverを使用して、Var配列内の少なくとも1つのVarがXと等しい

何か:

/** 
* Let N be the number of variables of the VARIABLES collection assigned to value VALUE; 
* Enforce condition N >= LIMIT to hold. 
* <p> 
* 
* @param VALUE an int 
* @param VARS a vector of variables 
* @param LIMIT a variable 
*/ 
public static Constraint at_least(int VALUE, IntVar[] VARS, IntVar LIMIT) { 
    return new Constraint("At least", /* help here ? */); 
} 

はそれが私が効率的にそれを実装することができますどのように存在している場合や、誰かが知っていますか?

+0

ほとんどの最適化プリミティブ(SAT、MIP、CP)のために働く一般的なアプローチの1つに、インジケータ制約が導入されています。次に、利用可能なカーディナリティアプローチの1つを追加します(または、あなたのケースでは単に '' OR''')。 – sascha

+0

CPコミュニティのこの制約の一般的な名前は、GCC(グローバルカーディナリティ制約)です。これはおそらくあなたが答えを見つけるのに役立ちます(私は特にchocoに慣れていません) – tobyodavies

答えて

1

あなたはChoco Solverに制約atLeast(VALUE,VARS, LIMIT)を投稿したい場合は、単にX初期ドメイン[0,VARS.length]のIntVarで、count(VALUE,VARS,X)を投稿し、そしてarithm(X,">=",LIMIT)を投稿することができます。これは仕事をするでしょう。そのための特定の制約を実装する必要はありません。

あなたはVARS内の少なくとも1つの変数がVALUEに等しいことを確認したい場合は、それは単にXの初期ドメインとして[1,VARS.length]count(VALUE, VARS, X)を投稿し、さらに簡単です。したがって、VALUEの最小発生数は少なくとも1になります。 2番目の変数と算術制約を作成する必要はありません。

+0

すばらしいおかげさ... – avianey