Pyomo中字符串集合变量求和及FIJ组件索引报错解决方法
报错原因
你的代码存在三处核心错误,共同触发了该Pyomo内部报错:
- 集合初始化逻辑错误:你定义的i/j/k都是字符串列表,但给Pyomo Set传initialize参数时误用了
len(i),最终生成的集合元素是数字(比如i对应的集合只有元素3),和你实际要使用的字符串索引完全不匹配,后续变量索引时找不到对应维度的元素。 - 求和遍历逻辑错误:求和时你写的
for j in [len(HN_model.j)]仅遍历了单个数字元素,没有遍历整个j集合的所有元素;同时FIK求和时漏写了[i,k,s]的完整索引。 - 变量索引缺失:约束表达式中的FIW变量没有补全[i,s]的维度索引。
修正后代码
from pyomo.environ import * # 初始化模型 HN_model = ConcreteModel() # 正确初始化集合,直接传入字符串列表 i=['U4241', 'U241', 'U241A'] HN_model.i=Set(initialize=i) j=['U4283', 'U283', 'U283A', 'U3283', 'U2280', 'U1280'] HN_model.j=Set(initialize=j) k=['PSA4241', 'PSA241', 'PSA241A', 'PSA3241'] HN_model.k=Set(initialize=k) s=[1] HN_model.s=Set(initialize=s) # 变量定义保持不变 HN_model.FIJ=Var(HN_model.i, HN_model.j, HN_model.s, domain=PositiveReals) HN_model.FIW=Var(HN_model.i, HN_model.s, within=PositiveReals) HN_model.FIK=Var(HN_model.i, HN_model.k, HN_model.s, within=PositiveReals) # 正确定义约束:遍历完整集合、补全所有变量索引 def Prod_H2_rule(model, i, s): # 此处==右侧值请替换为你实际的约束目标值 return sum(model.FIJ[i, j, s] for j in model.j) + sum(model.FIK[i, k, s] for k in model.k) + model.FIW[i, s] == 0 HN_model.Prod_H2 = Constraint(HN_model.i, HN_model.s, rule=Prod_H2_rule)
修正说明
- 集合初始化直接传入你定义的字符串列表,Pyomo会自动把列表元素作为集合的索引值,和变量定义的维度完全匹配。
- 求和时直接遍历对应集合
model.j/model.k即可实现该维度所有变量的加总,不需要额外处理长度相关逻辑。 - 更推荐用rule规则函数定义约束,可读性更高,也能避免索引传递错误。
内容的提问来源于stack exchange,提问作者Patricia Rodrigues da Silva
相关产品推荐
相关产品推荐

