Создание логического ограничения dvar

Я использую OPL CPLEX 12.9

У меня проблемы с формулировкой следующего ограничения:

  • K [i] [t] - это логическое значение dvar, а t - это индекс времени.
  • Если K [i] [t] == ​​0, он должен быть равен нулю в течение двух часов, прежде чем снова станет 1.

Я бы хотел добиться, например, следующего результата

K[i][t] = [0 0 1 0 0 1 1 1 0 0 0 ]

Я уже пробовал:

range T = t_min..t_max;

range T1 = t_min-1 ..t_max+1;

dvar boolean K[I][T1];

forall ( i in I, t in T){ 

ct:

(K[i][t-1]==0) => (K[i][t]== 0) => (K[i][t+1]==1 || K[i][t+1]==0) &&

(K[i][t-1]==1) => (K[i][t]==1 || K[i][t]==0);

Но в результатах эти побочные условия игнорируются. Я получаю результат как

K[i][t] = [0 0 1 0 1 1 0 0 1 1 0 ]

person Frieda12    schedule 13.10.2019    source источник
comment
Несколько дней назад я ответил на тот же вопрос в Stack Overflow stackoverflow.com/questions/58087318/   -  person Alex Fleischer    schedule 14.10.2019


Ответы (1)


Я думаю, ваше условие гласит: «Если K [i] [t] равно 0, то либо K [i] [t-1], либо K [i] [t + 1] также должны быть равны нулю» ». Значит тебе нужно

forall (i in ...) {
  (K[i][t_min] == 0) => (K[i][t_min+1] == 0);
  (K[i][t_max] == 0) => (K[i][t_max-1] == 0);
  forall(t in t_min+1..t_max-1)
    (K[i][t] == 0) => ((K[i][t-1] == 0) || (K[i][t+1] == 0));
}
person Daniel Junglas    schedule 14.10.2019
comment
Большое спасибо за вашу помощь, ребята! Это решает мою проблему, теперь я действительно счастлив! - person Frieda12; 22.10.2019