我有一个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表示数组解析表达式中不允许使用数组。我该怎么办?
感谢您的帮助。
答案 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;