【问题标题】:MiniZinc Array DeclarationMiniZinc 数组声明
【发布时间】:2017-08-14 13:59:16
【问题描述】:

如何在 MiniZinc 中声明一个数组,类似于下面的 Java 代码,其中二维数组的第二维大小不一样?

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>;
    }
}

【问题讨论】:

    标签: minizinc


    【解决方案1】:

    简短回答: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];
    

    【讨论】:

    • 感谢您的澄清。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    • 2020-10-24
    • 2022-09-24
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多