MiniZinc阵列声明

时间:2017-08-13 06:48:09

标签: minizinc

如何在MiniZinc中声明一个数组,类似于下面的Java代码,其中2D数组的第二维尺寸对于所有人都不相同?

int numV=5
int[] numActs=new int[numV];
double[][] min=new double[numV][];

for(int i=0;i<numV;i++){
   for(int j=0;j<numActs[i];j++){
      min[i][j]=<some value>;
    }
}

1 个答案:

答案 0 :(得分:2)

简短回答:MiniZinc不支持“锯齿状”阵列,即长度不等的行(没有长度不等的列)。所有行必须具有相同的长度(与列一样),并且必须以展平时间的长度声明。

您可以做的是定义具有最大行长度*最大列长度的数据矩阵(此处称为“m”),并用一些虚拟值填充较短的行,例如: 0:

示例:长度不等的行:

      [1,2,3,4]
      [5,6],
      [7,8,9],
      [10]
      [11,12,13]

相应的MiniZinc声明将是:

     int: rows = 5;
     int: cols = 4;
     array[1..rows,1..cols] of int: m =
           array2d(1..rows,1..cols,
               [
                    1,2,3,4,
                     5,6,0,0,
                     7,8,9,0,
                    10,0,0,0,
                    11,12,13,0,
               ]);

您必须通过忽略模型中的虚拟值来处理这些虚拟值,或者使用包含每行长度的长度数组,例如

  array[1..rows] of int: lengths = [4,2,3,1,3];