DOCPLEX MIP 热启动

时间:2021-02-12 21:20:15

标签: python cplex docplex

我正在尝试解决一个大型 MIP 调度问题。由于解决问题需要很长时间,我想用更少的事件点运行相同的模型并找到它的第n个解决方案。使用该解决方案作为更大(更多事件点)模型的初始解决方案/种子,以找到其第 n 个解决方案,并使用它级联直到所需的事件点数量。

使用小问题的解决方案,我在 mip start 中使用它的二进制值,并让新添加的事件点不受影响。我将这些值保存在字典名称 seed_sol 中,其中键是二进制变量(在创建变量时获得),值是前一个求解的 0/1。

m.add_mip_start(SolveSolution(m, seed_sol))

使用上面的代码,我可以热启动我的更大的运行。但是,当我查看输出日志时,我意识到解决方案很少有改进,而且差距非常小(我知道实际最佳解决方案要高得多)。我怀疑 'add_mip_start' 函数将解决方案值强制为我的初始种子解决方案,并试图通过仅调整新添加的二进制变量来改进解决方案。

我该如何解决这个问题以获得想要的结果?

使用:

  • Python 3.6.8
  • cplex 12.10.0.0
  • docplex 2.19.202

2 个答案:

答案 0 :(得分:1)

warmstart 提供了一个起点,但不会减少搜索空间。

https://github.com/AlexFleischerParis/zoodocplex/blob/master/zoowarmstartapi.py 处的示例:

echo \Yii::t('app', 'There {n,plural,=0{are no cats} =1{is one cat} other{are # cats}}!', ['n' => $n]);

你可以尝试的是固定启动

来自https://github.com/AlexFleischerParis/zoodocplex/blob/master/zoofixedstart.py的示例

// When $n = 0, it may produce "There are no cats!"
// When $n = 1, it may produce "There is one cat!"
// When $n = 42, it may produce "There are 42 cats!"

答案 1 :(得分:0)

MIP 开始用作起点,但它的开始值可能会在搜索中更改,而不是固定开始,固定值被视为硬约束。 顺便说一句,您也可以使用约束实现固定开始,这有助于添加或删除这些固定开始。

然而,MIP 启动的兴趣在于初始解决方案的质量。在您的情况下,初始解决方案似乎比大问题小得多,因此可能没有太大帮助。

要评估您的 MIP 性能问题,您能否指出问题的大小(由 Model.print_information()) 打印) 以及 CPLEX 日志(至少是 cplex 停止的部分。)

相关问题