2017-08-04 84 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對象來存儲您要動態評估的子表達式,或在模型中的多個其他表達式內共享(您可以通過更改表達式存儲在表達式目的)。