1

我有一个 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 表示数组理解表达式中不允许使用数组。我应该怎么做?

感谢您的帮助。

4

1 回答 1

2

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

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;
于 2017-02-01T18:12:42.153 回答