python - Python CVXPY:属性错误 - 参数
问题描述
我正在尝试在 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'
任何帮助将不胜感激
解决方案
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<b, b<=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
创建一个大的约束列表,将所有列表放入另一个列表中。
就是这样。
推荐阅读
- javascript - javascript中的基本比较语句
- arrays - 在 adhadler 事件上传递数组
- python - 在 tweepy 中获取对推文列表的回复
- jackson - 如果字段存在于树的更远位置,则不要序列化
- websocket - 如何检查 python 项目中的 websocket 瓶颈
- database-indexes - 检查索引是否存在
- ssis - 如何在 SSIS 中使用缓存连接管理器执行范围查找
- r - 按名称计算多列的平均值和 SEM
- haskell - 如何声明嵌套类型?
- python - 如何使用 pandas 的 read_table 读取每行具有不同列的文件