2017-01-16 68 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()