Binary 创建dvar布尔约束

Binary 创建dvar布尔约束,binary,constraints,cplex,opl,Binary,Constraints,Cplex,Opl,我使用的是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

我使用的是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 ]

我认为你的条件是“如果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));
}

几天前,我在Stack Overflow中回答了同样的问题,非常感谢你们的帮助!它解决了我的问题,我现在真的很开心!