公共抽象静态类IloCplex.LazyConstraintCallback 扩展IloCplex.ControlCallback
这是一个高级班。
重要信息:
高级课程通常要求对 CPLEX 使用的算法有深刻的理解。 因而它们会提高应用程序中错误行为的风险,而这种行为可能难以调试。 因此,团队鼓励您仔细考虑是否可以用其他类来完成同样的任务。
这是懒惰约束回调类。 该类的扩展实现了用户编写的懒约束回调。 在使用分支-切割搜索解决问题的同时,还能为问题添加懒约束。 这些 "懒约束 "可能有助于模型的制定,并限制问题的可行区域。 与此相反,如果在分支-切割搜索过程中添加的约束条件不会改变活动模型的可行区域,而只是加强了表述,则称为用户切割。 这种约束最好通过 "IloCplex.UserCutCallback添加,因为这种区别使 "IloCplex有可能执行更多的预演还原。 但是,通过用户切回调来添加懒约束是错误的。
懒约束背后的理念是,在求解 MIP 时,如果不包含这些约束,求解的 LP 就能保持较小的规模。 但是,一旦IloCplex违反了懒惰约束,它就会将该约束纳入 LP 中。 换句话说,"IloCplex计算出的解决方案确保满足所有已添加的懒惰约束条件。
如果使用 "LazyConstraintCallback,则可以自由添加切分项,这些切分项可能会砍掉对模型来说可行的解,而 "UserCutCallback则不同。 在 "UserCutCallback的情况下,您实际上是向 CPLEX 承诺,您不会通过回调来添加减少解空间的切分。
当您查询当前待测方案的信息时,这些信息可能与直接从节点松弛中获取的信息不同。 当要测试的候选解是由启发式而非分支约束树本身生成时,就会出现这种差异。
重要信息:
在 MIP 启动处理期间,可调用惰性约束回调。 在这种情况下,"IloCplex.LazyConstraintCallback.getSolutionSource()返回 "MIPStartSolution。 返回该值时,需要考虑一些特殊情况:
IloCplex.MIPCallback.NodeDataIloCplex.Callback.Context, IloCplex.Callback.Function| 修饰符 | 构造函数和说明 |
|---|---|
protected |
IloCplex.LazyConstraintCallback()这是用户编写的懒约束回调的构造函数。
|
| 修饰符和类型 | 方法和说明 |
|---|---|
protected IloRange |
add(IloRange cut)将 "
cut作为全局懒惰约束添加到正在求解的问题中。 |
protected IloRange |
add(IloRange cut,
int cutmanagement)将 "
cut作为全局懒惰约束添加到正在求解的问题中。 |
protected IloRange |
addLocal(IloRange cut)将 "
cut作为局部懒惰约束添加到正在求解的问题中。 |
protected int |
getSolutionSource()返回一个值,说明潜在任职者是在哪里找到的。
|
protected boolean |
isUnboundedNode()当发现 LP 松弛是无约束的,而用户需要测试懒约束是否切断了无约束的方向时,该方法表示是否调用了回调。
|
getDownPseudoCost, getFeasibilities, getFeasibilities, getFeasibility, getLB, getLBs, getLBs, getNodeData, getNodeId, getObjValue, getSlack, getSlacks, getSlacks, getSOSFeasibility, getSOSFeasibility, getUB, getUBs, getUBs, getUpPseudoCost, getValue, getValue, getValues, getValues, setNodeDatagetCurrentNodeDepth, getNodeDoubleInfo, getNodeIntInfo, getNodeLongInfo, getObjCoef, getObjCoefs, getObjCoefsgetBestObjValue, getCutoff, getDirection, getIncumbentObjValue, getIncumbentValue, getIncumbentValue, getIncumbentValues, getIncumbentValues, getMIPRelativeGap, getNcuts, getNiterations, getNiterations64, getNnodes, getNnodes64, getNremainingNodes, getNremainingNodes64, getPriority, getQuality, hasIncumbentgetModel, getNcols, getNQCs, getNrowsabort, getCplexTime, getDetTime, getEndDetTime, getEndTime, getStartDetTime, getStartTime, mainprotectedIloCplex.LazyConstraintCallback()
调用该构造函数只能构造用户编写的派生回调类的对象,不能直接构造 "IloCplex.LazyConstraintCallback对象。
protectedIloRangeaddIloRangecut) 抛出IloException
cut作为全局懒惰约束添加到正在求解的问题中。 作为一种懒惰约束,这种剪切必须是全局有效的。 在搜索过程中,不会通过回溯或任何其他方式将其删除。IloExceptioncut- 作为全局懒惰约束添加的约束。 约束必须是线性的。protectedIloRangeaddIloRangecut、 int cutmanagement) 抛出IloException
cut作为全局懒惰约束添加到正在求解的问题中。作为一种懒惰约束,这种剪切必须是全局有效的。
参数 "cutmanagement的可能值记录在 "IloCplex.CutManagement中,注意事项如下:
对于懒惰约束,"UseCutFilter值无效,会引发异常。
UseCutPurge的值授权 CPLEX 在某些情况下(例如,当约束变得松弛时)清除(即消除)懒约束。 因此,考虑到这种清除,用户不得假定任何先前添加的约束条件仍在当前松弛中。 换句话说,被清除的约束条件可能会在后续的松弛过程中被违反,用户必须负责检查是否有新的现任解决方案要求将被清除的懒惰约束条件重新添加到模型中。
UseCutForce的值在作为懒约束添加后,会永久保留剪切。 该值等同于调用 "add方法,但只有一个参数(即作为懒约束添加的剪切)。
IloExceptioncut- 作为全局懒惰约束添加的约束。 约束必须是线性的。cutmanagement- 一个整数,表示 CPLEX 应如何管理懒惰约束。 可能的值列在 "IloCplex.CutManagement中。protectedIloRangeaddLocal(IloRangecut) 抛出IloException
cut作为局部懒惰约束添加到正在求解的问题中。当搜索回溯时,这种懒惰约束不会被删除。 换句话说,它只对以调用节点为根的子树有效。
IloExceptioncut-要添加为本地懒约束的约束。 约束必须是线性的。protectedisUnboundedNode()
protected intgetSolutionSource()
有关该方法返回值的解释,请参阅 "IloCplex.SolutionSource。
请注意,对于启发式回调提供的解决方案,不会调用懒约束回调。 因此,"IloCplex.SolutionSource.UserSolution的值永远不会返回。