0

我刚从 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()

最后一部分有帮助吗??

不管怎么说,还是要谢谢你,

4

1 回答 1

0

我认为您的示例确实有效。从 Pyomo 4.1 开始,从求解器返回的解决方案直接存储到被求解的实例中,而不是在求解器结果对象中返回。之所以进行此更改,是因为在结果对象中生成解决方案的表示相当昂贵,并且不容易被人们解析。直接使用模型实例更自然。

不幸的是,结果对象报告了number of solutions: 0,尽管这在技术上是正确的:结果对象不包含任何解决方案......但是 Solver 部分应该指示解决方案已返回并存储到模型实例中。

如果要查看求解器返回的结果,可以使用以下命令打印出模型的当前状态:

instance.display()

调用后solve()。这将报告从求解器返回的当前Var值。您将需要注意该stale列:

  • False表示该值不是“陈旧的”……也就是说,它要么是由用户设置的(在调用 之前solve()),要么是从求解器返回的(在调用 之后solve())。
  • True表示求解器没有返回该变量的值。这通常是因为变量没有被目标或任何启用的约束引用,所以 Pyomo 从未将变量发送给求解器。

[注意:display()作用稍有不同pprint()pprint()输出模型结构,而display()输出模型状态。因此,例如,哪里pprint()将输出约束表达式,display()将输出表达式的数值(使用当前变量/参数值)。]


编辑ed 以扩展对display()&的讨论pprint()

于 2017-01-16T15:43:10.347 回答