Minizinc:表格功能的最佳排序

问题描述 投票:0回答:1

我有一个特征为{A,B}的表。 B是一列整数。扫描表,当我在B列中有值更改时,我将变量“ changes”增加为1:

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

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

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;

我认为将更改用作常量变量是错误的,对吧?预先谢谢你。

minizinc
1个回答
0
投票
在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的累积更改数,则必须创建一个changes数组来收集每个步骤的值,例如

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 ) ;

© www.soinside.com 2019 - 2024. All rights reserved.