簡體   English   中英

最大連續數值(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和遞增,因為它們可能是問題中假定的。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM