2016-01-29 2 views
0

Как использовать цикл вложенных циклов (например, что делает java ниже) для генерации/заполнения массивов в Minizinc?Minizinc inested for loop

int[][] input1 = {{1,1,1}, {3,3,3}, {5,5,5} }; 
int[][] input2 = {{2,6,9},{7,7,7}, {9,9,9}, {11,11,11} }; 
int[][] diff = new int[input1.length][input2.length]; 
for(int i = 0; i < input1.length; i++){ 
    for(int j = 0; j < input2.length; j++){ 
     for(int k = 0; k < 3; k++){ 
      diff[i][j] += input1[i][k]-input2[j][k]; 
     } 
    } 
} 

ответ

3

Есть два подход делает это, в зависимости от природы матрицы «различий» (которая называется «дифференциалы» ниже, так как «разница» это обращенное слово).

Оба подхода используют одно и то же инициирование и вывод.

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 
    % ... 
; 

Я предполагаю, что модель содержит больше ограничений и переменных решения, чем это, поэтому я полагаю, что вы работаете со вторым («постоянный») подход, так как это будет проще для решатели решить.

+0

Очень полезно. Благодаря! – jan06

+0

Отлично. Если вы удовлетворены ответом, отметьте его как «Принято». – hakank