如何从Pyomo中的多个函数中获取值

时间:2017-08-04 19:55:32

标签: pyomo

我们假设目标函数是

max z(x,y) = f1(x) - f2(y)

其中f1是变量x的函数,f2是变量y的函数。

这可以用Pyomo写成

def z(model):
    return f1(model) - f2(model)

def f1(model):
    return [some summation of x variables with some coefficients]

def f2(model):
    return [some summation of y variables with some coefficients]

model.objective = Objective(rule=z)

我知道通过调用(因为它是目标函数)可以轻松获得z(x,y)的数值:

print(model.objective())

但有没有办法在优化后单独获取这些子函数的数值,即使它们没有明确定义为目标?

1 个答案:

答案 0 :(得分:0)

我将根据ConcreteModel回答您的问题,因为Pyomo中的规则大多只是延迟构建ConcereteModel的机制。目前,他们还需要定义索引对象,但这可能很快就会改变。

首先,没有什么可以阻止你定义那些"规则"作为标准函数,它接受一些参数并返回一个值。如,

def z(x, y):
    return f1(x) - f2(y)
def f1(x):
    return x + 1
def f2(x):
    return y**2

现在,如果您使用内置类型(例如f(1,5))调用这些函数中的任何一个,您将得到一个数字。但是,如果您使用Pyomo变量(或Pyomo表达式)调用它们,您将获得一个Pyomo表达式,您可以将其分配给目标或约束。这是因为Pyomo建模组件(如变量)会重载标准代数运算符,如+, - ,*等。以下是如何使用这些函数构建目标的示例:

import pyomo.environ as aml
m = aml.ConcreteModel()
m.x = aml.Var()
m.y = aml.Var()
m.o = aml.Objective(expr= z(m.x, m.y))

现在,如果mx和my有一个值加载到它们中(即,.value属性不是None),那么你可以用它们调用其中一个子函数并计算返回的表达式(慢点)

aml.value(f1(m.x))
aml.value(f2(m.y))

或者您可以从中提取值并将其传递给子函数(更快)

f1(m.x.value)
f2(m.y.value)

您还可以使用Expression对象来存储要动态评估的子表达式,或者在模型上的多个其他表达式内共享(所有这些都可以通过更改存储在哪个表达式来更新Expression对象)。