Minizinc 程序在 global_cardinality 中抱怨断言失败

Minizinc program complains of failed assertion in global_cardinality

我试图在 Minizinc 中解决这个问题,摘自 :

Ten cells numbered 0,...,9 inscribe a 10-digit number such that each cell, say i, indicates the total number of occurrences of the digit i in this number. Find this number. The answer is 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 中的断言失败:

in call 'assert' Assertion failed: global_cardinality: cover and counts must have identical index sets

正确,正如 Gecode 的输出所示,N 为 1..10,单元格为 0..9。所以我的问题是:

问题是您的数组从 0 开始。虽然这样做在技术上是正确的,但首选并建议从 1(MiniZinc 中的标准)开始您的数组。如您所见,仍然有一些求解器不完全支持不从 1 开始的数组。还有一些错误与使用不从 0 开始的数组有关。

我在 g12cpx 上遇到了与您相同的错误,但将数组修改为

array[1..10] of var N: cell;

给我正确的结果。

您可以通过添加 array1d():

来解决这个问题
 global_cardinality(cell,array1d(0..n,[i | i in N]), cell);

Gecode 工作但不工作的原因 G12/fd,是因为 Gecode 有自己的 MiniZinc 约束定义,不包括基数检查。