2017-08-04 52 views
0

得到多种功能的值,让我们假设目标函数是如何Pyomo

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

其中f1是变量函数xf2是变量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

我会用一个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和我有装入它们的值(即.value的属性比其他None东西),那么你可以调用他们的子功能之一,并评估返回的表达式(慢)

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

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

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

您还可以使用Expression对象来存储您要动态评估的子表达式,或在模型中的多个其他表达式内共享(您可以通过更改表达式存储在表达式目的)。