连续值的最大数量(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" ];