CPLEX OPL中如何查看最优性间隙及设置时间限制与间隙参数
CPLEX OPL中最优性间隙的查看与双终止条件设置
一、如何确定所得解与全局最优解的最优性间隙
最优性间隙(通常指相对间隙)是衡量当前可行解与全局最优解接近程度的核心指标,计算公式为:相对间隙 = |当前可行解目标值 - 最优目标值下界| / max(|当前可行解目标值|, |最优目标值下界|) × 100%
在CPLEX OPL中,有两种便捷方式获取该间隙:
查看求解日志
求解过程中,CPLEX会实时输出间隙动态,当达到时间限制停止时,日志末尾会显示类似内容:Gap is 0.50%
通过OPL脚本API获取
在OPL的main块中调用CPLEX内置API,直接提取间隙数值,示例代码:main { var model = thisOplModel; var cplex = new IloCplex(); cplex.extract(model); cplex.setParam(IloCplex.Param.TimeLimit, 1800); // 已设置的时间限制 if (cplex.solve()) { writeln("当前可行解目标值: ", cplex.getObjValue()); writeln("全局最优目标值下界: ", cplex.getBestObjValue()); writeln("相对最优性间隙: ", cplex.getMIPRelativeGap() * 100, "%"); } else { writeln("求解未找到可行解或被中断"); } cplex.end(); }关键API说明:
cplex.getObjValue():返回当前找到的最优可行解目标值cplex.getBestObjValue():返回CPLEX计算出的全局最优目标值下界(最小化问题)或上界(最大化问题)cplex.getMIPRelativeGap():直接返回计算完成的相对间隙(小数形式,乘以100转为百分比)
二、能否同时指定最优性间隙与时间限制?
可以,CPLEX支持同时设置时间限制和最优性间隙阈值两个终止条件,求解过程中只要满足其中一个条件,就会自动停止计算。
设置方式分为两种:
通过OPL配置文件(settings.set)设置
在项目的settings.set文件中添加以下参数:TimeLimit=1800 // 时间限制1800秒 MIPRelativeGap=0.01 // 相对间隙阈值1%(间隙≤1%时停止)通过OPL脚本代码设置
在main块中调用setParam方法分别配置两个参数,示例代码:main { var model = thisOplModel; var cplex = new IloCplex(); cplex.extract(model); // 设置时间限制1800秒 cplex.setParam(IloCplex.Param.TimeLimit, 1800); // 设置相对间隙阈值为0.5%(小数形式0.005) cplex.setParam(IloCplex.Param.MIPRelativeGap, 0.005); if (cplex.solve()) { writeln("求解终止,目标值: ", cplex.getObjValue()); writeln("最终间隙: ", cplex.getMIPRelativeGap() * 100, "%"); writeln("实际求解时间: ", cplex.getCplexTime(), "秒"); } cplex.end(); }
注意:MIPRelativeGap的取值范围为0到1,0代表要求找到全局最优解(间隙为0),设置为0.01即允许1%的间隙。求解时,CPLEX会优先触发先达到的终止条件。
内容的提问来源于stack exchange,提问作者SUBHADARSHINI PANDA
相关产品推荐
相关产品推荐

