跳至主内容
框架 无框架

类IlcFloatVar

定义文件: ilcp/cpext.h
包含文件: <ilcp/cpextilcp/cpext.h
IlcFloatVar的地图IlcFloatVarIlcFloatVarIlcFloatExp
用于表示受约束浮点变量的类。

类 "IlcFloatVar是 "IlcFloatExp的子类。 受约束浮点变量("IlcFloatVar的实例)是一个存储其域(而不是从其子表达式的域中计算域)的受约束浮点表达式。 受约束浮点变量的域包含 "IlcFloat类型的值。

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

通常,在浮点变量中,域中元素的数量非常多(一般为数百万)。 因此,CP 优化器将一个区间与变量关联起来,以表示其域。 对浮点变量域中的元素进行计数是不现实的,因此没有遍历连续浮点变量域的迭代器。

FAILURE

如果域的边界相同,且等于负无穷大或正无穷大,则会触发故障,因为此时不可能有有限解。 例如,下面的声明就可能出现这种情况:

 IlcFloatVarxcp,0,10);
 IlcFloatVar y=IlcLog(x);
 cp.add( x == 0);

由于 "y的最小和最大边界等于负无穷大,因此这些行会导致失败。

域-三角和传播

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

回溯和可逆性

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

另请参阅:

方法概要
public IlcFloatgetMax() const
public ILCDEPRECATED IlcFloatgetMaxDelta() const
public IlcFloatgetMin() const
public ILCDEPRECATED IlcFloatgetMinDelta() const
public IlcFloatgetOldMax() const
public IlcFloatgetOldMin() 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 IlcBoolisInDelta(IlcFloat value) const
public IlcBoolisInProcess() const
public voidoperator=(IlcFloatExp exp)
public voidwhenRange(const IlcDemon demon) const
public voidwhenValue(const IlcDemon demon) const
从 "IlcFloatExp继承的方法
display, getMax, getMin, getPrecision, getSize, IlcFloatExp, isFixed, isInDomain, setMax, setMin, setPrecision, setRange
方法详细信息

IlcFloatVar

publicIlcFloatVar()

该构造函数创建一个空的受约束浮点变量,即其句柄指针为空。 然后,在使用该对象之前,必须对其进行赋值,这与开发人员声明指针时的操作完全相同。 要检查浮点变量是否为空,请使用成员函数 "IlcFloatExp::getImpl


IlcFloatVar

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

该构造函数创建了一个连续受约束浮点变量,其域包含 "min和 "max之间(含)的所有浮点数值。 如果 "min大于 "max,则调用函数 "IlcFail。 如果提供了可选参数 "name,它将成为受约束浮点变量的名称。 与受约束浮点变量相关的精度将是 CP 优化器的默认精度。


IlcFloatVar

public 'IlcFloatVar( 'IlcCPEngine'求解器, 'IlcFloat'分钟, 'IlcFloat'最大, 'IlcFloat'精确度, const char * '名字=0)

该构造函数创建了一个连续受约束浮点变量,其域包含 "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");

IlcFloatVar

publicIlcFloatVar(IlcFloatVarI *impl)

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

publicIlcFloatVar(IlcIntVar var)

该构造函数创建了一个 "IlcFloatVar类的实例。 该实例必须等于参数 "var


IlcFloatVar

publicIlcFloatVar(constIlcFloatExp exp)

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


getMax

公共IlcFloat getMax() 常量

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


getMaxDelta

public ILCDEPRECATEDIlcFloat getMaxDelta() const

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

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


getMin

publicIlcFloat getMin() const

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


getMinDelta

public ILCDEPRECATEDIlcFloat getMinDelta() const

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

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

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


getOldMax

publicIlcFloat getOldMax() const

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


getOldMin

publicIlcFloat getOldMin() const

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


isInDelta

publicIlcBool isInDelta(IlcFloat value) const

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


isInProcess

publicIlcBool isInProcess() const

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


Operator=

public voidoperator=IlcFloatExp exp)

该操作符为调用对象的句柄指针分配一个地址。 该地址是参数 "exp的执行对象的位置。 执行此操作符后,调用对象和 "exp都指向同一个执行对象。 此外,这个赋值运算符将域与受约束浮点表达式 "exp相关联,从而将其转换为受约束浮点变量。


whenRange

public voidwhenRange(constIlcDemon demon) const

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

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


whenValue

public voidwhenValue(constIlcDemon demon) const

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

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