跳至主内容
框架 无框架

类IlcIntVar

定义文件: ilcp/cpext.h
包含文件: <ilcp/cpilcp/cp.h
IlcIntVar的地图IlcIntVarIlcIntVarIlcIntExp
用于表示受约束整数变量的类。

在利用 CP 优化器的典型应用中,问题的未知数将以受限变量的形式表示。 最常用的一类受约束变量是受约束整数变量。 IlcIntVar是一组用于表达受约束整数变量的约束条件的类之一。 事实上,"IlcIntVar(受约束整数变量类)是受约束整数表达式类IlcIntExp 的子类。 受约束整数变量是一个受约束整数表达式,其域已明确存储。

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

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

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

您可以通过以下两种方式之一,将受限整数表达式(计算其域)转换为受限整数变量(存储其域):通过转换构造函数或赋值操作符。

域-三角和传播

当受限变量的传播事件被触发时,如果该变量尚未在传播队列中,则会被推入传播队列。 此外,受约束变量域的修改被存储在一个特殊的集合中,称为域-三角洲。 在传播针对该变量所发布的约束期间,可以访问该域增量。 完成处理针对该变量所发布的所有约束后,该域增量随即清除。 如果变量再次被修改,则整个过程重新开始。 域增量的状态可逆。

回溯和可逆性

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

另请参阅:

方法概要
public ILCDEPRECATED IlcIntgetMaxDelta() const
public ILCDEPRECATED IlcIntgetMinDelta() const
public IlcIntgetNextHigher(IlcInt threshold) const
public IlcIntgetNextLower(IlcInt threshold) const
public IlcIntgetOldMax() const
public IlcIntgetOldMin() const
public IlcIntVar()
public IlcIntVar(IlcCPEngine solver, IlcInt min, IlcInt max, const char * name=0)
public IlcIntVar(IlcCPEngine solver, const IlcIntArray values, const char * name=0)
public IlcIntVar(IlcIntVarI * impl)
public IlcIntVar(const IlcIntExp exp)
public IlcBoolisInDelta(IlcInt value) const
public IlcBoolisInDomain(IlcInt value) const
public IlcBoolisInProcess() const
public voidremoveDomain(IlcIntSet set) const
public voidremoveDomain(IlcIntArray array) const
public voidremoveRange(IlcInt min, IlcInt max) const
public voidremoveValue(IlcInt value) const
public voidsetDomain(IlcIntArray array) const
public voidsetDomain(IlcIntSet set) const
public voidsetDomain(IlcIntVar var) const
public voidwhenDomain(const IlcDemon demon) const
public voidwhenRange(const IlcDemon demon) const
public voidwhenValue(const IlcDemon demon) const
从 "IlcIntExp继承的方法
getMax, getMin, getSize, getValue, IlcIntExp, isFixed, setMax, setMin, setRange
方法详细信息

IlcIntVar

publicIlcIntVar()

该构造函数会创建一个空的受约束整数变量,即其句柄指针为空。 然后,在使用该对象之前,必须对其进行赋值,这与开发人员声明指针时的操作完全相同。


IlcIntVar

public 'IlcIntVar( 'IlcCPEngine'求解器, 'IlcInt'分钟, 'IlcInt'最大, const char * '名字=0)

该构造函数创建了一个受限整数变量,其域包含 "min和 "max之间(含)的所有整数值。 如果 "min大于 "max,则调用函数 "IlcFail。 如果提供了可选参数 "name,它将成为受限整数变量的名称。

为避免在 64 位架构上出现潜在问题,我们建议 "min和 "max在 "[IlcIntMin ...IlcIntMax]范围内。

例如,要创建域为 "[0 ... 10]的受约束整数变量,请使用构造函数:

 IlcIntVarvar (cp, 0, 10);
 

IlcIntVar

public 'IlcIntVar( 'IlcCPEngine'求解器, const 'IlcIntArray'价值观, const char * '名字=0)

如果要创建一个域不是整数区间的受约束整数变量,这个构造函数会创建一个受约束整数变量,它的域恰好包含属于整数数组 "values的整数。 如果提供了可选参数 "name,它将成为受限整数变量的名称。

为避免在 64 位架构上出现潜在问题,我们建议整数范围为 "[IlcIntMin ...IlcIntMax]

使用该构造函数可以创建一个域为非连续整数的受约束整数变量:

 IlcIntArray值(cp、10、28、45、65、78、90、102、113、
                     123, 123, 138);
 IlcIntVar aVar(cp,值);

IlcIntVar

publicIlcIntVar(IlcIntVarI *impl)

This constructor creates a handle object (an instance of the classIlcIntVar) from a pointer to an object (an instance of the class IlcIntVarI.


IlcIntVar

publicIlcIntVar(constIlcIntExp exp)

此构造函数通过受限整数表达式创建一个受限整数变量。 新创建的变量有一个相关域,该域将与 "exp的计算边界保持一致。


getMaxDelta

public ILCDEPRECATEDIlcInt getMaxDelta() const

该成员函数在 CP Optimizer2.2 中已被弃用。

该成员函数返回调用约束变量的域最大值与其域-delta 最大值之间的差值。 该成员函数只能应用于当前处理中的变量。

例如,要知道自上次处理 "x上的约束条件以来,约束整数变量 "x的最大值是否被修改,只需测试 "x.getMaxDelta()的值即可。 如果测试结果为 0,则说明 "x的最大值未被修改。


getMinDelta

public ILCDEPRECATEDIlcInt getMinDelta() const

该成员函数在 CP Optimizer2.2 中已被弃用。

该成员函数返回调用约束变量的域最小值与其域-delta 最小值之间的差值。 该成员函数只能应用于当前处理中的变量。

例如,要知道自上次处理 "x上的约束条件以来,约束整数变量 "x的最小值是否被修改,只需测试 "x.getMinDelta()的值即可。 如果测试结果为 0,则说明 "x的最小值未被修改。


getNextHigher

publicIlcInt getNextHigher(IlcInt threshold) const

如果 "threshold大于或等于调用约束整数表达式域的最大值,则该成员函数返回 "threshold。 否则,它将返回调用约束整数表达式域中第一个严格大于 "threshold的元素。


getNextLower

publicIlcInt getNextLower(IlcInt threshold) const

如果 "threshold小于或等于调用约束整数表达式域的最小值,则该成员函数返回 "threshold。 否则,它将返回调用约束整数表达式域中第一个严格小于 "threshold的元素。


getOldMax

publicIlcInt getOldMax() const

该成员函数返回调用约束变量的域-三角洲最大值。 该成员函数只能应用于当前处理中的变量。


getOldMin

publicIlcInt getOldMin() const

该成员函数返回调用约束变量的域-三角洲最小值。 该成员函数只能应用于当前处理中的变量。


isInDelta

publicIlcBool isInDelta(IlcInt value) const

This member function returns IlcTrue if the argument value belongs to the domain-delta of the invoking constrained variable. 该成员函数只能应用于当前处理中的变量。


isInDomain

publicIlcBool isInDomain(IlcInt value) const

This member function returns IlcTrue if value is in the domain of the invoking constrained integer expression. 否则,成员函数返回 "IlcFalse


isInProcess

publicIlcBool isInProcess() const

如果调用的约束变量当前正在被约束传播算法处理,则该成员函数返回 "IlcTrue。 同一时间只能有一个变量在处理中。


removeDomain

public voidremoveDomain(IlcIntSet set) const

该成员函数从调用约束表达式的域中删除 "set所指集合的所有元素。 如果域因此变为空,则当前目标失败,引擎返回。 否则,如果域被修改,就会产生相应的传播事件。 该成员函数的效果是可逆的。


removeDomain

public voidremoveDomain(IlcIntArray array) const

该成员函数从调用约束表达式的域中删除 "array所指数组的所有元素。 如果域因此变为空,则成员当前目标失败,引擎会返回。 否则,如果域被修改,就会产生相应的传播事件。 该成员函数的效果是可逆的。


removeRange

public voidremoveRange(IlcInt min,IlcInt max) const

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


removeValue

public voidremoveValue(IlcInt value) const

该成员函数将 "value从调用约束表达式的域中删除。 如果域因此为空,则调用成员函数 "IlcCPEngine::fail。 否则,如果域被修改,就会生成域传播事件。 如果 "value是域的边界之一,那么也会产生范围传播事件。 此外,如果调用的受限整数表达式变成固定值,也会产生值传播事件。 该成员函数的效果是可逆的。


setDomain

public voidsetDomain(IlcIntArray array) const

该成员函数从调用约束表达式的域中删除所有不在 "array所指数组中的元素。 如果域因此变为空,则当前目标失败,引擎返回。 否则,如果域被修改,就会产生相应的传播事件。 该成员函数的效果是可逆的。


setDomain

public voidsetDomain(IlcIntSet set) const

该成员函数从调用约束表达式的域中删除所有不在 "set所指示集合中的元素。 如果域因此变为空,则当前目标失败,引擎返回。 否则,如果域被修改,就会产生相应的传播事件。 该成员函数的效果是可逆的。


setDomain

public voidsetDomain(IlcIntVarvar) const

该成员函数从调用约束表达式的域中删除所有不在 "var域中的元素。 如果域因此变为空,则当前目标失败,引擎返回。 否则,如果域被修改,就会产生相应的传播事件。 该成员函数的效果是可逆的。


whenDomain

public voidwhenDomain(constIlcDemon demon) const

该成员函数将 "demon与调用约束表达式的域事件相关联。 每当调用约束表达式的域发生变化时,恶魔就会立即执行。

由于约束也是恶魔,因此约束也可以作为参数传递给该成员函数。 只要调用的约束表达式的域发生变化,约束就会传播。


whenRange

public voidwhenRange(constIlcDemon demon) const

此成员函数将 "demon与调用约束表达式的范围事件关联。 每当调用约束表达式的域的某个边界发生变化时,恶魔就会立即执行。

由于约束也是恶魔,因此约束也可以作为参数传递给该成员函数。 每当调用约束表达式的域的某个边界发生变化时,该约束就会传播。


whenValue

public voidwhenValue(constIlcDemon demon) const

该成员函数将 "demon与调用约束表达式的值事件相关联。 只要调用的约束表达式变得固定,恶魔就会立即执行。

由于约束也是恶魔,因此约束也可以作为参数传递给该成员函数。 只要调用的约束表达式变得固定,约束就会传播。