在 Minizinc 中对数组进行排序的限制

Restriction to sort an array in Minizinc

我正在尝试使用代表数组长度的参数 n = 5 构建模型。该模型还有一个决策变量,其范围为 0..9 并涉及两个约束。首先是数组值的总和必须等于该数组值的乘积,最后一个必须是值的顺序应该递增。

我附上代码:

int: n = 5;    % Array length
var 0..9: x;

array[1..n] of var 1..n: V;

% Constraints
constraint sum(V) = product(V);    
constraint increasing(array[1..n] of var 1..n: V);    % Sort problem

solve satisfy;
output[show(V)];

如果要添加数组V有序的约束,可以使用库中的increasing约束

include "globals.mzn";
% ...
constraint increasing(V);

您还必须包含文件“globals.mzn”,其中包含 increasing.

的定义

完整模型如下:

include "globals.mzn";
int: n = 5;    % Array length
var 0..9: x;

array[1..n] of var 1..n: V;

% Constraints
constraint sum(V) = product(V);    
constraint increasing(V);

solve satisfy;
output[show(V)];

如果可能,使用接受的答案中指示的现有约束是很好的。如果没有可用的约束,最好也知道如何指定您自己的谓词。

包含您自己的递增规范的完整模型如下所示。

int: n = 5;    % Array length
var 0..9: x;

array[1..n] of var 1..n: V;

predicate increasing(array[1..n] of var 1..n: V) =
    forall(i in 1..n-1) (
        V[i] <= V[i+1]
    );

% Constraints
constraint sum(V) = product(V);    
constraint increasing(V);

solve satisfy;
output[show(V)];