Nic*_*laz 2 arrays multidimensional-array minizinc
我想知道是否可以在MiniZinc语言中使用(多维)数组数组.
实际上,我想解决与工人的时间表问题.我的目标是检查他们是否每周至少有1天可用.每个工人都用一个整数索引,我每周都有他们的日程安排.
对我来说,像这样的阵列[[number_of_week, weekday]]可能是一个解决方案.
例如,在第1周的星期一/星期五和第2周的星期二/星期四可用的工人1可以通过以下数组建模:(«1»表示工人可用)
[[| 1,0,0,0,1,
| 0,1,0,1,0 |],
[...], ...]
如果有可能,如何声明这种数组?而且我也对建模这个约束的建议持开放态度.
对不起我不完美的英语,并提前谢谢你,尼古拉斯.
我不确定我完全理解你的问题,但你可以有如下的多维数组:
array[1..3,1..3] of int: a = array2d(1..3,1..3,
[1,0,0,
0,1,0,
1,1,0]);
Run Code Online (Sandbox Code Playgroud)
或使用其他语法:
array[1..3,1..3] of int: a =
[|1,0,0
|0,1,0
|1,1,0|];
Run Code Online (Sandbox Code Playgroud)
但是,你不能在阵列阵列,即这是不合法的:
% This is NOT valid MiniZinc code!
array[1..3,1..3] of int: a =
[[[1,0,0],[1,0,1]],
[[0,1,0],[0,1,1]],
[[1,1,0],[0,0,0]]];
Run Code Online (Sandbox Code Playgroud)
另请注意,不能使用"参差不齐"的数组:每行和每列中的元素数必须相同.
关于您的具体约束,您可以 - 如果我理解您的描述 - 定义这样的3D数组:
int:_num_workers = 2;
int: num_weeks = 3;
int: num_days = 4;
array[1..num_workers,1..num_weeks,1..num_days] of int: a =
array3d(1..num_workers,1..num_weeks,1..num_days,
[
% worker 1
% week1 week2 week3
1,0,0,1, 1,1,0,1, 0,0,1,1,
% worker 2
% week1 week2 week3
1,0,0,0, 0,0,0,1, 1,1,1,0
]);
Run Code Online (Sandbox Code Playgroud)
特别注意array3d创建3D数组的构造.所以,你可以访问一天d一周e的工人w用a[w,e,d].