连续值的最大数量(Minizinc)
Max number of consecutive values (Minizinc)
我正在尝试在 Minizinc 中模拟下一个约束:
假设 S 是一个大小为 n 的决策变量数组。我希望我的决策变量取一个 1-k 之间的值,但是使用的连续值的数量有最大值 'Cons_Max'。
例如,假设Cons_Max = 2,n = 8,k = 15,那么序列[1,2,4,5,7,8,10,11]是一个有效序列,而例如[1,2,3,5,6,8,9,11] 不是有效序列,因为连续值的最大数量在这里等于 3 (1,2,3)。
值得一提的是,序列 [1,3,5,7,9,10,12,14] 也是有效的,因为这些值不需要连续,但连续值的最大数量固定为 'Cons_Max'.
关于如何在 Minizinc 中对此建模有什么建议吗?
假设您使用数组 x 来表示您的决策变量。
array[1..n] of var 1..k: x;
然后你可以像这样对约束建模。
constraint not exists (i in 1..n-1)(
forall(j in i+1..min(n, i+Cons_Max))
(x[j]=x[i]+1)
);
这是一个模型,其方法似乎可行。我还添加了两个约束 all_different 和 increasing 因为它们可能在问题中被假定。
include "globals.mzn";
int: n = 8;
int: k = 15;
int: Cons_Max = 2;
% decision variables
array[1..n] of var 1..k: x;
constraint
forall(i in 1..n-Cons_Max) (
x[i+Cons_Max]-x[i] > Cons_Max
)
;
constraint
increasing(x) /\
all_different(x)
;
%% test cases
% constraint
% % x = [1,2,4,5,7,8,10,11] % valid solution
% % x = [1,3,5,7,9,10,12,14] % valid valid solution
% % x = [1,2,3,5,6,8,9,11] % -> not valid solution (-> UNSAT)
% ;
solve satisfy;
output ["x: \(x)\n" ];
我正在尝试在 Minizinc 中模拟下一个约束:
假设 S 是一个大小为 n 的决策变量数组。我希望我的决策变量取一个 1-k 之间的值,但是使用的连续值的数量有最大值 'Cons_Max'。
例如,假设Cons_Max = 2,n = 8,k = 15,那么序列[1,2,4,5,7,8,10,11]是一个有效序列,而例如[1,2,3,5,6,8,9,11] 不是有效序列,因为连续值的最大数量在这里等于 3 (1,2,3)。 值得一提的是,序列 [1,3,5,7,9,10,12,14] 也是有效的,因为这些值不需要连续,但连续值的最大数量固定为 'Cons_Max'.
关于如何在 Minizinc 中对此建模有什么建议吗?
假设您使用数组 x 来表示您的决策变量。
array[1..n] of var 1..k: x;
然后你可以像这样对约束建模。
constraint not exists (i in 1..n-1)(
forall(j in i+1..min(n, i+Cons_Max))
(x[j]=x[i]+1)
);
这是一个模型,其方法似乎可行。我还添加了两个约束 all_different 和 increasing 因为它们可能在问题中被假定。
include "globals.mzn";
int: n = 8;
int: k = 15;
int: Cons_Max = 2;
% decision variables
array[1..n] of var 1..k: x;
constraint
forall(i in 1..n-Cons_Max) (
x[i+Cons_Max]-x[i] > Cons_Max
)
;
constraint
increasing(x) /\
all_different(x)
;
%% test cases
% constraint
% % x = [1,2,4,5,7,8,10,11] % valid solution
% % x = [1,3,5,7,9,10,12,14] % valid valid solution
% % x = [1,2,3,5,6,8,9,11] % -> not valid solution (-> UNSAT)
% ;
solve satisfy;
output ["x: \(x)\n" ];