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;

output [ "target: " ++ show(target) ++ "\n"];

Другие вопросы по тегам