我使用C ++对CPLEX进行(最大化)MIP建模,并使用
指定相对差距cplex.setParam(IloCplex::EpGap, gap);
我对
之间的区别感到困惑cplex.getBestObjValue();
和
cplex.getObjValue();
因为差距而提前终止。
如果我理解正确,getBestObjValue()
的值将始终对应于整数 可行解决方案,并且 lower 绑定达到最佳值。另一方面,getObjValue()
(可能?将始终?)的值对应于不可行的解决方案,并且是与最佳值绑定的 upper 。我能正确理解吗?
我还有另一个问题:getBestObjValue()
返回的值,在最大化问题的情况下,是所有剩余未探测节点的最大目标函数值' (来自CPLEX文档)。有没有办法查询这些未探测节点的客观值?我问,因为我希望得到满足我相对差距的最小值,而不是最大值。
答案 0 :(得分:2)
根据手册:
Cplex.GetBestObjValue方法:
计算最小化问题作为所有剩余未探测节点的最小目标函数值。同样,它是针对最大化问题计算的,作为所有剩余未探测节点的最大目标函数值 。
对于常规MIP优化,该值也是MIP问题的最优解值的最佳已知界限。实际上,当问题已经解决为最优时,该值与最优解决方案值匹配。
它对应于目标值的上限(最大化时),在达到最优值之前停止求解器时存在间隙。在MIP中,后面有分支和绑定树,随着更多节点的探索,上限减小。当您通过epgap停止时,可能有或没有任何与上限匹配的解决方案。
因此,您的假设是错误的:
另一方面,如果我理解正确,getBestObjValue()的值将始终对应于整数可行解决方案。
GetObjValue()是当前最佳解决方案的目标值(对应于找到的可行解决方案)。它是下限,这是您要在第二个问题中使用的值。