MiniZinc通过索引连接变量数组

时间:2017-01-28 21:52:09

标签: arrays minizinc

我有一个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 个答案:

答案 0 :(得分:2)

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

1)使用array1d(array)

您可以使用“array1d”压缩矩阵(2d数组),如下所示:

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;