2017-03-14 6 views
0

が、私はセットのリストとpyomoにセット()初期化することができます設定しますか?言い換えれば、私はこのような何かをしたいと思います:Pyomo - (パイソン)のリストとのセット()の初期化は

from pyomo.environ import * 

model = AbstractModel() 
a = set([1,2,3]) 
b = set([4,5,6]) 
model.c = Set(initialize = [a,b]) 

instance = model.create_instance() 

は残念ながら、これは私にエラーを与える:

ERROR: Constructing component 'a' from data=None failed: 
TypeError: Problem inserting set([1, 2, 3]) into set c 

は、私が行方不明です同じ効果を達成するための別の方法はありますか?

TL; DR:私は、ネットワークの禁止モデルに取り組んでいます。私のモデルセットは、ネットワーク内の一連のパスを表します。私はモデルの制約が実行可能なパスに限られているので、パスを格納するために(python)セットを使いたいです。したがって、パスのエッジが妨害されていないかどうかを確認する必要があり、ハッシュ関数によって、妨げられたエッジがパスに入っているかどうかを効率的にチェックできます。

def is_feasible(model, path): 
    return any([edge in path and model.Interdicts[edge].value] for edge in model.edges) 
パスは私のセットの要素である

、およびmodel.Interdictsは(内=バイナリ、model.edges)ヴァールある

私のフォールバックがあります。言い換えれば、私は後に機能を持っています私のSetを外部リストのパスを参照するインデックスで初期化していましたが、モデルの制約を評価するためにpyomoモデルと非モデル要素を混在させる必要がありました。これは本当の頭痛です(しかし、モデリング...)

答えて

1

まず、あなたはこのようになりますPyomo Setオブジェクトを作成することができると仮定すると、あなたはOのインデックスセットのようにそれを使うことができない場合がありますエントリはハッシュ可能ではないため、これらのコンポーネントは使用できません。それはあなたがあなたのセットの要素としてfrozensetのようなものを使用してに頼らする必要があり、次の

>>> x = set([1,2,3]) 
>>> y = dict() 
>>> y[x] = 1 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unhashable type: 'set' 

を行うことに相当します。

私はこの時点で、Pyomo Setオブジェクトがすべてのエントリが同じ次元(例えば、同じサイズのタプル)を持つことを必要とする方法と関係がありますが、frozensetはこの問題を回避するあなたが最初に見ていたエラーの原因は、Pyomo Setオブジェクトは、Pythonのためのキーとしてsetを使用して(同じ問題を許可していません。あなたが提供setオブジェクトとその基盤となるストレージsetを、移入しようとしていたという事実としなければなりませんでした辞書)。

+0

パーフェクト!上記のコードで 'a = set([1,2,3])'と 'b = set([4,5,6])'を 'a = frozenset([1,2,3])'に置き換えました。と 'b = frozenset([4,5,6])'と呼ばれ、動作します。ありがとうございました! – Tim

関連する問題