Python CVXPY求解线性规划报list无parameters属性错误如何解决
问题原因
你构造的constraints是嵌套列表结构,CVXPY要求传入的约束列表必须是由Constraint对象组成的一维列表,不能包含子列表。你每一条约束定义时都单独用[]包裹生成了单元素子列表,最终汇总的constraints里每个元素都是子列表,CVXPY遍历约束调用parameters()方法时就会触发列表对象没有该属性的报错。
修正方案
有两种可行的修正方式:
方式1:汇总约束时展开子列表
把原来的汇总代码改成用+拼接所有子列表即可,替换原constraints定义行:
# 原错误写法:生成嵌套列表 # 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
方式2:定义单条约束时不套列表
把所有单独约束定义时的外层[]去掉,示例如下:
# 原写法套了[] # constraint_genflow = [cvx.matmul(A,f)==cvx.matmul(B,p)] # 修正写法直接存约束对象 constraint_genflow = cvx.matmul(A,f)==cvx.matmul(B,p)
其余所有约束都按这个方式修改后,原来的汇总写法constraints = [constraint_nodalpot, constraint_genpower1, ...]就可以正常使用。
额外修正点
你的代码还存在维度不匹配的笔误:constraint_flowlimit2 = [cvx.matmul(E,f)>=E]中,E是6×6的矩阵,cvx.matmul(E,f)是6×1的向量,二者维度不匹配,应该和你提前定义的下限F比较:
# 修正维度不匹配问题 constraint_flowlimit2 = [cvx.matmul(E,f)>=F]
不修正该问题,列表报错解决后还会触发维度校验错误。
内容的提问来源于stack exchange,提问作者ewolf
相关产品推荐
相关产品推荐

