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

约束是 CP 优化器中的一个对象。 与 CP Optimizer 中的其他实体一样,约束也是通过两个类来实现的:一个处理类和一个实现类。 换句话说,类 "IlcConstraint(句柄)的实例包含一个数据成员(句柄指针),该数据成员指向类 "IlcConstraintI(其实现对象)的实例。
该类中的两个成员函数实际上实现了约束的语义:"isViolated和 "propagate。 在定义新的约束类时,必须定义成员函数 "propagate。 该成员函数定义了受约束变量的域必须如何被约束缩小。 (通常不一定要定义 "isViolated)。 如果要在布尔公式中将新的约束类别用作 "元约束),则必须对其进行定义
在发布约束时必须将其存储起来,以便以后传播算法可以使用。 为此,必须定义成员函数 "post。 换句话说,如果要定义一个新的约束类,在定义其实现类时,必须同时定义这个 "post成员函数。
约束条件可在布尔公式中使用。 换句话说,你可以通过常用的布尔运算符来组合约束条件,从而产生其他约束条件。 为了以这种方式使用约束条件,如果要定义新的约束条件类,则必须定义成员函数 "metaPostDemon、"makeOpposite和 "isViolated"。
更多信息,请参阅CP 优化器中的传播和CP 优化器中的传播事件概念。
另请参阅:
IlcConstraint,ILCCTDEMON0 IlcDemonI,IlcGoalI
| 方法概要 | |
|---|---|
public virtual void | display(ostream &) const |
public void | fail(IlcAny label=0) |
public | IlcConstraintI(IlcCPEngine cp) |
public virtual IlcBool | isAConstraint() const |
public virtual IlcBool | isViolated() const |
public virtual IlcConstraintI * | makeOpposite() const |
public virtual void | metaPostDemon(IlcDemonI * demon) |
public virtual void | post() |
public virtual void | propagate() |
public void | push() |
从 "IlcDemonI继承的方法 |
|---|
getConstraintI, getCPEngine, IlcDemonI, isAConstraint, propagate |
| 方法详细信息 |
|---|
该构造函数创建一个约束实现。 由于这是一个抽象类,因此不应直接调用该构造函数。 子类的构造函数将调用该构造函数。
默认情况下,该虚拟成员函数会将调用约束的名称(如果有名称的话)放到参数指示的输出流中;如果调用约束没有名称,该虚拟成员函数会将字符串 "IlcConstraintI放到输出流中。 当然,在定义新的约束类别时,可以重新定义这种行为。
该成员函数会导致调用约束在 "label所指示的选择点失败。
该虚拟成员函数由 "IlcDemon重载,返回 "IloTrue。
如果该成员函数返回 "IlcTrue,则无法满足调用约束。 即使无法满足约束条件,该成员函数也可能返回 "IlcFalse。 但是,如果有可能满足约束条件,则绝对不能返回 "IlcTrue。 在这种情况下,函数应返回 "IlcFalse。 根据这一注释,类 "IlcConstraintI中为该成员函数定义的默认行为是返回 "IlcFalse。
由于该虚拟成员函数实现了调用约束条件的部分语义,因此在定义新的约束条件类别时,并非必须在所有情况下重新定义该函数。 如果要在布尔表达式中使用新类的实例,就必须使用该类的逻辑布尔运算符 "IlcConstraint。
约束的否定也是约束。 从语义上讲,这个虚拟成员函数表达了这一原则。 调用它是为了创建调用约束的否定。 如果要在布尔表达式中使用约束条件实例,则必须在定义新约束条件类时定义该虚拟成员函数,如 "IlcConstraint类逻辑布尔运算符的说明。
当布尔表达式张贴在约束条件上时,每当其中一个约束条件的真值发生变化时,就必须检查该表达式。 也就是说,在表达式中出现的约束条件上发布了一个约束条件。 由于它是对约束的约束,我们称之为元约束。 如果计划在布尔表达式中使用新约束条件类的实例,则必须在定义新约束条件类时定义虚拟成员函数 "metaPostDemon,正如对逻辑布尔运算符类 "IlcConstraint的解释一样。
调用此虚拟成员函数是为了在调用的约束条件上发布其参数--元aconstraint。 元约束应与调用约束中出现的表达式的所有传播事件相关联,这些传播事件可能导致调用约束的不满足性。 通常,这些传播事件与 "post成员函数中使用的事件相同。
因此,"metaPostDemon的实现与 "post的实现非常相似。 主要区别在于,"metaPostDemon将传播事件与作为参数传递的demon相关联,而 "post将传播事件与调用约束相关联。
该成员函数必须将调用约束与它所约束的变量触发的传播事件相关联。 这种关联由成员函数 "whenValue、"whenDomain和 "whenRange"(类的成员函数 "IlcIntVar"、"IlcFloatVar等)执行。
我们强烈建议您不要修改该成员函数范围内的变量。 换句话说,在定义此虚拟成员函数时,不应调用受限变量的修改器。
在定义新的约束条件类别时,必须重新定义该纯虚拟成员函数。 它定义了调用约束时必须如何缩小受约束变量的域。 初始约束传播算法调用它来执行调用约束的传播。 该成员函数应删除无法满足调用约束的值,从而缩小调用约束所涉及的约束变量的域。
您不应在成员函数 * 'IlcConstraintI::propagate 中调用'IlcCPEngine::solve。
该成员函数将调用的约束推送到约束队列。 推送约束后,调用约束的 "IlcConstraintI::propagate方法将在当前一轮约束传播过程中被调用。