初始化以迭代抽象 pyomo 模型中的集合?

Initialize to iterate over set in abstract pyomo model?

我正在尝试调试抽象 pyomo 模型(电动 investment/dispatch),但无法克服以下错误:

“在构造(初始化)之前无法迭代 AbstractOrderedSimpleSet 'gen_type'。”

知道我做错了什么吗?好像提示我没有正确识别设置数据,是不是我的数据文件有问题?

请注意,我对使用 pyomo 很陌生,所以我确信代码还有很多其他问题(特别是在两个位置之间索引传输线和定义中间变量以构建 objective 函数),但如果不先解决此错误,我就无法继续前进(不过,如果您对索引传输和中间变量有任何想法,我将不胜感激)。

相关部分代码如下:

from pyomo.environ import *

model = AbstractModel()

### sets, parameters, and variables

#time, locations, generation types
model.tim=Set()
model.loc=Set()
model.gen_type=Set()

#generation capital and variable cost, transmission capital cost
model.gen_capcost=Param(model.gen_type)
model.gen_varcost=Param(model.gen_type)
model.trans_capcost=Param()

#generation capacity, electricity generated, transmission capacity, electricity transmitted
model.gen_cap=Var(model.gen_type,model.loc,within=NonNegativeReals)
model.elec_gen=Var(model.gen_type,model.tim,model.loc,within=NonNegativeReals)
model.trans_cap=Var(model.loc,model.loc,within=NonNegativeReals)
model.elec_trans=Var(model.tim,model.loc,model.loc,within=NonNegativeReals)

###objective

gen_cost= sum(model.gen_cap[g,l]*model.gen_capcost[g]+model.elec_gen[g,t,l]*model.gen_varcost[g] for g in model.gen_type for t in model.tim for l in model.loc)

trans_cost= sum(model.trans_cap[l,k]*model.trans_capcost for l in model.loc for k in model.loc)

def obj_rule(model):
    return gen_cost+trans_cost
model.obj=Objective(rule=obj_rule)

###constraints

def max_gen_cap_rule(model,g,t,l):
    return model.elec_gen[g,t,l]<=model.gen_cap[g,l]
model.max_gen_cap=Constraint(model.gen_type,model.tim,model.loc,rule=max_gen_cap_rule)

def max_trans_cap_rule(model,t,l,k):
    return model.elec_trans[t,l,k]<=model.trans_cap[l,k]
model.max_trans_cap=Constraint(model.tim,model.loc,model.loc,rule=max_trans_cap_rule)

数据文件的相关部分如下:

set tim := 1 2 3 4 ;

set loc := A B ;

set gen_type := solar wind hydro nuclear fossil ;

param gen_capcost :=
solar 100
wind 200
hydro 300
nuclear 400
fossil 250;

param gen_varcost :=
solar 1
wind 1
hydro 3
nuclear 5 
fossil 12;

param trans_capcost := 20 ;

谢谢!

此处的问题与您的数据无关。 Python(不是 pyomo)正在尝试执行您的 gen_costtrans_cost 语句,并且这些集合(显然)未初始化。您可以通过与 pyomo 中的 def-rule 模式保持一致来保护这些语句不被执行,直到 pyomo 使用数据调用它们。将你的 objective 重组为这个,我想你会在路上......

###objective

def obj_rule(model):
    gen_cost= sum(model.gen_cap[g,l]*model.gen_capcost[g]+model.elec_gen[g,t,l]*model.gen_varcost[g] for g in model.gen_type for t in model.tim for l in model.loc)
    trans_cost= sum(model.trans_cap[l,k]*model.trans_capcost for l in model.loc for k in model.loc)
    return gen_cost + trans_cost

model.obj=Objective(rule=obj_rule)