1、 问题由来
\qquad 最近在做模型时,使用C++调用CPLEX求解时,设置好最大求解时间之后发现最后模型没有求解完成时,没法输出模型的下界解信息,去查询CPLEX 12.9用户手册也没有找到相关获取模型下界的方法,所以只能自己摸索和尝试(那个用户手册做的是真垃圾,好多接口函数查不到… …)
2、 解决方法
\qquad
最终让我试出来一个获取模型上下界GAP值的函数getMIPRelativeGap
,这个函数在用户手册里面搜不到你敢信???
\qquad
之后这个方法被封装在所求解模型对象IloCplex
类里面,所以只需要通过IloCplex::getMIPRelativeGap()
就可以调用它啦。
\qquad
而大家都熟知模型对象IloCplex
类有获取上界解的方法IloCplex::getObjValue()
,有了上界解和GAP值,便可以方便得到最优下界值:bestLB = bestUB-bestGAP*bestUB
。
3、问题
\qquad 这样获得到的最优GAP值是准确的,但是求出来的最优下界比求解过程中显示的最优下界要大一点,这个不大清楚是啥问题,有大神直到可以指教【手动抱拳】!
4、设置CPLEX模型求解的Gap容差
\qquad
若在求解CPLEX模型时,不需要将模型求解到最优,可以借助IloCplex::Param::MIP::Tolerances::MIPGap
设置模型求解上下界之间的最小gap值([0,1]之间),具体设置的命令如下:
solver.setParam(IloCplex::Param::MIP::Tolerances::MIPGap, episilon);
\qquad
其中,solver表示当前的IloCplex
模型,episilon
∈
[
0
,
1
]
\in [0,1]
∈[0,1]表示上下界gap的容差。当solver求解过程中上下界之间的gap值不超过episilon时,模型停止求解,输出当前找到的最优上界解方案。