2017-01-04 2 views
1

私はPyomoでかなり新しく、いくつかの方法を使って目的関数とモデルの制約を書こうとしています。実際には、さまざまなPythonスクリプトで実装された異なるオブジェクト型のいくつかの寄与に基づいて、目的関数/制約を構築したいと考えています。Pyomoでは、いくつかの式に基づいて目的関数や制約を書くことは可能ですか?

これを行うために、pyomo Expressionオブジェクトを使用しました。これが正しいオブジェクトであるかどうかはわかりません。私はその後、私の目的関数を実装しよう

import pyomo.environ 
model = pyomo.environ.ConcreteModel() 

model.market = pyomo.environ.Set(initialize=['market']) 

model.ask_price = pyomo.environ.Param(model.market, initialize={'market' : 12}) 
model.bid_price = pyomo.environ.Param(model.market, initialize={'market' : 10}) 
model.ask_liquidity = pyomo.environ.Param(model.market, initialize={'market' : 100}) 
model.bid_liquidity = pyomo.environ.Param(model.market, initialize={'market' : 100}) 

model.VOLUME_BUY = pyomo.environ.Var(model.market, within = pyomo.environ.NonNegativeReals) 
model.VOLUME_SELL = pyomo.environ.Var(model.market, within = pyomo.environ.NonNegativeReals) 

def max_buy(model, market): 
    return model.VOLUME_BUY[market] <= model.ask_liquidity[market] 

model.max_buy_equation = pyomo.environ.Constraint(model.market, rule=max_buy) 

def max_sell(model, market): 
    return model.VOLUME_SELL[market] <= model.bid_liquidity[market] 

model.max_sell_equation = pyomo.environ.Constraint(model.market, rule=max_sell) 

は私の質問を説明するために、ここで私がやりたいものを実装するコード例です。私は基本的にそれを実装しようとした場合、すべてが正常に動作します:

def total_objective(model): 
    return sum(model.VOLUME_BUY[market] * model.ask_price[market] for market in model.market) \ 
      - sum(model.VOLUME_SELL[market] * model.bid_price[market] for market in model.market) 

model.objective = pyomo.environ.Objective(rule=total_objective, sense=-1) 

しかし、私は表現オブジェクトを使用しようとします

def objective_component1(model): 
    return sum(model.VOLUME_BUY[market] * model.ask_price[market] for market in model.market) 

model.obj_component1 = pyomo.environ.Expression(rule=objective_component1) 

def objective_component2(model): 
    return - sum(model.VOLUME_SELL[market] * model.bid_price[market] for market in model.market) 

model.obj_component2 = pyomo.environ.Expression(rule=objective_component2) 

model.objective = pyomo.environ.Objective(rule=model.obj_component1 + model.obj_component2, sense=-1) 

私はエラーを取得する:

ValueError: No value for uninitialized NumericValue object VOLUME_BUY[market] 

私もしてみてください式を次のように書く:

obj1 = sum(model.VOLUME_BUY[market] * model.ask_price[market] for market in model.market) 
obj2 = - sum(model.VOLUME_SELL[market] * model.bid_price[market] for market in model.market) 
model.objective = pyomo.environ.Objective(rule=obj1 + obj2, sense=-1) 

しかし、私は同じエラーが発生します。

なぜ可変オブジェクトに対して初期化されていないエラーメッセージが表示されるのか分かりません。多分、pyomoオブジェクトの表現は、私の目的関数を構築するのに使用する正しいオブジェクトではないでしょうか?

私はまた、異なる表現を使用して私のモデルのバランス制約を構成したいと思いますし、それを行うこともできません。

私はPython 2.7とpyomo 4.4.1を使用しています。

ご協力いただきありがとうございます。

答えて

1

私は、Objectiveオブジェクトを初期化するためにruleキーワードを使用していることが問題だと考えています。これは、AbstractModelから(またはインデックスされたコンポーネントを宣言するとき)開始するときにのみ必要です。 Pyomo式は呼び出し可能であるため、標準関数から渡すものを区別していません(呼び出したので、式を返すことを期待しますが、式を評価するだけです)。

rule=からexpr=に変更する必要があります。

+0

Gabeに感謝します。問題を効果的に解決します。 –

関連する問題