我有一个特征为{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;
我认为将更改用作常量变量是错误的,对吧?预先谢谢你。
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 ) ;