MiniZinc 阵列声明
MiniZinc Array Declaration
我如何在 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 不支持 "jagged" 数组,即不等长的行(不支持不等长的列)。所有行必须具有相同的长度(与列一样),并且必须用展平时间的长度声明。
你可以做的是用最大行长 * 最大列长定义数据矩阵(这里称为 "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];
我如何在 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 不支持 "jagged" 数组,即不等长的行(不支持不等长的列)。所有行必须具有相同的长度(与列一样),并且必须用展平时间的长度声明。
你可以做的是用最大行长 * 最大列长定义数据矩阵(这里称为 "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];