我们假设目标函数是
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())
但有没有办法在优化后单独获取这些子函数的数值,即使它们没有明确定义为目标?
答案 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对象)。