如何在CVXPY DPP中使用参数及其倒数且维持DPP合规性?
解决CVXPY中DPP合规性问题的调整方案
问题根源
对参数使用cp.inv_pos()(取倒数)违反了DPP(Disciplined Parametrized Programming)规则:DPP要求参数只能以线性项、合法凸/凹函数的输入形式出现,不能对参数执行倒数这类非线性变换(但对优化变量执行倒数是允许的)。
调整方案
重新推导目标函数,将参数的倒数操作转化为对变量的操作,让参数仅以线性系数形式存在:
原目标表达式cp.maximum(a*b, b*cp.inv_pos(a))可提取公共因子b,改写为b * cp.maximum(a, cp.inv_pos(a))——此时参数b仅作为线性系数参与运算,完全符合DPP规范;而cp.inv_pos(a)是对优化变量a的操作,属于DPP允许的范围。
修改后的代码
import cvxpy as cp def cp_log_ratio_norm(a, b): # 提取参数b作为线性系数,仅对变量a取倒数,满足DPP要求 return b * cp.maximum(a, cp.inv_pos(a)) var = cp.Variable(pos=True) param = cp.Parameter(pos=True) param.value = 5 objective = cp.Minimize(cp_log_ratio_norm(var, param)) problem = cp.Problem(objective, []) objective_value = problem.solve() print(f"Objective value = {objective_value}") print(f"Status = {problem.status}")
验证说明
修改后代码不会触发DPP警告,且求解结果与原代码一致:最小值出现在var=1时,目标值为5*1=5,问题状态为optimal。
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

