2017-01-28 7 views
0

У меня есть программа MiniZinc с 3 массивами переменных следующего вида:MiniZinc объединить массивы переменных индекса

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

Как вы думаете, что Minizinc может быть озадачен тем фактом, что ваш vars1 имеет только одно измерение и поэтому полностью определяется один индекс, но vars2 и 3 - 2-мерные массивы, поэтому только один индекс, как представляется, указывает на 1-мерный массив в результате? –

+0

Я пропустил скобки вокруг [vars1 [i]] (отредактирован) в моем примере. Тем не менее, это дает ошибку: «MiniZinc: ошибка типа: выражение понимания массива не может быть массивом». – Bach62

ответ

2

Как вы заметили, вы не можете объединить массивы, подобные этому. Я думаю о двух подходах, хотя первое не совсем то, что вы хотите.

1) использовать array1d(array)

Вы можете придавить матрицы (2d массивы) с "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; 

Вы должны сделать цикл, чтобы вставить все элементы в нужное положение в массиве «все». Однако я оставляю это как упражнение. :-)

Тогда «все» массив может использоваться в маркировке:

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