Пёмо: Почему решатель находит значение за пределами указанного домена?

Редактирование, чтобы лучше ответить на мой вопрос.

Имейте переменную 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 выдаст сообщение об ошибке. Я не думаю, что существуют решатели MIP, которые допускают такие ограниченные домены в целочисленных переменных.

Erwin Kalvelagen 01.05.2024 18:12

Интересно, окей. В их документации по набору (pyomo.readthedocs.io/en/stable/pyomo_modeling_comComponents/…) у них есть несколько примеров, которые очень похожи на мой случай с.r.t. ограниченные домены

Bahumat 02.05.2024 15:16

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

Erwin Kalvelagen 02.05.2024 16:01

Я предлагаю вам отредактировать свое сообщение и включить небольшой, более полный пример того, что вы пытаетесь сделать (даже если это не работает), чтобы получить некоторую помощь. @ErwinKalvelagen на высоте... Вам нужно подойти к этому под другим углом, если вы пытаетесь представить события, происходящие в разные дни. Без дополнительной информации невозможно дать рекомендации.

AirSquid 02.05.2024 16:29
Загадки Python - Генерация простых чисел!
Загадки Python - Генерация простых чисел!
Обычно существует несколько способов решения задач даже пограничной сложности. Как же определить оптимальное и эффективное решение?
0
4
86
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я бы смоделировал это по-другому. В псевдокоде:

 set wd (working days)
 binary variable x(wd)
 sum(wd,x(wd)) = 1

Возможно, будет проще сделать wd большим одномерным набором (вместо кортежа (месяц, день месяца).

Другие вопросы по теме

Проблема назначения с использованием scipy оптимизировать linprog для решения на Python
Задача линейного программирования с переменной многосторонней перестановкой обязанностей
Распределите список положительных чисел на желаемое количество наборов, стараясь, чтобы суммы между ними были как можно ближе
Решатель линейных программ CBC, кажется, дает «оптимальные» решения с разными целями для одной и той же проблемы (и кода)
ПЬЁМО: Л.П. Задача оптимизации аккумулирования тепла. Я хочу определить область определения переменной с помощью дискретных чисел с плавающей запятой
Ограничения одновременного интервала и продолжительности с временными промежутками в Gekko
Ограничения по времени в Gekko
Работа с неоптимальными решениями от Gekko
Двоичная и целочисленная программа на Python
Различия между решателем Excel и решателем OR Tools в Python