跳至主内容
框架 无框架

IlcTableConstraint

publicIlcConstraint IlcTableConstraint(IlcIntVarArray vars,IlcIntPredicate predicate)
publicIlcConstraint IlcTableConstraint(IlcIntVarArray vars,IlcIntTupleSet set,IlcBool compatible)
publicIlcConstraint IlcTableConstraint(IlcIntVar y,IlcIntArray a,IlcIntVar x)
定义文件: ilcp/cpext.h
包含文件: <ilcp/cpextilcp/cpext.h
返回表格约束。

该函数可用于定义 CP 优化器中未预定义的简单约束条件。 (有关在IBM®ILOG® Concert Technology 模型中使用的类似功能,请参阅IloAllowedAssignmentsIloForbiddenAssignments) 此函数创建并返回一个约束条件。 该约束条件是为数组 "vars中的所有约束变量或单一约束变量 "y定义的。

这种约束有时也被称为元素约束

通用约束的语义可以通过几种方式之一来表示:

在数组 "vars中受限变量的顺序很重要,因为在 "predicate或 "set中也要遵守同样的顺序。 也就是说,"IlcTableConstraint向谓词成员函数 "isTrue或集合成员函数 "isIn传递一个值数组,其中第一个值是 "vars[0]的值,第二个值是 "vars[1]的值,一般来说,第i个值是受约束变量 "vars[i]的值。

如果出现以下情况,该函数将抛出异常("IloException实例):

该功能可有效减少域,但可能需要一些时间。 域缩减所需的时间取决于 "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));

另请参阅: