1

我正在尝试在 Minizinc 中为下一个约束建模:

假设 S 是一个大小为 n 的决策变量数组。我希望我的决策变量取一个介于 1-k 之间的值,但使用的连续值的数量有一个最大值“Cons_Max”。

例如,假设 Cons_Max = 2,n = 8 和 k = 15,则序列 [1,2,4,5,7,8,10,11] 是有效序列,而 eg [1,2,3, 5,6,8,9,11] 不是有效序列,因为此处的最大连续值数等于 3 (1,2,3)。重要的是要提到序列 [1,3,5,7,9,10,12,14] 也是有效的,因为这些值不需要是连续的,但连续值的最大数量固定为“Cons_Max” .

关于如何在 Minizinc 中建模的任何建议?

4

2 回答 2

1

假设您使用数组 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)
                      );
于 2016-10-26T14:05:21.243 回答
1

这是一个模型,其方法似乎可行。我还添加了两个约束 all_diff 和增加,因为它们可能在问题中被假定。

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" ];
于 2016-10-26T17:11:36.450 回答