建议 ILP 求解器的下限

Posted

技术标签:

【中文标题】建议 ILP 求解器的下限【英文标题】:Suggesting a lower bound for an ILP solver 【发布时间】:2017-02-24 05:27:12 【问题描述】:

我有一个整数线性规划问题,我尝试过的求解器(CPLEX、CBC)需要很长时间才能解决,即使他们很早就找到了最优解。他们只需要很长时间才能完全证明这一点。

为我的最小化问题的目标值计算一个微不足道的下限很容易,但在 CPLEX 的输出(最佳边界列)中,我可以看到它甚至在很长很长一段时间内都没有接近。它几乎可以立即找到非常好的解决方案,但它错误地认为最佳解决方案可能会更好。

现在我不得不承认我真的不知道这些求解器是如何工作的,但看起来他们正在浪费时间试图改进极其弱的下限,寻找不可能乐观的解决方案。所以我的问题是:

    告诉求解器一个合适的目标下限是否有助于它更快地通过?

    如果是这样,哪些求解器可以接受作为附加输入提供的已知下限?

作为说明,我粘贴了示例运行中 CPLEX 输出的前几行(运行时间更长,目标没有任何进一步的改进,最佳界限的改进也非常缓慢):

        Nodes                                         Cuts/
   Node  Left     Objective  IInf  Best Integer    Best Bound    ItCnt     Gap
      0     0     -388.6997   178                   -388.6997        9
*     0+    0                          297.0000     -388.6997        9  230.88%
*     0+    0                          275.0000     -388.6997        9  241.35%
      0     2     -388.6997   178      275.0000     -387.8106        9  241.02%
*    20+   20                          185.0000     -307.6363       80  266.29%
*    30+   30                          135.0000     -307.6363       90  327.88%
*    30+   30                           94.0000     -307.6363       90  427.27%
*    60+   60                           90.0000     -307.6363      120  441.82%
*   160+  126                           77.0000     -307.6363      272  499.53%
*   200+   93                           12.0000     -307.4836      325     ---
    300   182     -135.2988   107       12.0000     -268.6638      466     ---
   1200   934      -50.6022    85       12.0000     -206.2938     1480     ---
   2197  1755      -96.9612    93       12.0000     -189.8013     2470     ---
   3226  2600       -2.8316    87       12.0000     -179.9669     3480     ---
   4374  3521     -156.2442   110       12.0000     -170.4183     4567     ---
   5490  4421     -128.0871    97       12.0000     -167.3696     5623     ---
   6971  5603     -147.5022   108       12.0000     -162.4180     7055     ---
   8739  6997     -103.5374   113       12.0000     -156.3532     8673     ---

我希望我可以告诉求解器不要费心寻找目标低于 10 的解决方案(因为我可以用更简单的方法证明这一点),尤其是没有负目标值的解决方案(因为在我的型号)。

【问题讨论】:

(1) 您始终可以添加一个约束,使所有解决方案低于您的先验已知界限不可行。就足够了 (2) 关于商业求解器,我读过不止一次,开发人员认为这通常会适得其反。但也许它对您的情况有所帮助(遗憾的是我无法提供链接;也许谷歌搜索 gurobi 邮件列表中的问题)。 (3) 根据您的成就,您可能会调整您的求解器选项。 Gurobi 可以选择 MIPFocus。也许你也可以做到这一点。例如,为了更好地证明界限而进行许多削减;更多启发式方法以获得更快的良好解决方案 你是如何找到微不足道的下限的?您是否只是放松了完整性约束并解决了(实际)线性程序? @sascha 添加对目标的约束没有帮助,但我会研究 Gurobi 和 (3),谢谢。这可能正是我所需要的。 另请阅读this。 @RodrigodeAzevedo 不,这只是对数据的一些操作,一个比我想要解决的更简单的组合问题。但是我的目标的非消极性已经足够好了:下限的进展需要很长时间才能达到微不足道的零,之后不需要太长时间。 【参考方案1】:

如果您有一个良好的下限,则可以从可行的解决方案中将其作为 MIP 开始提供给 CPLEX。

然后,CPLEX 将尝试改进该解决方案并忽略其分支定界算法中边界低于该值的任何分支。

您可以在此处查看更多详细信息: https://www.ibm.com/support/knowledgecenter/SS9UKU_12.5.0/com.ibm.cplex.zos.help/UsrMan/topics/discr_optim/mip/para/49_mipStarts.html

【讨论】:

以上是关于建议 ILP 求解器的下限的主要内容,如果未能解决你的问题,请参考以下文章

适用于MNIST的逻辑回归的最优解算器的选择

Chrome 建议 Angular Material 日期选择器的密码

线性规划求解器中上限和下限的参数

改进 VB.NET URL 缩短器的建议?

在 TensorFlow 中存储多次运行的摘要编写器的建议做法是啥?

零基础使用 MATLAB 求解偏微分方程(建议收藏)