我应该使用哪种CPEX回调来解决子问题,并使用结果来帮助主问题作为惰性约束?

时间:2019-03-12 07:52:27

标签: callback cplex

我正在研究CPLEX上的MIP问题。主要模型目标是最小化一个函数,例如min f(x)。

以下步骤是我要做什么的想法:

  1. 我想在找到可行的解决方案后暂停或终止-为此,我使用cplex.parameters.mip.limits.solutions.set(1)停止求解器
  2. 然后,我想创建和解决另一个子问题,例如min g(x),其中g(x)的解决方案是主模型约束的一部分。
  3. 获得子问题的解决方案后,我通过添加约束或可能的惰性约束回调为主要问题添加了约束。
  4. 最后,主要模型已经成为我可以解决的新的更好的模型。

但是,我要迭代执行步骤1)到4),直到主模型最优为止。

由于它很复杂,我尚未完成此操作。如果有人可以指导,指出正确的方向或提供一些示例,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

您所描述的正是可以使用惰性约束回调的情况:每当CPLEX找到新的可行候选方案时,都会调用该回调。您可以检查此解决方案。如果它违反了您的某些约束,则可以添加它们,CPLEX将放弃该解决方案。如果该解决方案可行,则让其通过,CPLEX将用作新的现有解决方案。

您可以使用旧版回调API或通用回调(自12.9版以来新增)来实现惰性约束回调。看一下CPLEX附带的示例bendersatsp.pybendersatsp2.py。前者着重于功能__call__,后者着重invoke。用分隔您的约束的代码替换从那里调用的各种separate函数。