Условный вывод minizinc

Я возился с minizinc и пытаюсь добиться условного вывода, при котором, если элемент массива имеет значение «истина», программа выводит информацию об индексах массива этих элементов. Вот что у меня есть:

include "globals.mzn";
int: time=5;
int: n=3;
int: l=n*n;
array[1..4,0..time,1..l] of var bool: X;
constraint X[1,5,7]=true;
constraint X[2,5,3]=true;
constraint X[3,5,9]=true;
constraint X[4,5,7]=true;
solve satisfy;

Я попытался решить эту проблему с помощью concat, например:

output ["X_"++concat(["\(r)_\(t)_\(pos)" 
| pos in 1..l, r in 1..4, t in 0..time, where X[r,t,pos]==true])++"\n"];

Однако мне не разрешено: «MiniZinc: ошибка типа: не найдено ни одной функции или предиката с такой сигнатурой:` concat (array [int] of var opt string) »»

Я хочу что-то вроде,

for pos in 1..l, r in 1..4, t in 0..time
 if X[r,t,pos]==true
  output ["X_\(r)_\(pos)_\(t)"]

Как мне этого добиться?


person Sergio    schedule 29.11.2017    source источник


Ответы (1)


Попробуйте использовать fix(...) вокруг переменной решения в предложении where, например

output ["X_"++concat(["\(r)_\(t)_\(pos)" 
| pos in 1..l, r in 1..4, t in 0..time, where fix(X[r,t,pos])==true])++"\n"];

fix (часто) требуется, когда используются фактические значения переменных решения, например для сравнения его значений и т. д.

(В этом контексте сообщение о var opt string, возможно, вводит в заблуждение.)

person hakank    schedule 29.11.2017