0

次の形式の Pyomo モデルがあります。

from pyomo.environ import *
from pyomo.dae import *

m      = AbstractModel()
m.t    = ContinuousSet(bounds=(0,120)) 
m.T    = Param(default=120)
m.S    = Var(m.t, bounds=(0,None))
m.Sdot = DerivativeVar(m.S)
m.obj  = Objective(expr=m.S[120],sense=maximize)

目標m.objはパラメータに依存することに注意してくださいm.T。これを実行しようとすると、次のエラーが表示されます。

TypeError: unhashable type: 'SimpleParam'

次のような値を使用するとexpr=m.S[120]、エラーが発生します。

ValueError: Error retrieving component S[120]: The component has not been constructed.

Sどちらの場合も、私の目標は同じです。地平線で の可能な最大値を最適化することです。

これを表現する抽象モデルを作成するにはどうすればよいですか?

4

1 に答える 1

1

あなたは2つのやや別々の問題にぶつかっています:

TypeError: unhashable type: 'SimpleParam'

Param単純なs を他のコンポーネントへのインデックスとして直接使用できないという Pyomo 4.3 のバグが原因です。とはいえ、この特定の問題を修正しても、サンプル モデルは修正されません。

宣言を修正する秘訣は、式をルール内Objectiveにカプセル化することです。Objective

def obj_rule(m):
    return m.S[120]
    # or better yet:
    #   return m.S[m.T]
    # or 
    #   return m.S[m.t.last()]
m.obj  = Objective(rule=obj_rule,sense=maximize)

問題は、抽象モデルを作成しているときに、各コンポーネントが宣言されているだけで、定義されていないことです。そのため、VarSは存在すると宣言されていますが、定義されていません (メンバーのない空のシェルです)。Python (Pyomo ではない) は、コンストラクターm.S[120]を呼び出す直前に を特定の変数に解決しようとするため、これは問題を引き起こします。Objective抽象モデルでルール (関数) を使用すると、Pyomo が実際にモデル インスタンスを構築するまで式の解決を遅らせることができます。Pyomo は、Abstract モデルで宣言したのと同じ順序でインスタンス コンポーネントを構築するため、 を起動するとobj_rule、前のコンポーネント ( ST、およびt) はすべて構築されており、既知のポイント(この場合は境界) に有S​​効なメンバーがあります。ContinuousSet

于 2016-08-23T22:37:09.213 に答える