【问题标题】:Pyomo -- initialize a Set() with a list of (python) setsPyomo -- 用 (python) 集合的列表初始化一个 Set()
【发布时间】:2017-03-14 13:00:28
【问题描述】:

我可以用集合列表在 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, within = binary)

我的后备方案是使用引用外部列表中路径的索引来初始化我的 Set,但随后我不得不将我的 pyomo 模型与非模型元素混合以评估模型约束,这确实令人头疼(但那么大多数网络拦截建模也是如此......)

【问题讨论】:

    标签: python pyomo


    【解决方案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 不允许这样做(与使用 @ 的问题相同) 987654326@ 作为字典的键)。

    【讨论】:

    • 完美!我将上述代码中的a = set([1,2,3])b = set([4,5,6]) 分别替换为a = frozenset([1,2,3])b = frozenset([4,5,6]),并且可以正常工作。谢谢!
    猜你喜欢
    • 2016-04-27
    • 2021-06-23
    • 1970-01-01
    • 2021-03-30
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    相关资源
    最近更新 更多