最大连续值数(Minizinc)

时间:2016-10-26 12:09:17

标签: optimization 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]也是有效的,因为值不需要是连续的,但是最大数量的连续值固定为& #39; Cons_Max'

有关如何在Minizinc中对此进行建模的任何建议?

2 个答案:

答案 0 :(得分:0)

假设您使用数组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)
                      );

答案 1 :(得分:0)

这是一个似乎有效的方法的模型。我还添加了两个约束all_different和增加,因为它们可能是在问题中假设的。

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" ];