Pyomo表达式中For循环迭代的语法错误求助
解决Pyomo中Expression使用循环的问题
看起来你想要创建一个索引化的Expression,每个索引i对应model.r + df['Xi'][i],但你的写法有两个关键问题:
问题1:model.N的类型错误
你把model.N定义成了Param,但它本质是用来索引的集合,应该定义为Set类型。Param是用来存储参数值的,而Set才是Pyomo中用来索引变量、约束、表达式的容器。
修正这部分代码:
N = range(len(df)) model.N = Set(initialize=N) # 替换原来的Param定义
问题2:Expression的循环初始化方式错误
直接用生成器expr= model.r + df['Xi'][i] for i in N是行不通的,因为Pyomo的Expression如果是索引化的,需要明确指定每个索引对应的表达式,你可以用以下两种方法实现:
方法1:使用Rule函数(推荐)
定义一个规则函数,处理每个索引i对应的表达式逻辑:
def v2_expression_rule(model, i): # 对每个i返回对应的表达式 return model.r + df['Xi'][i] # 基于model.N索引创建Expression model.v2 = Expression(model.N, rule=v2_expression_rule)
方法2:使用字典初始化
直接构建一个键为索引、值为对应表达式的字典,传给expr参数:
model.v2 = Expression(model.N, expr={i: model.r + df['Xi'][i] for i in model.N})
额外说明
如果你其实是想把所有i对应的表达式加总(而不是每个i对应一个表达式),那可以直接用sum生成单个表达式:
model.v2 = Expression(expr=sum(model.r + df['Xi'][i] for i in model.N))
内容的提问来源于stack exchange,提问作者erezlale
相关产品推荐
相关产品推荐

