MiniZinc 在引入输出语句时找不到解决方案
Posted
技术标签:
【中文标题】MiniZinc 在引入输出语句时找不到解决方案【英文标题】:MiniZinc can not find a solution when output statement introduced 【发布时间】:2017-06-07 06:21:10 【问题描述】:我有一个用 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"
];
这是预期的行为吗,如果是,您能解释一下原因吗?
干杯
【问题讨论】:
根据您提供的信息,我唯一能想到的是fzn-gecode
不会根据输出语句输出变量,而是通过被视为变量的任何内容。根据模型的其余部分,编译器可能已经解决了问题,fzn-gecode
不会输出任何内容。您可以通过使用mzn-gecode -a model.mzn test.mzn
直接运行模型来解决此问题。如果这不起作用,那么我们需要更多信息来帮助您:您正在使用的 MiniZinc/Gecode 版本、模型的其余部分以及您在这两种情况下获得的输出。
【参考方案1】:
发生这种情况是因为输出语句在求解阶段会影响变量顺序。
在您的情况下,您输出“目标”,因此求解器将尝试首先将值分配给“目标”,然后将值分配给 F 矩阵(我假设 F 是您的决策变量?),这种求解顺序可能需要永远。
2 个选项:
尝试先输出矩阵 F,然后输出目标变量output [show(F),show(target)];
solve ::int_search(array1d(F),input_order, indomain, complete) minimize target;
【讨论】:
【参考方案2】:输出[“目标:”++显示(目标)++“\n”];
【讨论】:
以上是关于MiniZinc 在引入输出语句时找不到解决方案的主要内容,如果未能解决你的问题,请参考以下文章
MiniZinc Geocode 未将所有解决方案打印到启用“所有”解决方案的 CSP
如何解决IDEA 中Java项目运行时找不到或无法加载到主类的问题