当输出语句引入时,MiniZinc无法找到解决方案

时间:2017-06-07 06:21:11

标签: minizinc gecode

我有一个用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 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

这是因为输出语句在求解阶段对变量顺序有影响。

在你的情况下输出“target”,因此求解器会尝试首先将值赋值给“target”,然后将值赋给F矩阵(我假设F是你的决策变量?),这个求解顺序可能需要永远。

2个选项:

  • 首先尝试输出矩阵F,然后输出目标变量

output [show(F),show(target)];

  • 指示解算器在求解期间首先为F赋值。

solve ::int_search(array1d(F),input_order, indomain, complete) minimize target;