Minizinc 在求解过程中跟踪数组

标签 minizinc

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

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

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

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

关于Minizinc 在求解过程中跟踪数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64849221/

相关文章:

algorithm - 我什至无法表达这个问题,我需要从一大组数字中选出 3 个非常接近的数字

constraint-programming - 将 bool FlatZinc 转换为 CNF DIMACS

minizinc - 如何为 Minizinc 中的函数创建等效项以简化谓词

MiniZinc:类型错误:找不到具有此签名的函数或谓词: `floor(var int)'

constraint-programming - 在 Minizinc 中增加变量数组元素

linux - 命令行中施加的时间限制似乎不会限制运行时间

minizinc - 指定决策变量时 MiniZinc 中的错误消息

arrays - Minizinc 阵列套装

Minizinc、Gecode,如何通过多解决方案模型跨分布式服务器获得相同的解决方案?

minizinc - 检查 MiniZinc 数组中的项目