我刚刚开始使用Pyomo,我有一个很大的问题。我想在不使用终端的情况下运行抽象模型。我可以用一个具体的模型来做这件事,但用抽象的模型我有严重的问题要做。
我只想使用F5并运行代码。
这是我的程序:
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()最后一部分有帮助吗??
不管怎样,谢谢你,
发布于 2017-01-16 23:43:10
我认为你的例子实际上是有效的。从Pyomo 4.1开始,从求解器返回的解决方案直接存储到已求解的实例中,而不是在求解器结果对象中返回。之所以进行这种更改,是因为在results对象中生成解决方案的表示形式相当昂贵,并且不容易被人们解析。直接使用模型实例更加自然。
不幸的是,results对象报告了number of solutions: 0,尽管这在技术上是正确的: results对象没有保存任何解决方案……但Solver部分应指示已返回解决方案并将其存储到模型实例中。
如果要查看求解器返回的结果,可以使用以下命令打印出模型的当前状态:
instance.display()在调用solve()之后。它将报告从求解器返回的当前Var值。您需要注意stale列:
False表示该值不是"stale“...也就是说,它要么是由用户设置的(在调用solve()之前),要么是从解算器返回的(调用solve()之后)。True表示求解器未返回该变量的值。这通常是因为目标或任何启用的约束都没有引用该变量,因此Pyomo从未将该变量发送到求解器。注意:display()的作用与pprint()略有不同:pprint()输出模型结构,而display()输出模型状态。例如,在pprint()将输出约束表达式的情况下,display()将输出表达式的数值(使用当前变量/参数值)。
编辑版以扩展对display()和pprint()的讨论
https://stackoverflow.com/questions/41674105
复制相似问题