[英]Pyomo — initialize a Set() with a list of (python) sets
我可以在pyomo中使用集合列表初始化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:我正在研究網絡攔截模型。 我的模型集代表網絡中的一組路徑。 我想使用(python)集來存儲路徑,因為模型約束僅限於可行路徑。 因此,我需要檢查路徑中是否有任何邊線被遮擋,並且哈希函數將使我能夠有效地檢查被遮擋的邊線是否入射在路徑上。 換句話說,稍后我有一個函數:
def is_feasible(model, path):
return any([edge in path and model.Interdicts[edge].value] for edge in model.edges)
其中path是我的Set的元素,而model.Interdicts是Var(model.edges,在=二進制內)
我的后備方法是使用引用外部列表中路徑的索引來初始化Set,但是隨后我不得不將pyomo模型與非模型元素混合起來以評估模型約束,這確實讓人頭疼(但是大多數網絡攔截建模...)
首先,假設您可以創建一個看起來像這樣的Pyomo Set對象,您可能無法像在其他組件的索引集中那樣使用它,因為這些條目不可哈希。 等同於執行以下操作
>>> 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
之類的frozenset
作為Set中的元素。
我打算在此時說些其他事情,這與Pyomo Set對象如何要求所有條目具有相同的維數(例如,相同大小的元組)有關,但是看起來好像使用frozenset
也可以解決此問題問題。 您最初看到的錯誤原因與Pyomo Set對象試圖用您提供的set
對象填充其基礎存儲set
這一事實有關,Python不允許這樣做(與使用set
作為鍵的相同問題一本字典)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.