【问题标题】:Piecewise Linear Functions in CVXPYCVXPY 中的分段线性函数
【发布时间】:2021-01-29 17:48:58
【问题描述】:

我有一个凸优化问题,其中包含可分离、凸、分段线性函数 f_i(var_i),每个函数由点列表 [(values, cost)] 和其他几个凸项定义。我试图弄清楚两个如何在 CVXPY 中构建这些分段函数。

如何获取以下两个点列表并将它们作为分段函数添加到 CVXPY 目标?

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)

【问题讨论】:

  • mmm... 可能我无法从点创建分段函数,而是您必须创建函数并使用 cp.max([f1's])。不过我会等着看是否有更好的方法。
  • 这可能会有所帮助:stackoverflow.com/questions/62432731/…。我问了这个非常笼统的问题,开始使用线性规划进行变化点检测。因为我想让它解决非小问题(> 10^4 个数据点),所以速度慢得让人无法接受。

标签: python optimization cvxpy piecewise convex-optimization


【解决方案1】:

所以这在 CVXPY 中从点列表中不会直接出现。但是,如果将分段函数重写为点斜率函数而不是点集合,则可以使用 cvxpy maximum 函数来生成分段线性函数。

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

这在user guide 中有一个示例。

【讨论】:

    【解决方案2】:

    如果您的曲线很简单,例如 picture,并且您的目标函数是最小化 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

    【讨论】:

      猜你喜欢
      • 2020-09-27
      • 2017-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多