在Pyomo中,是否可以基于多个表达式编写目标函数或约束?

2024-05-02 03:56:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Pyomo的新手,我尝试用几种方法来编写模型的目标函数和约束条件。实际上,我想根据在不同python脚本中实现的不同对象类型的几个贡献来构造目标函数/约束。在

为此,我使用了pyomo表达式对象。我不知道这是不是正确的对象使用。在

为了说明我的问题,下面是一个实现我想做的事情的示例代码:

import pyomo.environ
model = pyomo.environ.ConcreteModel()

model.market = pyomo.environ.Set(initialize=['market'])

model.ask_price = pyomo.environ.Param(model.market, initialize={'market' : 12})
model.bid_price = pyomo.environ.Param(model.market, initialize={'market' : 10})
model.ask_liquidity = pyomo.environ.Param(model.market, initialize={'market' : 100})
model.bid_liquidity = pyomo.environ.Param(model.market, initialize={'market' : 100})

model.VOLUME_BUY = pyomo.environ.Var(model.market, within = pyomo.environ.NonNegativeReals)
model.VOLUME_SELL = pyomo.environ.Var(model.market, within = pyomo.environ.NonNegativeReals)

def max_buy(model, market):
    return model.VOLUME_BUY[market] <= model.ask_liquidity[market]

model.max_buy_equation = pyomo.environ.Constraint(model.market, rule=max_buy)

def max_sell(model, market):
    return model.VOLUME_SELL[market] <= model.bid_liquidity[market]

model.max_sell_equation = pyomo.environ.Constraint(model.market, rule=max_sell)

然后我试着实现我的目标函数。如果我试着基本实现它,一切都能正常工作:

^{pr2}$

但如果我尝试使用表达式对象:

def objective_component1(model):
    return sum(model.VOLUME_BUY[market] * model.ask_price[market] for market in model.market)

model.obj_component1 = pyomo.environ.Expression(rule=objective_component1)

def objective_component2(model):
    return - sum(model.VOLUME_SELL[market] * model.bid_price[market] for market in model.market)

model.obj_component2 = pyomo.environ.Expression(rule=objective_component2)

model.objective = pyomo.environ.Objective(rule=model.obj_component1 + model.obj_component2, sense=-1)

我得到一个错误:

ValueError: No value for uninitialized NumericValue object VOLUME_BUY[market]

我甚至试着写下这个表达式:

obj1 = sum(model.VOLUME_BUY[market] * model.ask_price[market] for market in model.market)
obj2 = - sum(model.VOLUME_SELL[market] * model.bid_price[market] for market in model.market)
model.objective = pyomo.environ.Objective(rule=obj1 + obj2, sense=-1)

但我也犯了同样的错误。在

我不明白为什么我收到一个变量对象的未初始化错误消息。也许pyomo object表达式不是构造目标函数的正确对象?在

请注意,我还想使用不同的表达式构造模型的平衡约束,但我也没有做到。在

我使用的是python2.7和pyomo4.4.1。在

提前感谢您的帮助!在


Tags: 对象model表达式environbuyrulemarketprice
1条回答
网友
1楼 · 发布于 2024-05-02 03:56:36

我相信问题是您使用了rule关键字来初始化目标对象。您实际上只需要在从抽象模型(或声明索引组件)开始时执行此操作。由于Pyomo表达式是可调用的,所以它不能区分您传递给它的内容和标准函数(所以它调用它,期望它返回一个表达式,但实际上它只是对表达式求值)。在

rule=更改为expr=应该可以解决问题。在

相关问题 更多 >