2017-03-14 19 views
0

我可以用python集合列表初始化pyomo中的Set()嗎?換句話說,我希望做這樣的事情:Pyomo - 用(Python)集合列表初始化Set()

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:我正在研究網絡攔截模型。我的模型Set表示網絡中的一組路徑。我想使用(python)集來存儲路徑,因爲模型約束被限制在可行的路徑中。因此,我需要檢查路徑中是否存在任何邊,並且哈希函數將允許我有效地檢查停頓邊是否在路徑上發生。換句話說,我以後的功能:

def is_feasible(model, path): 
    return any([edge in path and model.Interdicts[edge].value] for edge in model.edges) 

其中path是我的集合中的元素,並且model.Interdicts是VAR(model.edges,內=二進制)

我後退了一直使用引用外部列表中的路徑的索引來初始化我的Set,但是之後我必須將我的pyomo模型與非模型元素混合來評估模型約束,這是一個真正令人頭痛的問題(但大多數網絡攔截器建模...)

回答

1

首先,假設您可以創建一個看起來像這樣的Pyomo Set對象,您可能無法像o中的索引集那樣使用它因爲條目不可散列,所以組件。這將等同於做以下

>>> 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' 

所以,你可能不得不求助於使用類似frozenset在您所設定的元素。

我打算在這一點上說點別的東西,如果Pyomo Set對象要求所有條目具有相同的維度(例如,相同大小的元組),但它看起來像使用frozenset也允許你解決這個問題。您最初看到的錯誤的來源與Pyomo Set對象試圖用您提供的對象填充setset這個事實有關,Python不允許(與使用set作爲關鍵字的問題相同)一本字典)。

+0

完美!在上面的代碼中,我用'a = frozenset([1,2,3])替換了'a = set([1,2,3])和'b = set([4,5,6])'和'b = frozenset([4,5,6])',它的工作原理。謝謝! – Tim