Редактирование, чтобы лучше ответить на мой вопрос.
Имейте переменную x, которая представляет день года, например 1-365. Есть дни, которые запрещены. Поэтому я создаю список с действительными вариантами дня, а затем набор pyomo с model.jan = pyo.Set(initialize=month_lists[1])
.
Я определяю свое отображение следующим образом:
def x_domain(model, i, j):
domain_mapping = {
0: model.pdec,
1: model.jan,
2: model.feb,
...
}
return domain_mapping.get(i)
Затем создайте мою переменную x:
model.x = pyo.Var(model.months, model.cycles, domain=x_domain)
Домен выглядит точно так, как я ожидал, когда я его проверял, но решатель все еще находит решения, нарушающие домен. Январский домен
Key | Lower | Value | Upper | Fixed | Stale | Domain
(1, 6) : 1 : 7.0 : 31 : False : False : jan
Таким образом, переменная находит значение 7, когда оно явно не входит в домен.
Я могу придумать другие способы это описать, но не понимаю, почему этот подход не работает. Документация pyomo, похоже, поддерживает наборы дискретных целых чисел.
Интересно, окей. В их документации по набору (pyomo.readthedocs.io/en/stable/pyomo_modeling_comComponents/…) у них есть несколько примеров, которые очень похожи на мой случай с.r.t. ограниченные домены
Страница, на которую вы указываете, посвящена наборам, а не переменным. Так что совсем не похожи. (Множества экзогенны, а переменные эндогенны: мир различий).
Я предлагаю вам отредактировать свое сообщение и включить небольшой, более полный пример того, что вы пытаетесь сделать (даже если это не работает), чтобы получить некоторую помощь. @ErwinKalvelagen на высоте... Вам нужно подойти к этому под другим углом, если вы пытаетесь представить события, происходящие в разные дни. Без дополнительной информации невозможно дать рекомендации.
Я бы смоделировал это по-другому. В псевдокоде:
set wd (working days)
binary variable x(wd)
sum(wd,x(wd)) = 1
Возможно, будет проще сделать wd большим одномерным набором (вместо кортежа (месяц, день месяца).
Вместо этого используйте двоичные переменные. Обычно это проще. Сказав это, я ожидал, что Pyomo выдаст сообщение об ошибке. Я не думаю, что существуют решатели MIP, которые допускают такие ограниченные домены в целочисленных переменных.