MiniZinc - (多维)数组的数组

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 |], [...], ...]

如果有可能,如何声明这种数组?而且我也对建模这个约束的建议持开放态度.

对不起我不完美的英语,并提前谢谢你,尼古拉斯.

hak*_*ank 5

我不确定我完全理解你的问题,但你可以有如下的多维数组:

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的工人wa[w,e,d].