Minizinc 在求解过程中跟踪数组

Minizinc trace an array during solve

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

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 没有标准的方式来交互(或显示)求解器中的搜索。但是,某些求解器确实具有允许您 examine/debug 搜索的工具。例如:

  • Chuffed、Gecode 和其他一些求解器使用最近集成到 MiniZincIDE 中的“CPProfiler”。您可以通过单击工具栏中的“MiniZinc > Profile Search”来激活它。此工具可以帮助您可视化搜索树,甚至可以分析 LCG 求解器中的不良学习。

  • 标准 MiniZinc 发行版包括“Gecode Gist”,它具有专门针对 Gecode 的搜索分析。它还将显示搜索树和做出的决定,但有一些更复杂的工具来检查搜索树中的节点。

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