CVXPY 中的分段线性函数
Piecewise Linear Functions in CVXPY
我有一个凸优化问题,其中包含可分离的凸分段线性函数 f_i(var_i),每个函数都由点列表 [(values, costs)] 和其他几个项定义这也是凸的。我试图弄清楚两个如何在 CVXPY 中构建这些分段函数。
如何获取以下两个点列表并将它们作为分段函数添加到 CVXPY objective?
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 中。但是,如果将分段函数重写为点斜率函数而不是点的集合,则可以使用 cvxpy maximum
函数来制作分段线性函数。
f1_functions = [f1_line1, f1_line2, ...]
f1 = cp.maximum(f1_functions)
这在 user guide.
中用示例进行了描述
如果你的曲线很简单,就像这个 picture,而你的 objective 函数是最小化 y,那么你可以通过像这样设置约束来简单地做到这一点:
contraints = [y <= f1, y <= f2, y <= f3, y <= f4 ]
objective = cp.minimize(y)
Picture of simple Piece-wise functions for a non-linear curve
我有一个凸优化问题,其中包含可分离的凸分段线性函数 f_i(var_i),每个函数都由点列表 [(values, costs)] 和其他几个项定义这也是凸的。我试图弄清楚两个如何在 CVXPY 中构建这些分段函数。
如何获取以下两个点列表并将它们作为分段函数添加到 CVXPY objective?
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 中。但是,如果将分段函数重写为点斜率函数而不是点的集合,则可以使用 cvxpy maximum
函数来制作分段线性函数。
f1_functions = [f1_line1, f1_line2, ...]
f1 = cp.maximum(f1_functions)
这在 user guide.
中用示例进行了描述如果你的曲线很简单,就像这个 picture,而你的 objective 函数是最小化 y,那么你可以通过像这样设置约束来简单地做到这一点:
contraints = [y <= f1, y <= f2, y <= f3, y <= f4 ]
objective = cp.minimize(y)
Picture of simple Piece-wise functions for a non-linear curve