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

2024-09-30 23:46:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图调试一个抽象的pyomo模型(电力投资/调度),但无法通过以下错误:

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

知道我做错了什么吗?这似乎表明我没有正确识别集合数据,我的数据文件是否有问题

请注意,我对使用pyomo非常陌生,因此我确信代码中还有很多其他问题(特别是在两个位置之间的传输线索引和定义中介变量以构建目标函数方面),但如果不先解决这个错误,我就无法前进(不过,如果您对索引传输和中间变量有什么想法,我将非常感谢您的建议)

守则的有关部分如下:

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 ;

谢谢大家!


Tags: intransformodelvartyperuleloc
1条回答
网友
1楼 · 发布于 2024-09-30 23:46:27

这里的问题不在于你的数据。Python(不是pyomo)正在尝试执行gen_costtrans_cost语句,而且这些集合(显然)没有初始化。通过与pyomo中的def规则模式保持一致,您可以在pyomo使用数据调用这些语句之前阻止执行这些语句。重新调整你的目标,我想你会走上你的路

###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)

相关问题 更多 >