2017-12-20 7 views
-1

は、私たちは、次のセットを考えてみましょう私は呼び出すことによって何を得るPyomoがセットの値を呼び出す

inst = create_model(site='Mid') 

inst.sub_sit.pprint()

In:

アウト210
inst.sub_sit.pprint() 

sub_sit : site of sub problem 
    Dim=0, Dimen=1, Size=1, Domain=None, Ordered=False, Bounds=None 
    ['Mid'] 

は、私が本当に出力したいことは、'Mid'である私は'Mid'とインデックス他のオブジェクトをすることができますし、私は私のコードでそれを使用できるようにします。

例えば:

のIn1:PiZero
のIn2:PiZero[inst.sub_sit[1]]
In3を:PiZero['Mid']
のOut1:

sub_sit 
Mid -1.0 
Name: sub_costs, dtype: float64 

端Out2:-1.0

OUT3:-1.0

質問:とにかくこの'Mid'の文字列をm.sub_sitのpyomoセットオブジェクトから呼び出すことはありますか?

ところでm.sub_sit.valueは私が必要なほとんど何、出力が得られます。{'Mid'}

+0

角括弧を使用してPyomoセットにインデックスを作成しようとしているのはなぜですか?変数をsub_sitで索引付けする場合は、m.PiZero = Var(m.sub_sit、initialize = -1) –

+0

これは具象モデルであり、PiZeroはサブモデル内にない二重変数です。マスターモデルのカットを生成するために使用されています... – Icedkk

+0

@Engineero PiZeroはpandasシリーズオブジェクトだったので、pandasシリーズについてでした。 TYを編集するだけでなく、あなたは間違っています。 – Icedkk

答えて

0

まずordered=Truem.sub_sitに追加されます。その後'Mid'inst.sub_sit[1]で発呼できました。これは順序付けされていなければ、エラーを生成し、順序付けられていないセットの最初のオブジェクトを呼び出すことはできません。で

m.sub_sit = pyomo.Set(
    initialize=[site], 
    ordered=True, 
    doc='site of sub problem') 

inst.sub_sit[1] 

アウト:

'Mid' 
0

あなたは角括弧を使用してPyomoセットにインデックスを持っていることはありません。これをやりたいと思えば、ネイティブのPythonリストの代わりにPyomo Setを使う動機を再考したいかもしれません。

あなたの目標はPyomoセットの値を反復処理し、パンダのオブジェクトへのインデックスにそれらを使用するのであれば、あなたのような何かを行うことができます。

for s in m.sub_sit: 
    v = PiZero[s] 
    # Do something with v 

また、あなたがリストにPyomoセットをキャストすることができますし、を代わりにリストを使って作業してください:

s = list(m.sub_sit) 

もう一度、これを行うつもりなら、本当にPyomoセットが必要ですか?

さらに、PandasとPyomoを併用した例をご希望の場合は、this github repoを見てください。特に、Pandas DataFrameからの値を使用してPyomo Setsを作成する例や、DataFrameでデータを使用する制約を作成する方法を確認することができます。

+0

それは巨大なモデルであり、同じモデルが異なるモデルを作成するために使用されます。 sub_sitが他の文字列に変更されているという例外は1つだけです。そして、私はforループを使う必要はありません。なぜなら、 'Mid'がそれの唯一の要素だからです。はい、私は、次のようなネイティブのpython変数を使用することができます:sub_sit = 'Mid'そしてそれをインデックス化しますが、欠点はconst_rulesに与えられたモデルが常にm.sub_sitの値を得ることができるので、それらのconst_rulesの内部。 'DEF sub_costs_rule(M): リターン(pyomo.summation(m.costs)<= m.eta_res [m.sub_sit [1] + m.Lambda * m.omegazero) ' ここ – Icedkk

+0

は一例ではい、私はいつも 'def sub_costs_rule(m、sub_sit)'を実行することができますが、 'sub_cost_rule'には他のインデックスがあり、私の関数のいくつかが壊れています。だから最初の方法でより良い。 – Icedkk

+0

sub_sitには複数のアイテムがありますか?もう1つの選択肢は、モデルに独自のデータを添付することです。 'm.sub_sit = 'Mid''または' m.sub_sit = [' Mid '] ' –

関連する問題