我有一个用 minizinc 编写的简单模型,我使用 gecode 首先将其编译为 flat-zinc 来解决它。作为输入,模型采用一些常量、数组和矩阵(二维数组的形式)。模型的输出是另一个必须满足一些约束的二维矩阵。
目标优化是最小化“目标”的值,“目标”是输出矩阵的特定函数,定义如下:
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
我可以看到一系列可能的解决方案,其中列表中的最后一个是最佳解决方案。但是,如果我将输出语句添加到模型中以打印“目标”变量的值 - gecode 会挂起几个小时而根本找不到任何解决方案,并且如果中断则打印 ==UNKNOWN== 。
output [
"target: ", show(target), "\n"
];
这是预期的行为吗?如果是,您能解释一下原因吗?
Cheers
发生这种情况是因为输出语句会影响求解阶段的变量顺序。
在您的情况下,您输出“目标”,因此求解器将尝试首先将值分配给“目标”,然后将值分配给 F 矩阵(我假设 F 是您的决策变量?),并且这种求解顺序可能会永远持续下去。
2个选项:
output [show(F),show(target)];
solve ::int_search(array1d(F),input_order, indomain, complete) minimize target;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)