cvxpy添加约束时报numpy.bool_无parameters属性错误求解
问题原因
你遇到的报错本质是numpy数值类型和cvxpy的运算符重载逻辑冲突导致的:
- cvxpy为了支持声明约束,重写了
<=、>=等比较运算符,当Python原生的int/float和cvxpy变量做比较时,会返回cvxpy定义的Constraint约束对象,这类对象包含parameters()方法,可供求解器遍历参数使用。 - 但你代码里的
agg[0]是numpy.float64类型,numpy的运算符优先级高于cvxpy的重载实现,当numpy标量和cvxpy变量做比较时,会直接触发numpy的比较逻辑,返回numpy.bool_类型的布尔值(True/False),而不是cvxpy需要的约束对象。 - 你把numpy标量替换成原生数值10时,比较逻辑会正常调用cvxpy的重载运算符,生成合法约束,所以代码可以正常运行。
解决方案
任选一种即可修复问题:
- 取值时转成Python原生数值:把约束行修改为
obj_constraints += [-float(agg[0]) <= SoC, SoC <= float(agg[0])] - 把agg数组转换为Python原生列表后再使用:在
agg = np.array([10.0,2.0,2.0,0])后加一行agg = agg.tolist() - 用cvxpy的Parameter封装参数:声明
agg0 = cp.Parameter(value=float(agg[0])),约束里使用agg0代替agg[0]
内容的提问来源于stack exchange,提问作者Xu Siyuan
相关产品推荐
相关产品推荐

