CPLEX MIP提前终止,相对差距为getBestObjValue vs getObjValue

时间:2015-04-02 20:12:08

标签: c++ optimization cplex

我使用C ++对CPLEX进行(最大化)MIP建模,并使用

指定相对差距
cplex.setParam(IloCplex::EpGap, gap);

我对

之间的区别感到困惑
cplex.getBestObjValue();

cplex.getObjValue();

因为差距而提前终止。

如果我理解正确,getBestObjValue()的值将始终对应于整数 可行解决方案,并且 lower 绑定达到最佳值。另一方面,getObjValue()(可能?将始终?)的值对应于不可行的解决方案,并且是与最佳值绑定的 upper 。我能正确理解吗?

我还有另一个问题:getBestObjValue()返回的值,在最大化问题的情况下,是所有剩余未探测节点的最大目标函数值' (来自CPLEX文档)。有没有办法查询这些未探测节点的客观值?我问,因为我希望得到满足我相对差距的最小值,而不是最大值。

1 个答案:

答案 0 :(得分:2)

根据手册:

  

Cplex.GetBestObjValue方法:
  计算最小化问题作为所有剩余未探测节点的最小目标函数值。同样,它是针对最大化问题计算的,作为所有剩余未探测节点的最大目标函数值

  对于常规MIP优化,该值也是MIP问题的最优解值的最佳已知界限。实际上,当问题已经解决为最优时,该值与最优解决方案值匹配。

它对应于目标值的上限(最大化时),在达到最优值之前停止求解器时存在间隙。在MIP中,后面有分支和绑定树,随着更多节点的探索,上限减小。当您通过epgap停止时,可能有或没有任何与上限匹配的解决方案。

因此,您的假设是错误的:

  

如果我理解正确,getBestObjValue()的值将始终对应于整数可行解决方案。

另一方面,

GetObjValue()是当前最佳解决方案的目标值(对应于找到的可行解决方案)。它是下限,这是您要在第二个问题中使用的值。