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。所以我的问题是:
- 为什么 Gecode 可以正常工作?不同的实现或我的程序有问题但我很幸运?
- 如何修复程序以使用 G12 或使其 robust/correct?
问题是您的数组从 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 约束定义,不包括基数检查。
我试图在 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。所以我的问题是:
- 为什么 Gecode 可以正常工作?不同的实现或我的程序有问题但我很幸运?
- 如何修复程序以使用 G12 或使其 robust/correct?
问题是您的数组从 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 约束定义,不包括基数检查。