Создайте логическое ограничение dvar - PullRequest
0 голосов
/ 13 октября 2019

Я использую 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 ]

1 Ответ

0 голосов
/ 14 октября 2019

Я думаю, что ваше условие гласит: «если 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));
}
...