Minizinc在求解过程中跟踪数组



我有一个2d网格,其中某些单元格值会产生不同的分数,我想通过为单元格赋值来最大化分数。是否可以跟踪求解器在求解过程中尝试的每个网格?下面是模型的一个片段,只是为了演示这个想法。

int: i_count;
int: e_count;
set of 1..3: ROW;
set of 1..3: COL;
enum CELL = { U, I, E };
array[ROW,COL] of var CELL: grid;
constraint sum(r in ROW, c in COL)(grid[r, c] = I) <= i_count;
constraint sum(r in ROW, c in COL)(grid[r, c] = E) <= e_count;
var int: assignment_gain = sum(r in ROW, c in COL)(
let {var CELL: cell = grid[r,c]} in (cell = I) * I_SCORE + (cell = E) * E_SCORE
);
solve maximize assignment_gain;
output
["Max assignment_gain: (assignment_gain), with below grid:n"] ++
["(grid[r,c])" ++ if c = n then "n" else "" endif
| r in ROW, c in COL];

我尝试将trace放入assignment_gain语句中,如下所示,但没有成功,输出示例为:

grid[1,1]=X_INTRODUCED_0_, grid[1,2]=X_INTRODUCED_1_, ...
var int: assignment_gain = sum(r in ROW, c in COL)(
let {var CELL: cell = trace("grid[(r),(c)]=(grid[r,c]), ", grid[r,c])} in (cell = I) * I_SCORE + (cell = E) * E_SCORE
);
MiniZinc中包含的trace函数允许您在编译阶段输出表达式。这不允许在求解过程中跟踪表达式。

在求解过程中查看变量值的选项取决于要查看的值。

在MiniZinc中很容易看到中间溶液。因此,解算器找到的解决方案还不是最优的,但确实满足所有约束。要查看这些解决方案,可以在命令行中添加--intermediate-solutions。在MiniZincIDE中,这应该是默认行为,但您可以通过单击";显示配置编辑器";。

另一方面,如果你想在搜索过程中探索变量的值(即解算器为某些变量尝试的值(,那么你必须更深入地挖掘。MiniZinc支持多种解算器,它们使用不同类型的算法来找到解决方案。因此,MiniZinc没有标准的方法在求解器中交互(或显示(搜索。但是,有些解算器确实有一些工具可以让您检查/调试搜索。例如:

  • Chuffed、Gecode和其他一些解算器使用";CPProfiler";,其最近已集成在MiniZincIDE中。您可以通过点击";MiniZinc>配置文件搜索";在工具栏中。该工具可以帮助您可视化搜索树,甚至分析LCG求解器中的不良学习。

  • 标准MiniZinc分布包括";Gecode Gist";,它对Gecode进行了专门的搜索分析。它还将显示搜索树和所做的决策,但有一些更复杂的工具来检查搜索树中的节点。

这些是MiniZinc附带的工具,但对于其他MiniZinc解算器,可能会提供更多工具。

最新更新