CVXPY调用SCIPY求解大规模LP失败、ECOS返回非精确最优解原因问询
Scipy HiGHS求解LP失败原因分析
核心失败原因
从运行日志可直接定位求解失败的根本原因:
- HiGHS求解器默认会对输入的LP模型做数值缩放,降低问题条件数以提升求解效率,缩放后的模型已经成功求得最优解
- 但将缩放后的最优解逆变换还原到原始未缩放模型时,产生了12个原始变量不可行项,超出了HiGHS默认的可行性容忍阈值
- HiGHS默认未开启「使用更精细公差重求解」的逻辑,所以直接返回
HighsModelStatusNOTSET的未定义状态,触发CVXPY抛出求解失败异常
日志开头的message_level参数警告是因为你同时传入了verbose=True和disp=True,CVXPY重复传参导致参数值异常,该警告不影响核心求解逻辑,和本次求解失败无关。
小变量规模无异常的原因
变量规模较小时,问题的目标函数、约束矩阵系数量级跨度小,缩放和逆缩放过程中产生的浮点精度误差极小,不会超出可行性公差阈值;变量规模提升后,系数的量级跨度变大,逆缩放过程的误差被放大,最终导致还原后的解不满足原始约束要求。
你使用ECOS求解得到optimal_inaccurate结果也是同一类数值精度问题,只是ECOS不会直接抛出错误,而是返回精度未达默认标准的非精确最优解。
可行解决方案
- 调整HiGHS求解参数:在
scipy_options中增加公差配置、开启交叉验证逻辑,示例配置如下:
prob.solve( solver=cvx.SCIPY, scipy_options={ "method": "highs", "primal_feasibility_tolerance": 1e-6, "dual_feasibility_tolerance": 1e-6, "run_crossover": True }, verbose=True )
- 对问题做归一化预处理:将目标函数、所有约束的系数统一做缩放,把所有参数的量级控制在
1e-3 ~ 1e3的范围内,从根源降低精度损失的概率 - 更换适配性更好的求解器:可以尝试CBC、GLPK等开源LP求解器,这类求解器对大规模问题的数值容错处理更完善,也可以使用Gurobi、CPLEX的免费社区版,求解效率和数值稳定性都优于Scipy内置的HiGHS接口
内容的提问来源于stack exchange,提问作者Alexis Olivero Aimaretti
相关产品推荐
相关产品推荐

