[英]Initialize to iterate over set in abstract pyomo model?
我正在嘗試調試一個抽象的 pyomo model(電力投資/調度),並且無法通過以下錯誤:
“在 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 ;
謝謝!
這里的問題不在於您的數據。 Python(不是 pyomo)正在嘗試執行您的gen_cost
和trans_cost
語句,並且集合(顯然)未初始化。 您可以通過與 pyomo 中的 def-rule 模式保持一致來屏蔽這些語句,直到 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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.