MiniZinc не может найти решение, когда введен оператор вывода
У меня есть простая модель, написанная на миницинке, и я использую gecode, чтобы решить ее, сначала скомпилировав ее в плоский цинк. В качестве входных данных модель принимает некоторые константы, массивы и матрицы (в виде двумерных массивов). Результатом модели является другая 2d матрица, которая должна удовлетворять некоторым ограничениям.
Целевая оптимизация заключается в том, чтобы минимизировать значение "target", которое является определенной функцией выходной матрицы и определяется следующим образом:
var float: target = sum(i in 1..nodes, j in 1..nodes) (F(i, j) * output_matrix[i, j]);
solve minimize target;
Когда я выполняю эту модель следующим образом:
mzn2fzn model.mzn model.dzn
fzn-gecode -a model.fzn
Я могу видеть поток возможных решений с последним в списке, чтобы быть оптимальным. Однако, если я добавлю в модель оператор вывода для вывода значения переменной "target" - gecode зависает часами, не находя никаких решений вообще, и печатает ==UNKNOWN== в случае прерывания.
output [
"target: ", show(target), "\n"
];
Это ожидаемое поведение, если да, не могли бы вы объяснить, почему?
ура
2 ответа
Это происходит потому, что оператор вывода влияет на порядок переменных на этапе решения.
В вашем случае вы выводите "target", поэтому решатель попытается сначала присвоить значение "target", а затем присвоить значения матрице F (я предполагаю, что F - это ваши переменные решения?), И этот порядок решения может занять вечность.
2 варианта:
- Попробуйте сначала вывести свою матрицу F, затем целевую переменную
output [show(F),show(target)];
- Направляет решатель назначать значения F первым во время решения
solve ::int_search(array1d(F),input_order, indomain, complete) minimize target;