У меня есть двоичная программа и одна из моих переменных, x_it
, определена в двух наборах: I: Set of objects
и T: Set of the weeks of the year
, таким образом, x_it
— это двоичная переменная, обозначающая, назначен ли объект i
чему-то на неделе t
. Ограничение, которое мне не удалось реализовать в AMPL/GNU Mathprog, заключается в том, что если x_it
равно 1
, то x_i(t+1)
и x_i(t+2)
также должны принимать значение 1
. Есть ли способ реализовать это ограничение на простом языке математического программирования?
Реализация ограничения на основе предыдущего значения переменной в GNU Mathprog/AMPL
Ответы (1)
Вывод, который вы хотите реализовать:
x(i,t) = 1 ==> x(i,t+1) = 1, x(i,t+2) = 1
AMPL поддерживает импликации (с оператором ==›), так что мы можем написать это напрямую. Матпрог нет.
Простой способ реализовать импликацию в виде прямых линейных неравенств:
x(i,t+1) >= x(i,t)
x(i,t+2) >= x(i,t)
Это можно легко выразить в AMPL, MathProg или любом инструменте моделирования.
Это чистый, наивный перевод вопроса. Однако это означает, что когда-то один x(i,t)=1
все последующие x(i,t+1),x(i,t+2),x(i,t+3)..=1
. Этого можно было бы добиться с помощью ограничения x(i,t+1) >= x(i,t)
.
Лучшей интерпретацией было бы: нам не нужны очень короткие тиражи. т.е. шаблоны: 010 и 0110 не допускаются. Это иногда называется минимальным временем безотказной работы при планировании машин и может быть смоделировано по-разному.
Запретить шаблоны 010 и 0110:
(1-x(i,t-1))+x(i,t)+(1-x(i,t+1)) <= 2 (1-x(i,t-1))+x(i,t)+x(i,t+1)+(1-x(i,t+2)) <= 3
Шаблон 01 подразумевает 0111:
x(i,t+1)+x(i,t+2) >= 2*(x(i,t)-x(i,t-1))
Оба эти подхода предотвратят появление шаблонов 010 и 0110.
x_it
равны 1 ?
- person oakenshield1; 08.12.2020