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

类 "IlcFloatVar是 "IlcFloatExp的子类。 受约束浮点变量("IlcFloatVar的实例)是一个存储其域(而不是从其子表达式的域中计算域)的受约束浮点表达式。 受约束浮点变量的域包含 "IlcFloat类型的值。
该类中的大多数成员函数都包含 "assert语句。 有关宏 "NDEBUG(打开或关闭这些 "assert语句的方法)的解释,请参阅Assert 和 NDEBUG 概念。
通常,在浮点变量中,域中元素的数量非常多(一般为数百万)。 因此,CP 优化器将一个区间与变量关联起来,以表示其域。 对浮点变量域中的元素进行计数是不现实的,因此没有遍历连续浮点变量域的迭代器。
FAILURE
如果域的边界相同,且等于负无穷大或正无穷大,则会触发故障,因为此时不可能有有限解。 例如,下面的声明就可能出现这种情况:
IlcFloatVarxcp,0,10); IlcFloatVar y=IlcLog(x); cp.add( x == 0);
由于 "y的最小和最大边界等于负无穷大,因此这些行会导致失败。
域-三角和传播
当受限变量的传播事件被触发时,如果该变量尚未在传播队列中,则会被推入传播队列。 此外,受约束变量域的修改被存储在一个特殊的集合中,称为域-三角洲。 在传播针对该变量所发布的约束期间,可以访问该域增量。 完成处理针对该变量所发布的所有约束后,该域增量随即清除。 如果变量再次被修改,则整个过程重新开始。 域增量的状态可逆。
回溯和可逆性
为该类定义的、能够修改受约束变量的所有成员函数和运算符都是可逆的。 特别是,约束发布函数所做的更改是通过可逆赋值进行的。 因此,当 CP 优化器回溯时,任何受限变量的值、域和约束条件都会恢复。
另请参阅:
IlcFloat,IlcFloatExp,IlcFloatVarArray
| 方法概要 | |
|---|---|
public IlcFloat | getMax() const |
public ILCDEPRECATED IlcFloat | getMaxDelta() const |
public IlcFloat | getMin() const |
public ILCDEPRECATED IlcFloat | getMinDelta() const |
public IlcFloat | getOldMax() const |
public IlcFloat | getOldMin() const |
public | IlcFloatVar() |
public | IlcFloatVar(IlcCPEngine solver, IlcFloat min, IlcFloat max, const char * name=0) |
public | IlcFloatVar(IlcCPEngine solver, IlcFloat min, IlcFloat max, IlcFloat precision, const char * name=0) |
public | IlcFloatVar(IlcFloatVarI * impl) |
public | IlcFloatVar(IlcIntVar var) |
public | IlcFloatVar(const IlcFloatExp exp) |
public IlcBool | isInDelta(IlcFloat value) const |
public IlcBool | isInProcess() const |
public void | operator=(IlcFloatExp exp) |
public void | whenRange(const IlcDemon demon) const |
public void | whenValue(const IlcDemon demon) const |
从 "IlcFloatExp继承的方法 |
|---|
display, getMax, getMin, getPrecision, getSize, IlcFloatExp, isFixed, isInDomain, setMax, setMin, setPrecision, setRange |
| 方法详细信息 |
|---|
该构造函数创建一个空的受约束浮点变量,即其句柄指针为空。 然后,在使用该对象之前,必须对其进行赋值,这与开发人员声明指针时的操作完全相同。 要检查浮点变量是否为空,请使用成员函数 "IlcFloatExp::getImpl。
该构造函数创建了一个连续受约束浮点变量,其域包含 "min和 "max之间(含)的所有浮点数值。 如果 "min大于 "max,则调用函数 "IlcFail。 如果提供了可选参数 "name,它将成为受约束浮点变量的名称。 与受约束浮点变量相关的精度将是 CP 优化器的默认精度。
该构造函数创建了一个连续受约束浮点变量,其域包含 "min和 "max之间(含)的所有浮点数值。 如果 "min大于 "max,则调用函数 "IlcFail。 参数 "precision成为与受约束浮点变量相关的精度。 如果提供了可选参数 "name,它将成为受约束浮点变量的名称。
例如,下面是如何创建一个最小值为 0、最大值为 10 并带有名称的受约束浮点变量。
IlcFloatVarx(求解器,0,10,"x");
下面介绍如何创建一个相关精度为 10-4 的受约束浮点变量。
IlcFloatVarx(求解器,0,100,1e-4);
您可以像这样同时指定名称和精度:
IlcFloatVarx(求解器,-100,100,1e-4,"x");
This constructor creates a handle object (an instance of the class IlcFloatVar) from a pointer to an object (an instance of the class IlcFloatVarI).
该构造函数创建了一个 "IlcFloatVar类的实例。 该实例必须等于参数 "var。
该构造函数通过受限整数表达式创建一个受限浮点变量。 新创建的变量有一个相关域,该域将与 "exp的计算边界保持一致。
该成员函数返回调用对象域的最大值。
该成员函数在 CP Optimizer2.2 中已被弃用。
该成员函数返回调用约束变量的域最大值与其域-delta 最大值之间的差值。 该成员函数只能应用于当前处理中的变量。
该成员函数返回调用对象域的最小值。
该成员函数在 CP Optimizer2.2 中已被弃用。
该成员函数返回调用约束变量的域最小值与其域-delta 最小值之间的差值。 该成员函数只能应用于当前处理中的变量。
例如,要知道自上次处理 "x上张贴的约束条件以来,约束浮点变量 "x的最小值是否被修改,只需测试 "x.getMinDelta()的值即可。 如果测试结果为 0,则说明 "x的最小值未被修改。
该成员函数返回调用约束变量的域-三角洲最大值。 该成员函数只能应用于当前处理中的变量。
该成员函数返回调用约束变量的域-三角洲最小值。 该成员函数只能应用于当前处理中的变量。
This member function returns IlcTrue if the argument value belongs to the domain-delta of the invoking constrained variable. 该成员函数只能应用于当前处理中的变量。
如果调用的约束变量当前正在被约束传播算法处理,则该成员函数返回 "IlcTrue。 同一时间只能有一个变量在处理中。
该操作符为调用对象的句柄指针分配一个地址。 该地址是参数 "exp的执行对象的位置。 执行此操作符后,调用对象和 "exp都指向同一个执行对象。 此外,这个赋值运算符将域与受约束浮点表达式 "exp相关联,从而将其转换为受约束浮点变量。
此成员函数将 "demon与调用约束表达式的范围事件关联。 每当调用约束表达式的域的某个边界发生变化时,恶魔就会立即执行。
由于约束也是恶魔,因此约束也可以作为参数传递给该成员函数。 每当调用约束表达式的域的边界之一发生变化时,约束就会传播。
该成员函数将 "demon与调用约束表达式的值事件相关联。 只要调用的约束表达式变得固定,恶魔就会立即执行。
由于约束也是恶魔,因此约束也可以作为参数传递给该成员函数。 只要调用的约束表达式变得固定,约束就会传播。