首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pyomo --使用(python)集合列表初始化Set()

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

Stack Overflow用户
提问于 2017-03-14 21:00:29
回答 1查看 3.5K关注 0票数 0

我可以在pyomo中用集合列表初始化Set()吗?换句话说,我想做这样的事情:

代码语言:javascript
复制
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()

不幸的是,这给了我一个错误:

代码语言:javascript
复制
ERROR: Constructing component 'a' from data=None failed:
TypeError: Problem inserting set([1, 2, 3]) into set c

有没有其他方法可以达到我错过的同样的效果?

戴利:我正在研究一个网络阻断模型。我的模型集代表了网络中的一组路径。我想使用(python)集来存储路径,因为模型约束仅限于可行路径。因此,我需要检查路径中的任何边是否被阻断,并且哈希函数将允许我有效地检查被阻断的边是否发生在路径上。换句话说,我稍后有一个函数:

代码语言:javascript
复制
def is_feasible(model, path):
    return any([edge in path and model.Interdicts[edge].value] for edge in model.edges)

其中path是我的集合中的一个元素,而model.Interdicts是一个变量(model.edges,model.Interdicts= binary)

我的退路是使用引用外部列表中路径的索引来初始化我的集合,但然后我不得不将pyomo模型与非模型元素混合来评估模型约束,这真是一个令人头疼的问题(但大多数网络阻断建模也是如此……)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-14 23:55:13

首先,假设您可以创建一个如下所示的Pyomo Set对象,您可能无法像在index set中那样将其用于其他组件,因为这些条目是不可哈希的。它等同于执行以下操作

代码语言:javascript
复制
>>> 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对象试图用您提供的set对象填充其底层存储set有关,这是Python不允许的(与使用set作为字典的键的问题相同)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42786732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档