我想知道MiniZinc语言是否可以使用(多维)数组。
确实,我想解决与工人的时间表问题。我的目标是检查他们是否每周至少有1天可用。每个工人都用一个整数索引,我每周都有他们的日程安排。
对我来说,像[[number_of_week, weekday]]
这样的数组可能是一个解决方案。
例如,第1周和星期二/星期四在第2周可用的工人1可以通过以下数组建模:(«1»表示工人可用)
[[| 1,0,0,0,1,
| 0,1,0,1,0 |],
[...], ...]
如果有可能,如何声明这种数组?而且我也对建模这种约束的建议持开放态度。
对不起我不完美的英语,并提前谢谢你, 尼古拉斯。
答案 0 :(得分:5)
我不确定我完全理解你的问题,但你可以拥有如下的多维数组:
array[1..3,1..3] of int: a = array2d(1..3,1..3,
[1,0,0,
0,1,0,
1,1,0]);
或使用其他语法:
array[1..3,1..3] of int: a =
[|1,0,0
|0,1,0
|1,1,0|];
但是,不能在数组中包含数组,即不允许:
% 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]]];
另请注意,不能使用“参差不齐”的数组:每行和每列中的元素数必须相同。
关于您的具体约束,您可以 - 如果我理解您的描述 - 定义这样的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
]);
特别注意创建3D数组的array3d
构造。因此,您可以使用d
访问工作人员e
的{{1}}周w
。