簡體   English   中英

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

[英]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_costtrans_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM