我试图在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中对此进行建模的任何建议?
答案 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" ];