我有一个用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"
];
这是预期的行为,如果是这样,你能解释一下原因吗?
干杯
答案 0 :(得分:0)
output [“target:”++ show(target)++“\ n”];
答案 1 :(得分:0)
这是因为输出语句在求解阶段对变量顺序有影响。
在你的情况下输出“target”,因此求解器会尝试首先将值赋值给“target”,然后将值赋给F矩阵(我假设F是你的决策变量?),这个求解顺序可能需要永远。
2个选项:
output [show(F),show(target)];
solve ::int_search(array1d(F),input_order, indomain, complete) minimize target;