MiniZinc 按索引连接变量数组

MiniZinc join arrays of variables by index

我有一个 MiniZinc 程序,其中包含以下形式的 3 个变量数组:

array[NbLines] of var Domain: vars1;
array[NbLines, NbRows] of var Domain: vars2;
array[NbLines, NbRows] of var Domain: vars3;

我需要按以下方式指定我的搜索变量顺序,但我没有成功地正确构造我的数组。有类似代码的 MiniZinc:

varsOrder = [[vars1[i]] ++ row(vars2, i) ++ row(vars3, i) | i in NbLines]

MiniZinc 表示数组理解表达式中不允许使用数组。我该怎么办?

感谢您的帮助。

如您所见,您不能像这样连接数组。我能想到的是两种方法,尽管第一种方法不是您想要的。

1) 使用array1d(array)

您可以像这样使用 "array1d" 展平矩阵(二维数组):

solve :: int_search(vars1 ++ array1d(vars2) ++ array1d(vars3), first_fail, indomain_min, complete) satisfy;

然而,这与您上面写的并不完全相同,但它比下一种方法更容易:

2) 制作一个主数组并将所有元素插入适当的位置。

 int: totLen = ...; % the total length of all the arrays
 array[1..totLen] of var Domain: all;

你必须做一个循环来将所有元素插入到 "all" 数组中你想要的确切位置。但是,我将其留作练习。 :-)

那么"all"数组就可以在标注中使用了:

solve :: int_search(all, first_fail, indomain_min, complete) satisfy;