【问题标题】:How to populate a variable/expression in CVXPY如何在 CVXPY 中填充变量/表达式
【发布时间】:2022-07-30 07:37:40
【问题描述】:

我正在尝试将 cvx 代码转换为 cvxpy。我遇到的主要问题是找到类似于表达式的东西。我使用表达式为整个 len(n) 列表设置值。据我了解,不能修改 cvx 中变量的属性,而表达式可以。在 cvx 中,我会这样做:

n = 100;
init = 10;
cvx begin 
   variables A(n), B(n), C(n)
   expression X(n)
   X(1) = init;
   for t=2:n
       X(t) = X(t - 1) + A(t - 1) + B(t - 1) + C(t - 1)
   end

   minimize(sum(A) + max(B))
   subject to 
     for t = 1:n
       A(t) >= 1;
       B(t) <= 1;
       C(t) >= 1;
     end
cvx end   

根据之前的帖子(How to set cvxpy n-dim variable first value?),似乎没有等效于 cvxpy afaik 中的表达式,所以我需要像这样为约束创建该变量。

   import cvxpy as cp
   n = 100
   init = 10
   A = cp.variable(n)
   B = cp.variable(n)
   C = cp.variable(n)
   X = cp.variable(n)
   
   obj = cp.Minimize(sum(A) + max(B))
   # TODO automate introduction of variables.
   cons = [
      X[0] == init,
      A[0] >= 1,
      B[0] <= 1,
      C[0] >= 1
   ]

   cons2 = [
      X[t] == X[t - 1] + A[t - 1] + B[t - 1] + C[t - 1],
      A[t] >= 1,
      B[t] <= 1,
      C[t] >= 1
      for t in range(1,n)
   ]
   cons.append(cons2)
   prob = cp.Problem(obj, cons)  

我收到此错误消息:“NotImplementedError:不允许严格不等式。”显然 cvxpy 在约束中不喜欢 == ,但我不确定如何填充 X 。另外,我想我可能也会为约束创建列表。谢谢你的帮助。

备用 cvxpy 代码:

   import cvxpy as cp
   n = 100
   init = 10
   A = cp.variable(n)
   B = cp.variable(n)
   C = cp.variable(n)
   X = cp.variable(n)
   
   obj = cp.Minimize(sum(A) + max(B))
   # TODO automate introduction of variables.
   cons = [
      X[0] == init,
      A[0] >= 1,
      B[0] <= 1,
      C[0] >= 1
   ]

   for t in range(1,n)
      cons2 = [
          X[t] == X[t - 1] + A[t - 1] + B[t - 1] + C[t - 1],
          A[t] >= 1,
          B[t] <= 1,
          C[t] >= 1
      ]
      cons.append(cons2)
   prob = cp.Problem(obj, cons)  

【问题讨论】:

    标签: python cvxpy cvx


    【解决方案1】:

    我也不知道怎么把cvx​​的表达式翻译成cvxpy,也不知道怎么用cvxpy解决你的优化问题。不过,我可以对您的代码示例进行修复,以免引发错误。

    修复 1:

    我收到此错误消息:“NotImplementedError:不允许严格不等式。”显然 cvxpy 不喜欢 == 在约束中,但我不确定如何填充 X 。

    这个错误其实是调用了错误的summax函数造成的。你必须调用 cvxpy 模块的函数,它可以将 cvxpy 的变量表达式作为输入。所以正确的方法是cp.sum(A) + cp.max(B)

    修复 2:

    另外,我想我可能也会为约束创建列表。谢谢你的帮助。

    1. 在您的第一个 cvxpy 代码示例中:为创建列表 cons2 提供的列表理解语法似乎是错误的,因此不适用。我不知道是否有一种优雅的方式可以为特定的创建使用列表推导。
    2. 在您的备用 cvxpy 代码示例中:cons.append(cons2) 实际上会将列表 cons2 追加到 cons 中,而不是列表 cons2 中包含的元素。您想要的是结合这两个列表,这可以通过以下语法轻松实现:cons += cons2

    修复 3:

    1. 拼写错误:cp.variable(n) 应改为 cp.Variable(n)

    修正 cvxpy 代码:

    import cvxpy as cp
    n = 100
    init = 10
    A = cp.Variable(n)
    B = cp.Variable(n)
    C = cp.Variable(n)
    X = cp.Variable(n)
    
    obj = cp.Minimize(cp.sum(A) + cp.max(B))
    # TODO automate introduction of variables.
    cons = [
       X[0] == init,
       A[0] >= 1,
       B[0] <= 1,
       C[0] >= 1
    ]
    
    for t in range(1,n):
        cons2 = [
            X[t] == X[t - 1] + A[t - 1] + B[t - 1] + C[t - 1],
            A[t] >= 1,
            B[t] <= 1,
            C[t] >= 1
        ]
        cons += cons2
    prob = cp.Problem(obj, cons)
    
    print(prob.solve(solver=cp.SCS))
    print(prob.status)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      • 2016-05-27
      • 2015-05-26
      • 1970-01-01
      • 2020-01-19
      • 1970-01-01
      • 2017-03-19
      相关资源
      最近更新 更多