Pyomo使用索引集构建约束报AttributeError错误如何解决?
问题原因
报错核心来源于objconst约束的索引定义错误:
构造Constraint组件时传入的第二个索引参数model.n[i]是无效的,该代码行执行时i没有上下文遍历值,无法动态获取每个i对应的n子集,Pyomo会将其识别为异常列表对象,而非合法的约束索引集合,因此在生成表达式时报出list无is_expression_type属性的错误。
解决方案
你已经提前构造了包含所有合法(i,n)组合的二维集合model.x,直接用它作为约束的索引即可,无需拆分索引参数。
修改后的对应代码段如下:
def rule3(model,i,n): return model.Db[i,n] >= sum(model.Sb[k,i,n]*model.t[k] for k in model.k) - model.tauB[i,n] # 替换原索引参数为已定义的二维集合model.x model.objconst = pyo.Constraint(model.x, rule=rule3)
可选优化
对于大规模模型,建议将求和逻辑替换为Pyomo内置的pyo.quicksum,表达式构建效率更高:
def rule3(model,i,n): return model.Db[i,n] >= pyo.quicksum(model.Sb[k,i,n]*model.t[k] for k in model.k) - model.tauB[i,n] model.objconst = pyo.Constraint(model.x, rule=rule3)
内容的提问来源于stack exchange,提问作者Jhh
相关产品推荐
相关产品推荐

