命名空间: ILOG.CPLEX
程序集: ILOG.CPLEX(在ILOG.CPLEX.dll 中) 版本:22.1.1.0
语法
| C# |
|---|
公 摘要 类 LazyConstraintCallback : Cplex..::..ControlCallback |
| Visual Basic |
|---|
公共 MustInherit 类 LazyConstraintCallback_ 继承 Cplex..::..ControlCallback |
备注
这是一个高级班。
重要信息:
高级课程通常要求对 CPLEX 使用的算法有深刻的理解。 因而它们会提高应用程序中错误行为的风险,而这种行为可能难以调试。 因此,团队鼓励您仔细考虑是否可以用其他类来完成同样的任务。
这是懒惰约束回调类。 该类的扩展实现了用户编写的懒约束回调。 在使用分支-切割搜索解决问题的同时,还能为问题添加懒约束。 这些 "懒约束 "可能有助于模型的制定,并限制问题的可行区域。 与此相反,如果在分支-切割搜索过程中添加的约束条件不会改变活动模型的可行区域,而只是加强了表述,则称为用户切割。 这种约束最好通过Cplex.UserCutCallback添加,因为这种区别使Cplex有可能执行更多的预分解还原。 但是,通过用户切回调来添加懒约束是错误的。
懒约束背后的理念是,在求解 MIP 时,如果不包含这些约束,求解的 LP 就能保持较小的规模。 不过,Cplex会在懒惰约束被违反后立即将其纳入 LP。 换句话说,Cplex计算出的解决方案能确保满足所有已添加的懒约束条件。
如果使用 "LazyConstraintCallback,则可以自由添加切分项,这些切分项可能会砍掉对模型来说可行的解,而 "UserCutCallback则不同。 在UserCutCallback 的情况下,您实际上是向 CPLEX 承诺,您不会通过回调添加会缩小解空间的切分。
当您查询当前待测方案的信息时,这些信息可能与直接从节点松弛中获取的信息不同。 当要测试的候选解是由启发式而非分支约束树本身生成时,就会出现这种差异。
重要信息:
在 MIP 启动处理期间,可调用惰性约束回调。 在这种情况下,{@link Cplex.LazyConstraintCallback#getSolutionSource() Cplex.LazyConstraintCallback.GetSolutionSource()}返回MIPStartSolution。 返回该值时,需要考虑一些特殊情况:
- MIP 启动处理在解法过程中很早发生。 此时,尚未设置搜索树,而且尚不存在搜索树节点。 因此,在此情况下,需要节点上下文的大量回调函数将失败。
- 在处理完此 MIP 启动后,将丢弃在处理 MIP 启动时分隔的惰性约束。 这意味着,对于下一次 MIP 启动或者对于在解法过程后期找到的解法,回调可能必须再次分隔相同的约束。
继承层次结构
ILOG.CPLEX'..::..Cplex '..::..回调
ILOG.CPLEX..::..Cplex..::..OptimizationCallback
ILOG.CPLEX..::..Cplex..::..MIPInfoCallback
ILOG.CPLEX..::..Cplex '..::..MIPCallback
ILOG.CPLEX..::..Cplex..::..ControlCallback
ILOG.CPLEX..::..Cplex..::..LazyConstraintCallback