[英]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和遞增,因為它們可能是問題中假定的。
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" ];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.