Pyomo

2017-08-04 6 views
0

に複数の機能から値を取得する方法の目的関数はf1は、変数の関数であるxf2変数yの機能であるPyomo

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

であると仮定しましょう。

これは、私は(それが目的関数であるため)を呼び出すことによって、容易z(x,y)の数値を取得することが可能である知っている

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) 

としてPyomoで書くことができます

print(model.objective()) 

が、たとえそれらが明示的に目標として定義されていなくても、最適化の後にこれらのサブ関数のいずれかの数値を個別に取得する方法はありますか?

答えて

0

Pyomoのルールはほとんどの場合、ConcereteModelの構築を遅らせる仕組みに過ぎないので、私はあなたの質問にConcreteModelの点で答えます。今のところ、インデックス付きオブジェクトを定義する必要もありますが、間もなく変更される可能性があります。

まず、何らかの引数を取り、値を返す標準関数として、これらの "規則"を定義するのを止めることはありません。あなたはビルトインタイプ(例えば、F(1,5))と、これらの機能のいずれかを呼び出した場合、例えば、

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

は今、あなたは数を取り戻すだろう。しかし、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オブジェクトを使用して、評価するサブ式を保存したり、モデル上の複数の他の式内で共有したりすることもできます(これらはすべて、式オブジェクト)。