CVXPY中的分段线性函数



我有一个凸优化问题,有可分离的凸分段线性函数f_i(var_i),每个函数都由点列表[(值,成本)]和其他几个也是凸的项定义。我想弄清楚如何在CVXPY中构建这些分段函数。

如何将以下两个点列表作为分段函数添加到cvpy目标中?

import cvxpy as cp
w = cp.Variable(n)
f1_points = [(-5, 10), (-2, -1), (0, 0)]  # -5 <= var1 <= 0  (Convex)
f2_points = [(-4, 5), (0, 0)]  # -4 <= var2 <= 0  (Linear)
f1_cost_function = ...
f2_cost_function = ...
constraints = [cp.sum(w) = 0] + ...
problem = cp.Problem(cp.Minimize(cp.sum([f1_cost_function, f2_cost_function] + ...)), constraints)

所以这在CVXPY中不可能从点列表中直接出现。但是,如果将分段函数改写为点-斜率函数,而不是点的集合,则可以使用cvpymaximum函数使分段线性函数。

f1_functions = [f1_line1, f1_line2, ...]
f1 = cp.maximum(f1_functions)

在用户指南中有一个示例。

如果你的曲线很简单,就像这张图一样,你的目标函数是最小化y,那么你可以简单地通过这样的约束来做到这一点:

contraints = [y <= f1, y <= f2, y <= f3, y <= f4 ]
objective = cp.minimize(y)

非线性曲线的简单分段函数图

最新更新