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
)
;
我有一个 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
)
;