创建一个 dvar 布尔约束
Create a dvar boolean Constraint
我正在使用 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 ]
我认为你的情况是 "if K[i][t] is 0 then either K[i][t-1] or K[i][t+1] must be zero as well"。所以你需要
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));
}
我正在使用 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 ]
我认为你的情况是 "if K[i][t] is 0 then either K[i][t-1] or K[i][t+1] must be zero as well"。所以你需要
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));
}