首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Minizinc程序抱怨global_cardinality中的断言失败

Minizinc程序抱怨global_cardinality中的断言失败
EN

Stack Overflow用户
提问于 2016-02-19 10:59:30
回答 2查看 211关注 0票数 0

我在Minizinc试图解决这个问题,摘自Puzzle taken from Gardner

十个单元格编号为0,...,9铭刻一个10位数字,以便每个单元格,例如i,表示数字i在这个数字中出现的总数。找到这个号码。答案是6210001000。

我解决了它,代码在Gecode中运行得很好:

代码语言:javascript
复制
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的输出:

代码语言:javascript
复制
[6, 2, 1, 0, 0, 0, 1, 0, 0, 0]
0..9 -- 1..10
----------
==========

然而,G12解决者抱怨global_cardinality中的断言失败:

在调用‘断言’断言失败: global_cardinality:盖和计数必须有相同的索引集

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

  • 为什么Gecode在工作?不同的实现或我的程序是错误的,但我是幸运的?
  • 如何修复程序以使用G12或使其健壮/正确?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-19 14:05:15

问题是您在0上启动了数组。虽然这样做在技术上是正确的,但最好以1(MiniZinc中的标准)启动数组。正如您所看到的,仍然有一些求解器不完全支持数组,这些数组不是从1开始的,还有一些与使用数组有关的bug,这些错误不是从0开始的。

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

代码语言:javascript
复制
array[1..10] of var N: cell;

给了我正确的结果。

票数 2
EN

Stack Overflow用户

发布于 2016-02-19 18:09:34

您可以通过添加array1d()来修复这个问题:

代码语言:javascript
复制
 global_cardinality(cell,array1d(0..n,[i | i in N]), cell);

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35503661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档