Максимальное количество последовательных дней с одним и тем же режимом работы для задачи планирования

Я решаю задачу планирования нефтепереработки, в которой технологические установки могут работать в разных режимах. Допустим, технологическая установка X имеет два режима работы A и B. Я ищу эффективную формулировку, которая заставит мою модель планирования MILP составлять расписание на 10 дней, например AAAAAA BBBB вместо A B A B AA B A B A, т.е. количество переключателей режимов должно быть минимальным.

В настоящее время в моей модели есть двоичная переменная use_caps (mode, day), которая равна 1, тогда режим работы выбирается на день. Я использую эту переменную для создания следующей переменной 1-0: same_mode (mode, day) = e = use_caps (mode, day) + use_caps (mode, day + 1) - 1. Рассчитываю на все дни кроме последнего. Как видите, переменная same_mode (mode, day) принимает значение 1, тогда day и day + 1 используют один и тот же режим работы, в противном случае это 0.

Затем я использую его, чтобы вознаградить модель за построение расписания с минимальными переключениями. Я делаю это, добавляя к своей цели бонус: same_mode_bonus = e = sum ((режим, дни), same_mode (режим, день) * бонус_значение), где Bonus_value - это относительно большой параметр. Поскольку у меня есть проблема максимизации прибыли, моя модель пытается составить требуемый график. Моя стратегия во многих случаях работает хорошо, но иногда терпит неудачу. Итак, мой вопрос заключается в следующем: есть ли другая лучшая стратегия / формулировка для построения такого расписания или единственный способ улучшить расписание - это настройка значения параметра Bonus_value?


person Andrei Kostin    schedule 22.09.2020    source источник


Ответы (1)


Я не уверен, что ваш подход правильный:

 same_mode(mode, day) =e= use_caps(mode, day) + use_caps(mode, day+1) - 1

Это запретит на данный день:

 use_caps(mode, day) = use_caps(mode, day+1) = 0

так как это даст same_mode(mode, day) = -1.

Я бы, вероятно, реализовал это как что-то вроде:

minimize sum(day, switch(day))
switch(day) >= use_caps(mode, day+1)-use_caps(mode, day)   ∀mode
switch(day) ∈ {0,1}

Т.е. мы считаем время перехода от 0 до 1 (для одного из режимов).

person Erwin Kalvelagen    schedule 22.09.2020
comment
Спасибо за ваш ответ и сообщение в вашем блоге. Модель работает намного лучше. Я забыл упомянуть, что технологическая установка может использовать два режима в течение дня для переключения из одного режима в другой. Чтобы свести к минимуму такие переключатели, я добавил дополнительные ограничения для их расчета. Они сформулированы также как переменная 1-0: shiftday (mode) = g = sum (mode, use_caps (mode, day)) -1. - person Andrei Kostin; 24.09.2020