Есть два подход делает это, в зависимости от природы матрицы «различий» (которая называется «дифференциалы» ниже, так как «разница» это обращенное слово).
Оба подхода используют одно и то же инициирование и вывод.
int: n = 3;
int: m = 4;
array[1..n,1..n] of int: input1 = array2d(1..n,1..n,[1,1,1, 3,3,3, 5,5,5 ]);
array[1..m,1..n] of int: input2 = array2d(1..4,1..n,[2,6,9, 7,7,7, 9,9,9, 11,11,11 ]);
output [
if k = 1 then "\n" else " " endif ++
show(diffs[i,k])
| i in 1..n, k in 1..m
];
1) В качестве переменных решения. Если «дифференциалы» является матрица переменных решения, то вы можете сделать так:
array[1..n,1..m] of var int: diffs;
constraint
forall(i in 1..n, j in 1..m) (
diffs[i,j] = sum(k in 1..n) (input1[i,k]-input2[j,k])
)
;
2) В качестве постоянной матрицы Если «дифференциалы» матрица просто матрица констант, то вы можете инициализировать его непосредственно:
array[1..n,1..m] of int: diffs = array2d(1..n,1..m, [sum(k in 1..n) (input1[i,k]-input2[j,k]) | i in 1..n, j in 1..m]);
constraint
% ...
;
Я предполагаю, что модель содержит больше ограничений и переменных решения, чем это, поэтому я полагаю, что вы работаете со вторым («постоянный») подход, так как это будет проще для решатели решить.
Очень полезно. Благодаря! – jan06
Отлично. Если вы удовлетворены ответом, отметьте его как «Принято». – hakank