我正在尝试解决一个大型 MIP 调度问题。由于解决问题需要很长时间,我想用更少的事件点运行相同的模型并找到它的第n个解决方案。使用该解决方案作为更大(更多事件点)模型的初始解决方案/种子,以找到其第 n 个解决方案,并使用它级联直到所需的事件点数量。
使用小问题的解决方案,我在 mip start 中使用它的二进制值,并让新添加的事件点不受影响。我将这些值保存在字典名称 seed_sol 中,其中键是二进制变量(在创建变量时获得),值是前一个求解的 0/1。
m.add_mip_start(SolveSolution(m, seed_sol))
使用上面的代码,我可以热启动我的更大的运行。但是,当我查看输出日志时,我意识到解决方案很少有改进,而且差距非常小(我知道实际最佳解决方案要高得多)。我怀疑 'add_mip_start' 函数将解决方案值强制为我的初始种子解决方案,并试图通过仅调整新添加的二进制变量来改进解决方案。
我该如何解决这个问题以获得想要的结果?
使用:
答案 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 停止的部分。)