初始化以迭代抽象 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_cost
和 trans_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)
我正在尝试调试抽象 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_cost
和 trans_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)