[英]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.