跳至主内容
框架 无框架

类IlcIntExp

定义文件: ilcp/cpext.h
包含文件: <ilcp/cpextilcp/cpext.h
IlcIntExp地图IlcIntExpIlcIntVarIlcIntExp
用于表示整数表达式的类。

在利用 CP 优化器的典型应用中,问题的未知数将以受限变量的形式表示。 最常用的受约束变量类别是受约束整数变量类别。 IlcIntExp 、 是一组用于表达整数变量约束条件的类的根类。

该类中的大多数成员函数都包含 "assert语句。 有关宏 "NDEBUG(打开或关闭这些 "assert语句的方法)的解释,请参阅Assert 和 NDEBUG 概念。

受约束整数表达式的域由其子表达式的域计算得出。 例如,表达式 "x+y的域包含范围 "[x.getMin()+y.getMin(), x.getMax()+y.getMax()]

受约束整数变量是一种受约束表达式,它存储其域,而不是从子表达式中计算域。 受约束整数变量的域包含 "IlcInt类型的值。 如果数值是连续的,该域用区间表示,否则用整数枚举表示。

受限整数变量可与算术运算符相结合,生成受限整数表达式。 每个受约束的整数表达式都有一个最小值和一个最大值。 如果表达式的最小值等于最大值,我们就说表达式是固定的

受约束整数表达式的域可以简化为空。 在这种情况下,就会出现失败,因为不可能有任何解决方案。

表达式与变量

IlcIntVar是从 "IlcIntExp派生出来的子类。 另一种描述方式是,受约束变量是一个恰好存储其域的受约束表达式。 您可以通过以下两种方式之一,将受限整数表达式(计算其域)转换为受限整数变量(存储其域):"IlcIntVar的转换构造函数或 "IlcIntVar的赋值操作符。

溢出和下溢

CP 优化器通过这些方式管理整数溢出和下溢:

回溯和可逆性

为该类定义的、能够修改受约束变量的所有成员函数和运算符都是可逆的。 特别是,约束发布函数所做的更改是通过可逆赋值进行的。 因此,当 CP 优化器回溯时,任何受限变量的值、域和约束条件都会恢复。

修饰符

有关 "IlcIntExp的修改器,请参阅CP Optimizer 中的传播事件概念。

更多信息,请参阅CP 优化器中的传播概念。

修饰符是一个成员函数,它可以缩小受约束整数表达式的域。 修改器不存储,与约束相反。 如果受限整数表达式是一个受限整数变量,则修改器调用导致的修改将存储在其域中。 否则,修改器的效果会传播到受约束整数表达式的子表达式中。 如果域为空,调用成员函数 "IloCP::fail将触发故障。 修改器通常用于定义新的约束条件类别

另请参阅:

方法概要
public IlcIntgetMax() const
public IlcIntgetMin() const
public IlcIntgetSize() const
public IlcIntgetValue() const
public IlcIntExp(IlcConstraint bexp)
public IlcBoolisFixed() const
public voidsetMax(IlcInt max) const
public voidsetMin(IlcInt min) const
public voidsetRange(IlcInt min, IlcInt max) const
方法详细信息

IlcIntExp

publicIlcIntExp(IlcConstraint bexp)

CP 优化器中的约束布尔表达式可以看作是一个 0-1(即二进制)约束整数表达式,其中 "IlcFalse对应 0,"IlcTrue对应 1。 该构造函数创建了一个约束整数表达式,该表达式等于参数 "bexp的真值。 换句话说,您可以使用此构造函数将约束条件转换为约束整数表达式。

这样的受约束整数表达式就可以像其他受约束整数表达式一样使用。 因此,我们可以表达约束条件的总和。 例如,下面的代码表达了三个变量不可能都相等的意思。

 m.add((x != y) + (y != z) + (z != x) >= 2);

getMax

publicIlcInt getMax() const

该成员函数返回调用对象域的最大值。


getMin

publicIlcInt getMin() const

该成员函数返回调用对象域的最小值。


getSize

publicIlcInt getSize() const

该成员函数返回调用表达式的域中元素的个数。 特别是,如果调用的约束整数表达式是固定的,则返回 1,如果 "max - min大于 "IlcIntMax,则返回 "IlcIntMax


getValue

publicIlcInt getValue() const

如果调用的约束整数表达式对象是固定的,则该成员函数返回该对象的值;否则,CP 优化器将抛出一个异常("IloCP::Exception实例)。 为避免 "getValue出错,可使用 "isFixed测试表达式。


isFixed

publicIlcBool isFixed() const

如果调用的约束整数表达式是固定的,即其最小值等于最大值,则该成员函数返回 "IlcTrue。 否则,成员函数返回 "IlcFalse


setMax

public voidsetMax(IlcInt max) const

该成员函数从调用约束表达式的域中删除所有大于 "max的元素。 如果域因此变为空,则当前目标失败,引擎返回。 否则,如果域被修改,就会生成范围和域传播事件。 此外,如果调用的受限整数表达式变成固定值,也会产生值传播事件。 该成员函数的效果是可逆的。


setMin

public voidsetMin(IlcInt min) const

该成员函数从调用约束表达式的域中删除所有小于 "min的元素。 如果域因此变为空,则当前目标失败,引擎返回。 否则,如果域被修改,就会生成范围和域传播事件。 此外,如果调用的受限整数表达式变成固定值,也会产生值传播事件。 该成员函数的效果是可逆的。


setRange

public voidsetRange(IlcInt min,IlcInt max) const

该成员函数从调用约束表达式的域中删除所有小于 "min或大于 "max的元素。 如果域因此变空,则当前目标失败,引擎会返回。 否则,如果域被修改,就会生成传播事件 "range和 "domain。 此外,如果调用的受限整数表达式变成固定值,也会产生值传播事件。 该成员函数的效果是可逆的。