2017-01-16 70 views
0

我剛剛開始使用Pyomo,並且遇到很大問題。 我想在不使用終端的情況下運行抽象模型。我可以用一個具體的模型來完成,但是我有嚴重的問題需要用抽象的模型來完成。在抽象的模型中轉換具體模型

我只想使用F5並運行代碼。

這ismy程序:

import pyomo 
from pyomo.environ import * 
# 
# Model 
# 
model = AbstractModel() 



#Set: Indices 
model.Unit = Set() 
model.Block = Set() 
model.DemBlock = Set() 
#Parameters 
model.EnergyBid = Param(model.Unit, model.Block) 
model.PriceBid = Param(model.Unit, model.Block) 
model.EnergyDem = Param(model.DemBlock) 
model.PriceDem = Param(model.DemBlock) 
model.Pmin = Param(model.Unit) 
model.Pmax = Param(model.Unit) 
#Variables definition 
model.PD = Var(model.DemBlock, within=NonNegativeReals) 
model.PG = Var(model.Unit,model.Block, within=NonNegativeReals) 
#Binary variable 
model.U = Var(model.Unit, within = Binary) 
#Objective 
def SocialWellfare(model): 
    SocialWellfare = sum([model.PriceDem[i]*model.PD[i] for i in model.DemBlock]) - sum([model.PriceBid[j,k]*model.PG[j,k] for j in model.Unit for k in model.Block ]) 
    return SocialWellfare 
model.SocialWellfare = Objective(rule=SocialWellfare, sense=maximize) 
#Constraints 
#Max and min Power generated 
def PDmax_constraint(model,p): 
    return ((model.PD[p] - model.EnergyDem[p])) <= 0 
model.PDmax = Constraint(model.DemBlock, rule=PDmax_constraint) 
def PGmax_constraint(model,n,m): 
    return ((model.PG[n,m] - model.EnergyBid[n,m])) <= 0 
model.PGmax = Constraint(model.Unit, model.Block,rule = PGmax_constraint) 
def Power_constraintDW(model,i): 
    return ((sum(model.PG[i,k] for k in model.Block))-(model.Pmin[i] * model.U[i])) >= 0 
model.LimDemandDw = Constraint(model.Unit, rule=Power_constraintDW) 
def Power_constraintUP(model,i): 
    return ((sum(model.PG[i,k] for k in model.Block) - (model.Pmax[i])*model.U[i])) <= 0 
model.LimDemandaUp = Constraint(model.Unit, rule=Power_constraintUP) 
def PowerBalance_constraint(model): 
    return (sum(model.PD[i] for i in model.DemBlock) - sum(model.PG[j,k] for j in model.Unit for k in model.Block)) == 0 
model.PowBalance = Constraint(rule = PowerBalance_constraint) 



model.pprint() 
instance = model.create('datos_transporte.dat') 

## Create the ipopt solver plugin using the ASL interface 
solver = 'ipopt' 
solver_io = 'nl' 
opt = SolverFactory(solver,solver_io=solver_io) 

results = opt.solve(instance) 
results.write() 

與最後一部分任何幫助?

無論如何感謝,

+0

乍一看,您的模型在語法上看起來很好。對於當前的Pyomo版本有一些修正(你不需要'import pyomo'行,並且在當前的Pyomo版本中,我們推薦使用'model.create_instance('datos_transporte)創建實例。dat')'),但我用當前的Pyomo運行了你的模型,並沒有得到任何錯誤(除了沒有你的.dat文件)。你碰到什麼特定的錯誤/問題?你用什麼版本的Pyomo?你使用什麼數據文件? – jsiirola

回答

0

我認爲你的例子是實際工作。從Pyomo 4.1開始,解算器返回的解決方案直接存儲到已解決的實例中,並且在求解器結果對象中返回而不是。由於在結果對象中生成解決方案的代表性相當昂貴並且不容易被人們解析,因此進行了此更改。直接使用模型實例更自然。

不幸的是,結果對象報告number of solutions: 0,儘管這在技術上是正確的:結果對象不包含任何解決方案......但求解器部分應該指出解決方案已返回並存儲到模型實例中。調用solve()

instance.display() 

如果你想看到的求解器返回的結果,您可以使用打印出來的模型的當前狀態。這將報告解算器返回的當前Var值。您將要注意stale列:

  • False指示值是不是「過時」 ......也就是說,它是由用戶(調用solve()之前)設置,或者是從求解器返回(在致電solve()後)。
  • True表示解算器未返回該變量的值。這通常是因爲變量沒有被目標或任何啓用的約束所引用,所以Pyomo從未將該變量發送給求解器。

[注:display()供應比pprint()稍微不同的角色:pprint()輸出模型結構,而display()輸出模型狀態。因此,舉例來說,其中pprint()將輸出約束表達式,display()將輸出表達式的數值(使用當前的變量/參數的值)。]


編輯編擴大display()討論& pprint()