Minizinc:table 特征的最优排序

Minizinc: optimal ordering on table feature

我有一个 table,其特征 = {A,B}。 B 是一列整数。扫描 table,当我在 B 列中有值更改时,我将变量 "changes" 增加 1:

if data[i,B]!=data[i-1,B]
then changes=changes+1

我想找到一个顺序,使变化最小化,同时在[0,upper_bound]中保持B中某个值的重复。 我正在考虑使用数组作为决策变量,其中保存元素 i 的位置 j:

order[i]=j means i element in data is the j-th element in ordering.

如何使用约束进行建模?这是我到目前为止所做的:

array[1..n, Features] of int: data;
int: changes=0;
constraint
   forall(i in 1..n) (
      if data[i,B] != data[i-1,B] then
        changes=changes+1
      endif
   )
;
minimize changes;

我想我把 changes 作为常量变量使用是错误的,对吧?提前谢谢你。

在 MiniZinc 中(以及一般的约束编程中)您不能将变量递增为 changes=changes+1)。

如果 changes 是仅用于更改总数的变量,您可以使用 sum 代替,例如:

% ...
var 0..n: num_changes;
constraint
   changes = sum([data[i,B] != data[i-1,B] | i in 2..n])
;
% ...

但是,如果您想使用每个 i 的累积更改数,则必须创建一个更改数组来收集每个步骤的值,例如

var[1..n-1] of var 0..n: changes;
% the total number of changes (to minimize)
var 0..n-1: total_changes = changes[n-1]; 
constraint
forall(i in 1..n-1) (
    if data[i,B] != data[i-1,B] then
       changes[i] = changes[i-1]+1
     else
       changes[i] = changes[i-1]    
    endif
)
;