#linear-programming #ampl #integer-programming #mathprog
#линейное программирование #ampl #целочисленное программирование #mathprog
Вопрос:
У меня есть двоичная программа, и одна из моих переменных x_it
определяется в двух наборах, являясь I: Set of objects
и T: Set of the weeks of the year
, таким образом x_it
, двоичной переменной, обозначающей i
, присвоен ли объект чему-либо на неделе t
. Ограничение, которое мне не удалось реализовать в AMPL / GNU Mathprog, заключается в том, что if x_it
равно 1
then x_i(t 1)
, а x_i(t 2)
также должно принимать значение 1
. Есть ли способ реализовать это ограничение на простом языке математического программирования?
Ответ №1:
Подразумевается, что вы хотите реализовать это:
x(i,t) = 1 ==> x(i,t 1) = 1, x(i,t 2) = 1
AMPL поддерживает импликации (с помощью оператора ==> ), поэтому мы можем написать это напрямую. MathProg этого не делает.
Простым способом реализации импликации в виде простых линейных неравенств является:
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.
Комментарии:
1. Но не кажется ли вам, что эти ограничения в конечном итоге приводят к тому, что все
x_it
они равны 1?2. ДА. Я добавлю несколько разных подходов.