跳至主内容
框架 无框架

类IloPropagatorI

定义文件: ilcp/cpext.h
包含文件: <ilcp/cpilcp/cp.h
IloPropagatorI的地图IloPropagatorIIloPropagatorI
用于创建自定义约束的类。

IloPropagatorI类提供了一种定义自定义约束的简单方法,即通过一些 C++ 代码定义传播规则。 为此,您可以创建自己的 "IloPropagatorI子类。

编写自定义约束条件通常有两个原因。 其一是 CP 优化器不具备表达约束所需的建模功能,而且 "IloAllowedAssignments和 "IloForbiddenAssignments的效率不高(例如,所需的图元数量过多)。 第二个原因是有机会执行比 CP 优化器通常执行的更强的推论(传播)。 例如,同一个表达式在一个约束条件的多个地方使用,就会出现这种情况。

IloPropagatorI类的接口非常简单,只需定义一个虚拟函数 "execute即可执行所需的传播。 此外,您还必须明确说明约束涉及哪些变量。 每当您确定的某个变量改变其域时,传播器就会被调用。

下面的代码展示了如何编写一个传播器来保持整数变量的符号 (-1表示严格意义上的负数,+1 表示严格意义上的正数,0 表示零)。

   classSignI: publicIloPropagatorI{
   private:
     IloIntVar _x;
     IloIntVar_sgn;
   public:
     SignI(IloIntVarx,IloIntVarsgn)
       :IloPropagatorI(x.getEnv()), _x(x), _sgn(sgn) {
       addVar(x);
       addVar(sgn);
     }
     void execute() {
       if (!isInDomain(_sgn,'-1))'setMin(_x,0);
       if (!isInDomain(_sgn,+1))setMax(_x,0);
       if (!isInDomain(_sgn,0)) 'removeValue(_x,0);

       if (getMin(_x) >= 0) 'removeValue(_sgn,'-1) ;
       ifgetMax(_x) <= 0)removeValue(_sgn,+1);
     }
     IloPropagatorI* makeClone(IloEnvenv) const {
       返回新的 (env)SignI(_x,_sgn);
     }
   };
 

对传播器内部变量的所有修改都会被缓冲。 这意味着您对变量域做出的更改在传播器内不可视,但是将被记录并且在传播器退出时应用。 如果代码在修改变量后检查变量的域,则需要注意这一点。 例如,以下代码不会导致断言失败,但当传播器退出时,"_x的最小值将被设置为大于其当前值。

    IlcIntmin =getMin(_x);
    setMin(_x, min + 1);
    assert(getMin(_x) == min);
 

使用 "IloPropagatorI创建的约束不能用作表达式,只能用作顶层约束。

另请参阅:

方法概要
public voidaddVar(IloNumVar var)
public virtual voidexecute()
public IloIntgetDomainSize(IloNumVar var) const
public IloNumgetMax(IloNumVar var) const
public IloNumgetMin(IloNumVar var) const
public IloNumgetValue(IloNumVar var) const
public IloPropagatorI(IloEnv env)
public IloBoolisFixed(IloNumVar var) const
public IloBoolisInDomain(IloNumVar var, IloInt value) const
public IloCPEngine::IntVarIteratoriterator(IloNumVar var)
public virtual IloPropagatorI *makeClone(IloEnv env) const
public voidremoveValue(IloIntVar var, IloInt value)
public voidsetMax(IloNumVar var, IloNum max)
public voidsetMin(IloNumVar var, IloNum min)
public voidsetRange(IloNumVar var, IloNum min, IloNum max)
public voidsetValue(IloNumVar var, IloNum value)
public voidviolate()
public ~IloPropagatorI()
方法详细信息

IloPropagatorI

publicIloPropagatorI(IloEnv env)

传播器的构造函数需要一个环境 "env


~IloPropagatorI

公共~IloPropagatorI()

由于 "IloPropagatorI是一个抽象类,因此提供了一个虚拟析构函数。


addVar

public voidaddVar(IloNumVar var)

该函数应在 "IloPropagatorI子类的构造函数中为您定义的自定义约束中涉及的每个变量调用。


执行

public virtual voidexecute()

在对 "IloPropagatorI类进行子类化以创建自己的自定义约束时,您需要定义执行函数。 在子类中重载该函数时,该函数应更新约束变量的域,使其保持一致。


getDomainSize

publicIloInt getDomainSize(IloNumVar var) const

成员函数返回变量 "var的域元素个数。 请注意,由于域修改是在传播器内缓冲的,因此该值不包括自输入传播器的 "execute方法后所做的域修改。


getMax

publicIloNum getMax(IloNumVar var) const

成员函数返回变量 "var域的最大值。 请注意,由于域修改是在传播器内缓冲的,因此该值不包括自输入传播器的 "execute方法后所做的域修改。


getMin

publicIloNum getMin(IloNumVar var) const

成员函数返回变量 "var域的最小值。 请注意,由于域修改是在传播器内缓冲的,因此该值不包括自输入传播器的 "execute方法后所做的域修改。


getValue

publicIloNum getValue(IloNumVar var) const

成员函数返回变量 "var的值。 如果 "var在进入 "execute函数时没有固定,则会出现异常。


isFixed

publicIloBool isFixed(IloNumVar var) const

该成员函数用于确定变量 "var是否固定为某一数值。 需要注意的是,由于域修改在传播器内部被缓冲,因此只有当 "var在进入传播器的 "execute方法时被固定时,该函数才会返回 true。


isInDomain

publicIloBool isInDomain(IloNumVar var,IloInt value) const

该成员函数用于判断值 "value是否在变量 "var的当前域中。 Note that as domain modifications are buffered inside propagators, this function will return true if var had value in its domain on entry to the execute method of the propagator. This is the case even if that value has subsequently been removed from var during the current execution of execute.


迭代器

publicIloCPEngine::IntVarIterator iteratorIloNumVar var)

该成员函数创建了一个迭代器("IloPropagatorI::IntVarIterator的实例),用于遍历 "var域中的元素。 请注意,由于修改是在传播器内缓冲的,因此这次迭代将扫描 "var域中的所有值,正如输入 "execute成员函数时的值一样。


makeClone

public virtualIloPropagatorI*makeClone(IloEnv env) const

在对 "IloPropagatorI类进行子类化以创建自己的自定义约束时,应定义此方法,该方法将克隆 CP 优化引擎中使用的传播器。


removeValue

public voidremoveValue(IloIntVar var,IloInt value)

This function can be called from the execute member function of your sub-class of IloPropagatorI. It removes value value from the domain of variable var. 请注意,这种修改是缓存的。 有关解释,请参见类文档。


setMax

public voidsetMax(IloNumVar var,IloNum max)

This function can be called from the execute member function of your sub-class of IloPropagatorI. 它将 "var的最大值设置为 "max。 请注意,这种修改是缓冲的。 有关解释,请参见类文档。


setMin

public voidsetMin(IloNumVar var,IloNum min)

This function can be called from the execute member function of your sub-class of IloPropagatorI. 它将 "var的最小值设置为 "min。 请注意,这种修改是缓冲的。 有关解释,请参见类文档。


setRange

public voidsetRange(IloNumVar var,IloNum min,IloNum max)

This function can be called from the execute member function of your sub-class of IloPropagatorI. 它将 "var的最小值设为 "min,最大值设为 "max。 请注意,这种修改是缓存的。 有关解释,请参见类文档。


setValue

public voidsetValue(IloNumVar var,IloNum value)

This function can be called from the execute member function of your sub-class of IloPropagatorI. 它将 "var的值设置为 "value。 请注意,这种修改是缓存的。 有关解释,请参见类文档。


违反

公共 voidviolate()

This function can be called from the execute member function of your sub-class of IloPropagatorI. 它向求解器表明,传播器维护的约束条件被违反了。