跳至主内容
框架 无框架

IlcDistribute

publicIlcConstraint IlcDistribute(IlcIntVarArray cards,IlcIntArray values,IlcIntVarArray vars,IlcFilterLevel level)
publicIlcConstraint IlcDistribute(IlcIntVarArray cards,IlcIntVarArray vars,IlcFilterLevel level)
publicIlcConstraint IlcDistribute(IlcIntVarArray cards,IlcIntArray values,IlcIntVarArray vars)
publicIlcConstraint IlcDistribute(IlcIntVarArray cards,IlcIntVarArray vars)
定义文件: ilcp/cpext.h
包含文件: <ilcp/cpextilcp/cpext.h
返回分布约束。

您可以使用函数 "IlcDistribute来计算约束变量数组中几个值的出现次数。

此函数创建并返回一个约束条件。 在您发布之前,该限制不起任何作用。 发布该约束后,数组 "cards中的约束变量等于数组 "vars中出现的数组 "values中值的个数。 更确切地说,对于每个 "i,"cards[i]等于 "vars数组中 "values[i]"的出现次数。 传播此约束后,"cards[i]的最小值至少等于 "vars中包含的固定为 "values[i]值的变量个数;而 "cards[i]的最大值最多等于 "vars中包含的在其域中包含 "values[i]值的变量个数。

cards和 "values数组的长度必须相同,否则 CP 优化器将抛出异常("IloException实例)。

当该函数只有两个参数时(即没有 "values参数),则计数的数值数组必须是以 0(零)开头的连续整数数组。 在这种情况下,对于每个 "i,"cards[i]等于 "vars数组中 "i"的出现次数。 在传播此约束后,"cards[i]的最小值至少等于固定为 "i的 "vars中包含的变量个数;而 "cards[i]的最大值最多等于 "vars中包含的、在其域中包含 "i的变量个数。

如果没有明确说明过滤级别,CP 优化器将对该约束使用默认过滤级别。 可选参数 "level有两个值: IlcBasic或 "IlcExtended。 其最低值为 "IlcBasic。 传播过程中域的缩小量取决于该值。 请参阅 "IlcFilterLevel,了解过滤器级别及其对约束传播的影响。

IlcExtended比 "IlcBasic导致更多的域缩减;运行时间也更长。

添加这些限制

您只能在 CPsearch 中添加这些约束,即在目标("IlcGoal实例)或约束("IlcConstraint实例)中添加。 如果您要在约束中寻找类似功能以添加到模型中,请参阅IBM®ILOG® Concert Technology 中的 "IloDistribute和 "IloCount

编程提示

以下语句:

 s.addIlcDistribute(cards,vars));

的效率更高,但等同于下面的代码:

 IlcIntsize =cards.getSize();
 IlcIntArrayvalues(size);
 forIlcInti = 0; i < size; i++)
     values[i] = i;
 s.addIlcDistribute(cards,values, vars));

另请参阅: