Pyomo инициализирует Set () списком наборов (python)

Могу ли я инициализировать Set () в pyomo со списком наборов? Другими словами, я хотел бы сделать что-то вроде этого:

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, внутри = binary)

Мой запасной вариант заключался в том, чтобы инициализировать мой Set с индексами, которые ссылаются на пути во внешнем списке, но тогда мне приходится смешивать мою модель pyomo с немодельными элементами для оценки ограничений модели, что является настоящей головной болью (но тогда и большинство моделей сетевых запретов ...)


person Tim    schedule 14.03.2017    source источник


Ответы (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 в качестве ключа для словарь).

person Gabe Hackebeil    schedule 14.03.2017
comment
Идеально! Я заменил a = set([1,2,3]) и b = set([4,5,6]) в приведенном выше коде на a = frozenset([1,2,3]) и b = frozenset([4,5,6]) соответственно, и он работает. Спасибо! - person Tim; 14.03.2017