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

How to get a value from multiple functions in Pyomo

假设 objective 函数是

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) 的数值(因为它是 objective 函数):

print(model.objective())

但是有没有办法在优化后单独获取这些子函数中的任何一个的数值,即使它们没有明确定义为 objectives?

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

首先,没有什么可以阻止您将那些 "rules" 定义为接受一些参数和 return 值的标准函数。例如,

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 表达式,您可以将其分配给 objective 或约束。这是可行的,因为 Pyomo 建模组件(例如变量)会重载标准代数运算符,如 +、-、* 等。这是一个如何使用这些函数构建 objective 的示例:

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))

现在,如果 m.x 和 m.y 中加载了一个值(即 .value 属性不是 None),那么您可以调用其中一个子-与它们一起运行并评估 returned 表达式(较慢)

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

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

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

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