如何在CPLEX中获取凸QP限时求解后的最优值上下界?
在CPLEX时限终止后获取凸QP最优值的上下界
对于凸二次规划(QP)问题,CPLEX在迭代过程中会跟踪原问题可行解的目标值和对偶问题可行解的目标值,这两个值就是最优值的上下界(极小化问题中,原目标值是上界,对偶目标值是下界;极大化问题则相反)。以下是CLI和C++ API的具体获取方法:
一、CPLEX命令行界面(CLI)
- 启用内点法求解:内点法会在迭代过程中持续输出原对偶界,是获取中间界的最优选择。执行命令:
set qpmethod 2 - 设置时限:例如设置10秒时限:
set timelimit 10 - 查看界信息:求解终止后,CLI会直接输出类似如下内容:
Primal objective = 123.45
Dual objective = 122.98
其中Primal objective是当前找到的最优原可行解目标值(上界),Dual objective是对偶可行解目标值(下界)。
若需要更详细的迭代过程界信息,可开启详细输出:
这样会在每一步迭代中打印原对偶目标值的变化。set barrier display 2
二、C++ API
配置求解器参数:优先选择内点法(Barrier)以跟踪原对偶界,代码示例:
IloCplex cplex(model); cplex.setParam(IloCplex::Param::QP::Method, IloCplex::QPMethod::Barrier); cplex.setParam(IloCplex::Param::TimeLimit, 10.0); // 设置10秒时限获取上下界:当求解因时限终止后,调用以下方法:
cplex.getBestObjValue():返回当前找到的最优原可行解目标值(极小化问题为上界)cplex.getDualObjValue():返回当前找到的最优对偶可行解目标值(极小化问题为下界)
注意:getObjValue()仅返回当前迭代解的目标值,并非全局最优的原可行解目标值,不能作为可靠上界,需使用getBestObjValue()替代。
计算间隙:可通过两者的差值计算绝对间隙,或相对间隙:
double primalBound = cplex.getBestObjValue(); double dualBound = cplex.getDualObjValue(); double absoluteGap = primalBound - dualBound; double relativeGap = absoluteGap / std::abs(primalBound); // 极小化问题
内容的提问来源于stack exchange,提问作者user2485450
相关产品推荐
相关产品推荐

