【问题标题】:Python CVXPY: Attribute Error - ParameterPython CVXPY:属性错误 - 参数
【发布时间】:2021-09-22 12:38:45
【问题描述】:

我正在尝试在 python 中使用 CVXPY 来解决具有少量约束的线性规划问题。我创建了一个列表,其中列出了所有约束,但是在运行 question.solve() 时,它返回了以下错误:

"AttributeError: 'list' 对象没有属性'parameters'"

我相信它引用了我创建的约束列表,但我不知道如何纠正这个问题。

import cvxpy as cvx
import numpy as np

p = cvx.Variable(shape=(3,1), name="p")
f = cvx.Variable(shape=(6,1), name="f")
theta = cvx.Variable(shape=(6,1), name="theta")

r = np.array([16, 20, 8])
objective = cvx.Minimize(cvx.matmul(r,p))

A = np.array([[1,0,0,0,0,1],[0,1,1,0,0,0],[0,0,0,1,1,0]])
B = np.array([[1,0,0],[0,1,0],[0,0,1]])
constraint_genflow = [cvx.matmul(A,f)==cvx.matmul(B,p)]

C = np.array([[1,1,0,0,0,0],[0,0,1,1,0,0],[0,0,0,0,1,1]])
D = np.array([[-110],[-65],[-205]])
constraint_demandflow= [cvx.matmul(C,f)==D]

E = np.array([[1,0,0,0,0,0],[0,1,0,0,0,0],[0,0,1,0,0,0],[0,0,0,1,0,0],[0,0,0,0,1,0],[0,0,0,0,0,1]])
F = np.array([[-100],[-110],[-50],[-80],[-60],[-40]])
G = np.array([[100],[110],[50],[80],[60],[40]])
constraint_flowlimit1 = [cvx.matmul(E,f)<=G]
constraint_flowlimit2 = [cvx.matmul(E,f)>=E]

H = np.array([[1,0,0],[0,1,0],[0,0,1]])
I = np.array([[20],[20],[10]])
J = np.array([[200],[150],[150]])
constraint_genpower1 = [cvx.matmul(H,p)<=J]
constraint_genpower2 = [cvx.matmul(H,p)>=I]

K = np.array([[11.6,-11.6,0,0,0,0],[0,5.9,-5.9,0,0,0],[0,0,13.7,-13.7,0,0],[0,0,0,9.8,-9.8,0],[0,0,0,0,5.6,-5.6],[-10.5,0,0,0,0,10.5]])
L = np.array([[100],[110],[50],[80],[60],[40]])
constraint_nodalpot = [cvx.matmul(K,theta)==L]

constraints = [constraint_nodalpot, constraint_genpower1, constraint_genpower2, constraint_flowlimit2, constraint_flowlimit1, constraint_genflow, constraint_demandflow] 

problem = cvx.Problem(objective, constraints)
solution = problem.solve()
print(solution)

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-120-05b45a639232> in <module>
      1 #Define the Problem and Solve
      2 problem = cvx.Problem(objective, constraints)
----> 3 solution = problem.solve()
      4 print(solution)

~\Anaconda3\lib\site-packages\cvxpy\problems\problem.py in solve(self, *args, **kwargs)
    460         else:
    461             solve_func = Problem._solve
--> 462         return solve_func(self, *args, **kwargs)
    463 
    464     @classmethod

~\Anaconda3\lib\site-packages\cvxpy\problems\problem.py in _solve(self, solver, warm_start, verbose, gp, qcp, requires_grad, enforce_dpp, **kwargs)
    876             print(_HEADER)
    877 
--> 878         for parameter in self.parameters():
    879             if parameter.value is None:
    880                 raise error.ParameterError(

~\Anaconda3\lib\site-packages\cvxpy\utilities\performance_utils.py in _compute_once(self, *args, **kwargs)
     67         if key in cache:
     68             return cache[key]
---> 69         result = func(self, *args, **kwargs)
     70         cache[key] = result
     71         return result

~\Anaconda3\lib\site-packages\cvxpy\problems\problem.py in parameters(self)
    334         params = self.objective.parameters()
    335         for constr in self.constraints:
--> 336             params += constr.parameters()
    337         return unique_list(params)
    338 

AttributeError: 'list' object has no attribute 'parameters'

任何帮助将不胜感激

【问题讨论】:

  • 您省略了很多代码,甚至没有显示完整的堆栈跟踪。很难解释那个 sn-p。
  • 抱歉,添加了完整的代码和跟踪。

标签: python parameters cvxpy


【解决方案1】:

CVXPY 需要获取约束列表。请注意,您在列表中定义了每个约束,然后将所有这些列表放入另一个列表中。 如果你打印constraints,你会看到:

[[Equality(Expression(AFFINE, UNKNOWN, (6, 1)), Constant(CONSTANT, NONNEGATIVE, (6, 1)))], [Inequality(Expression(AFFINE, UNKNOWN, (3, 1)))], [Inequality(Constant(CONSTANT, NONNEGATIVE, (3, 1)))], [Inequality(Constant(CONSTANT, NONNEGATIVE, (6, 6)))], [Inequality(Expression(AFFINE, UNKNOWN, (6, 1)))], [Equality(Expression(AFFINE, UNKNOWN, (3, 1)), Expression(AFFINE, UNKNOWN, (3, 1)))], [Equality(Expression(AFFINE, UNKNOWN, (3, 1)), Constant(CONSTANT, NONPOSITIVE, (3, 1)))]]

如你所见,这里有嵌套列表。

CVXPY 期待 constraints = [a&lt;b, b&lt;=c] 等类似的东西。

只需改变:

constraints = [constraint_nodalpot, constraint_genpower1, constraint_genpower2, constraint_flowlimit2, constraint_flowlimit1, constraint_genflow, constraint_demandflow]

到:

constraints = constraint_nodalpot + constraint_genpower1 + constraint_genpower2, + constraint_flowlimit2 + constraint_flowlimit1 + constraint_genflow + constraint_demandflow

创建一个大的约束列表,将所有列表放入另一个列表中。

就是这样。

【讨论】:

  • 谢谢!我是一个初学者,并试图自己学习这个。你帮了大忙!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-21
  • 2013-07-01
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 2016-05-01
  • 2021-07-24
相关资源
最近更新 更多