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