我试图在 Minizinc 中解决这个问题,取自Gardner 的 Puzzle:
十个编号为 0,...,9 的单元格记录一个 10 位数字,这样每个单元格(例如 i)表示数字 i 在此数字中出现的总次数。找到这个号码。答案是 6210001000。
我解决了它,代码在 Gecode 上运行良好:
int: n=9;
set of int: N=0..n;
array[N] of var N: cell;
include "globals.mzn";
constraint global_cardinality(cell, N, cell);
solve satisfy;
output [show(cell), "\n", show(index_set(cell)), " -- ", show(index_set(N))];
Gecode的输出:
[6, 2, 1, 0, 0, 0, 1, 0, 0, 0]
0..9 -- 1..10
----------
==========
但是,G12 求解器抱怨 global_cardinality 中的断言失败:
在调用“断言”断言失败:global_cardinality:覆盖和计数必须具有相同的索引集
没错,正如 Gecode 的输出所示,N 为 1..10,cell 为 0..9。所以我的问题是:
- 为什么 Gecode 有效?不同的实现或我的程序有问题但我很幸运?
- 如何修复程序以与 G12 一起使用或使其健壮/正确?