Pyomo - 使用(python)集列表初始化Set()

时间:2017-03-14 13:00:29

标签: python pyomo

我可以使用集合列表在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:我正在研究网络拦截模型。我的模型Set表示网络中的一组路径。我想使用(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,in = binary)

我的后备是使用引用外部列表中的路径的索引来初始化我的Set,但是我必须将我的pyomo模型与非模型元素混合以评估模型约束,这是一个真正的头痛(但大多数网络拦截建模都是如此......)

1 个答案:

答案 0 :(得分:1)

首先,假设您可以创建一个看起来像这样的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之类的内容作为Set中的元素。

我打算在这一点上说一些别的东西与Pyomo Set对象如何要求所有条目具有相同的维度(例如,相同大小的元组),但它看起来像使用frozenset也可以让你解决这个问题。您最初看到的错误来源与Pyomo Set对象尝试使用您提供的set对象填充其底层存储set这一事实有关,而Python不允许这样做(同样的问题)使用set作为字典的关键字。)