2016-08-12 34 views
1

我正在使用Choco求解器並給定了一個int變量數組,我想要一個約束來檢查數組中的至少一個var是否等於靜態值......類似IntConstraintFactory#count但有下列文檔使用喬科解算器至少有一個Var等於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)的通用方法:引入指示符 - 約束條件,它標記變量是否「命中」它是目標值。然後添加一個可能的基數方法(或者在你的情況下只是一個'''OR'''')。 – sascha

+0

CP社區中這個約束的通用名稱是GCC(全局基數約束),也許這會幫助你找到答案(我對choco並不熟悉) – tobyodavies

回答

1

如果您想發表約束atLeast(VALUE,VARS, LIMIT)Choco Solver,你可以簡單地張貼count(VALUE,VARS,X),與X初始域[0,VARS.length]的IntVar,並張貼arithm(X,">=",LIMIT)。這將完成這項工作。沒有必要爲此實施特定的限制。

如果您要檢查在VARS至少一個變量等於VALUE,那麼就更簡單了,只需用[1,VARS.length]發佈count(VALUE, VARS, X)X初始域。所以VALUE發生的最小次數至少爲1。不需要創建第二個變量和算術約束。

+0

非常感謝... – avianey