Реализация ограничения, основанного на значении предыдущей переменной в GNU Mathprog / AMPL

#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 не разрешены. Это иногда называют минимальным временем безотказной работы в машинном планировании и может быть смоделировано по-разному.

  1. Запретить шаблоны 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
     
  2. Шаблон 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. ДА. Я добавлю несколько разных подходов.