| 概述 | 组 | 树 | 图形 | 不推荐 | 索引 | 概念 |

在利用 CP 优化器的典型应用中,问题的未知数将以受限变量的形式表示。 最常用的一类受约束变量是受约束整数变量。 IlcIntVar是一组用于表达受约束整数变量的约束条件的类之一。 事实上,"IlcIntVar(受约束整数变量类)是受约束整数表达式类IlcIntExp 的子类。 受约束整数变量是一个受约束整数表达式,其域已明确存储。
该类中的大多数成员函数都包含 "assert语句。 有关宏 "NDEBUG(打开或关闭这些 "assert语句的方法)的解释,请参阅Assert 和 NDEBUG 概念。
域
受约束整数表达式的域由其子表达式的域计算得出。 例如,表达式 "x+y的域包含范围 "[x.getMin()+y.getMin(),
x.getMax()+y.getMax()]。
受约束整数变量是一种受约束表达式,它存储其域,而不是从子表达式中计算域。 受约束整数变量的域包含 "IlcInt类型的值。 如果数值是连续的,该域用区间表示,否则用整数枚举表示。
您可以通过以下两种方式之一,将受限整数表达式(计算其域)转换为受限整数变量(存储其域):通过转换构造函数或赋值操作符。
域-三角和传播
当受限变量的传播事件被触发时,如果该变量尚未在传播队列中,则会被推入传播队列。 此外,受约束变量域的修改被存储在一个特殊的集合中,称为域-三角洲。 在传播针对该变量所发布的约束期间,可以访问该域增量。 完成处理针对该变量所发布的所有约束后,该域增量随即清除。 如果变量再次被修改,则整个过程重新开始。 域增量的状态可逆。
回溯和可逆性
为该类定义的、能够修改受约束变量的所有成员函数和运算符都是可逆的。 特别是,约束发布函数所做的更改是通过可逆赋值进行的。 因此,当 CP 优化器回溯时,任何受限变量的值、域和约束条件都会恢复。
另请参阅:
IlcIntExp,IlcIntExpIterator,IlcIntVarArray,IlcIntVarDeltaIterator
| 方法概要 | |
|---|---|
public ILCDEPRECATED IlcInt | getMaxDelta() const |
public ILCDEPRECATED IlcInt | getMinDelta() const |
public IlcInt | getNextHigher(IlcInt threshold) const |
public IlcInt | getNextLower(IlcInt threshold) const |
public IlcInt | getOldMax() const |
public IlcInt | getOldMin() 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 IlcBool | isInDelta(IlcInt value) const |
public IlcBool | isInDomain(IlcInt value) const |
public IlcBool | isInProcess() const |
public void | removeDomain(IlcIntSet set) const |
public void | removeDomain(IlcIntArray array) const |
public void | removeRange(IlcInt min, IlcInt max) const |
public void | removeValue(IlcInt value) const |
public void | setDomain(IlcIntArray array) const |
public void | setDomain(IlcIntSet set) const |
public void | setDomain(IlcIntVar var) const |
public void | whenDomain(const IlcDemon demon) const |
public void | whenRange(const IlcDemon demon) const |
public void | whenValue(const IlcDemon demon) const |
从 "IlcIntExp继承的方法 |
|---|
getMax, getMin, getSize, getValue, IlcIntExp, isFixed, setMax, setMin, setRange |
| 方法详细信息 |
|---|
该构造函数会创建一个空的受约束整数变量,即其句柄指针为空。 然后,在使用该对象之前,必须对其进行赋值,这与开发人员声明指针时的操作完全相同。
该构造函数创建了一个受限整数变量,其域包含 "min和 "max之间(含)的所有整数值。 如果 "min大于 "max,则调用函数 "IlcFail。 如果提供了可选参数 "name,它将成为受限整数变量的名称。
为避免在 64 位架构上出现潜在问题,我们建议 "min和 "max在 "[IlcIntMin ...IlcIntMax]范围内。
例如,要创建域为 "[0 ... 10]的受约束整数变量,请使用构造函数:
IlcIntVarvar (cp, 0, 10);
如果要创建一个域不是整数区间的受约束整数变量,这个构造函数会创建一个受约束整数变量,它的域恰好包含属于整数数组 "values的整数。 如果提供了可选参数 "name,它将成为受限整数变量的名称。
为避免在 64 位架构上出现潜在问题,我们建议整数范围为 "[IlcIntMin ...IlcIntMax]。
使用该构造函数可以创建一个域为非连续整数的受约束整数变量:
IlcIntArray值(cp、10、28、45、65、78、90、102、113、
123, 123, 138);
IlcIntVar aVar(cp,值);This constructor creates a handle object (an instance of the classIlcIntVar) from a pointer to an object (an instance of the class IlcIntVarI.
此构造函数通过受限整数表达式创建一个受限整数变量。 新创建的变量有一个相关域,该域将与 "exp的计算边界保持一致。
该成员函数在 CP Optimizer2.2 中已被弃用。
该成员函数返回调用约束变量的域最大值与其域-delta 最大值之间的差值。 该成员函数只能应用于当前处理中的变量。
例如,要知道自上次处理 "x上的约束条件以来,约束整数变量 "x的最大值是否被修改,只需测试 "x.getMaxDelta()的值即可。 如果测试结果为 0,则说明 "x的最大值未被修改。
该成员函数在 CP Optimizer2.2 中已被弃用。
该成员函数返回调用约束变量的域最小值与其域-delta 最小值之间的差值。 该成员函数只能应用于当前处理中的变量。
例如,要知道自上次处理 "x上的约束条件以来,约束整数变量 "x的最小值是否被修改,只需测试 "x.getMinDelta()的值即可。 如果测试结果为 0,则说明 "x的最小值未被修改。
如果 "threshold大于或等于调用约束整数表达式域的最大值,则该成员函数返回 "threshold。 否则,它将返回调用约束整数表达式域中第一个严格大于 "threshold的元素。
如果 "threshold小于或等于调用约束整数表达式域的最小值,则该成员函数返回 "threshold。 否则,它将返回调用约束整数表达式域中第一个严格小于 "threshold的元素。
该成员函数返回调用约束变量的域-三角洲最大值。 该成员函数只能应用于当前处理中的变量。
该成员函数返回调用约束变量的域-三角洲最小值。 该成员函数只能应用于当前处理中的变量。
This member function returns IlcTrue if the argument value belongs to the domain-delta of the invoking constrained variable. 该成员函数只能应用于当前处理中的变量。
This member function returns IlcTrue if value is in the domain of the invoking constrained integer expression. 否则,成员函数返回 "IlcFalse。
如果调用的约束变量当前正在被约束传播算法处理,则该成员函数返回 "IlcTrue。 同一时间只能有一个变量在处理中。
该成员函数从调用约束表达式的域中删除 "set所指集合的所有元素。 如果域因此变为空,则当前目标失败,引擎返回。 否则,如果域被修改,就会产生相应的传播事件。 该成员函数的效果是可逆的。
该成员函数从调用约束表达式的域中删除 "array所指数组的所有元素。 如果域因此变为空,则成员当前目标失败,引擎会返回。 否则,如果域被修改,就会产生相应的传播事件。 该成员函数的效果是可逆的。
该成员函数从调用约束表达式的域中删除所有大于或等于 "min且小于或等于 "max的元素。 如果域因此变为空,则当前目标失败,引擎返回。 否则,如果域被修改,就会生成域传播事件。 如果 "min或 "max是域的边界之一,则也会产生范围传播事件。 此外,如果调用的受限整数表达式变成固定值,也会产生值传播事件。 该成员函数的效果是可逆的。
该成员函数将 "value从调用约束表达式的域中删除。 如果域因此为空,则调用成员函数 "IlcCPEngine::fail。 否则,如果域被修改,就会生成域传播事件。 如果 "value是域的边界之一,那么也会产生范围传播事件。 此外,如果调用的受限整数表达式变成固定值,也会产生值传播事件。 该成员函数的效果是可逆的。
该成员函数从调用约束表达式的域中删除所有不在 "array所指数组中的元素。 如果域因此变为空,则当前目标失败,引擎返回。 否则,如果域被修改,就会产生相应的传播事件。 该成员函数的效果是可逆的。
该成员函数从调用约束表达式的域中删除所有不在 "set所指示集合中的元素。 如果域因此变为空,则当前目标失败,引擎返回。 否则,如果域被修改,就会产生相应的传播事件。 该成员函数的效果是可逆的。
该成员函数从调用约束表达式的域中删除所有不在 "var域中的元素。 如果域因此变为空,则当前目标失败,引擎返回。 否则,如果域被修改,就会产生相应的传播事件。 该成员函数的效果是可逆的。
该成员函数将 "demon与调用约束表达式的域事件相关联。 每当调用约束表达式的域发生变化时,恶魔就会立即执行。
由于约束也是恶魔,因此约束也可以作为参数传递给该成员函数。 只要调用的约束表达式的域发生变化,约束就会传播。
此成员函数将 "demon与调用约束表达式的范围事件关联。 每当调用约束表达式的域的某个边界发生变化时,恶魔就会立即执行。
由于约束也是恶魔,因此约束也可以作为参数传递给该成员函数。 每当调用约束表达式的域的某个边界发生变化时,该约束就会传播。
该成员函数将 "demon与调用约束表达式的值事件相关联。 只要调用的约束表达式变得固定,恶魔就会立即执行。
由于约束也是恶魔,因此约束也可以作为参数传递给该成员函数。 只要调用的约束表达式变得固定,约束就会传播。