| 概述 | 组 | 树 | 图形 | 不推荐 | 索引 | 概念 |
该函数可用于定义 CP 优化器中未预定义的简单约束条件。 (有关在IBM®ILOG® Concert Technology 模型中使用的类似功能,请参阅IloAllowedAssignments和IloForbiddenAssignments) 此函数创建并返回一个约束条件。 该约束条件是为数组 "vars中的所有约束变量或单一约束变量 "y定义的。
这种约束有时也被称为元素约束。
通用约束的语义可以通过几种方式之一来表示:
predicate当然表示该谓词;
set表示满足约束条件的值的组合,参数 "
compatible必须是 "
IlcTrue
set表示 不满意的数值组合,参数 "
compatible必须是 "
IlcFalse
y等于数组 "
a中位于 "
x索引处的元素。 换句话说,"
y=a[x];在数组 "vars中受限变量的顺序很重要,因为在 "predicate或 "set中也要遵守同样的顺序。 也就是说,"IlcTableConstraint向谓词成员函数 "isTrue或集合成员函数 "isIn传递一个值数组,其中第一个值是 "vars[0]的值,第二个值是 "vars[1]的值,一般来说,第i个值是受约束变量 "vars[i]的值。
如果出现以下情况,该函数将抛出异常("IloException实例):
predicate为参数调用函数,但受限变量数组的大小大于 3;
vars的大小与 "
set的大小不同。该功能可有效减少域,但可能需要一些时间。 域缩减所需的时间取决于 "vars中受限变量域的大小。
示例:
下面的代码定义了一个四元约束,只允许这些值的组合: (0, 1, 1, 2)"、"(1, 0, 2, 3)"和 "(0, 0, 2, 1)"。
IlcIntTupleSetsetcp,4); set.add(IlcIntArray(cp,4,0,1,1,2)); set.add(IlcIntArray(cp,4,1,0,2,3)); set.add(IlcIntArray(cp,4,0,0,2,1)); set.close(); IlcIntVarxcp,0,1),y(cp,0,1),z(cp,0,3),tcp,0,2); IlcIntVarArrayvarscp,4,x,y,z,t);
在目标或约束中,您可以将该约束添加到 "IloCPEngine实例中,就像这样:
cp.add(IlcTableConstraint(vars,set,IlcTrue));
下面的代码定义了一个三元约束。 它使用一个谓词,如果三个变量成对不同,或者前两个受限变量之和等于第三个变量,则谓词为真。
IlcBool IlcIntPredicateI::isTrue(IlcIntArrayval) {
return((val[0] != val[1] && val[1] != val[2] && val[0] != val[2])
|| (val[0] + val[1] == val[2]));
}
IlcIntVarx(cp,0,3),y(cp,0,3),z(cp,0,3);
IlcIntVarArrayvars(cp, 3, x, y, z);
在目标或约束中,您可以将此约束添加到 "IloCPEngine实例中,就像这样:
cp.addIlcTableConstraint(vars,Predicate(cp));
另请参阅:
IlcConstraint,ILCINTPREDICATE0,IlcIntPredicate,IlcIntTupleSet,IloAllowedAssignments,IloForbiddenAssignments