指定决策变量时 MiniZinc 中的错误消息

Error message in MiniZinc when specifying a decision variable

我是运行手册中的first MiniZinc example,为澳大利亚各州和领地涂色。它运行良好,如所写。

% Colouring Australia using nc colours
int: nc = 3;

var 1..nc: wa;   var 1..nc: nt;  var 1..nc: sa;   var 1..nc: q;
var 1..nc: nsw;  var 1..nc: v;   var 1..nc: t;

constraint wa != nt;
constraint wa != sa;
constraint nt != sa;
constraint nt != q;
constraint sa != q;
constraint sa != nsw;
constraint sa != v;
constraint q != nsw;
constraint nsw != v;

solve satisfy;

output ["wa=\(wa)\t nt=\(nt)\t sa=\(sa)\n",
        "q=\(q)\t nsw=\(nsw)\t v=\(v)\n",
         "t=", show(t),  "\n"];

但是当我将nc(颜色数)更改为决策变量(将int: nc = 3;更改为var 1..10: nc;)并将solve satisfy;更改为solve minimize nc; 我收到一条错误消息说

MiniZinc: type error: type-inst must be par set but is `var set of int'

我希望 MiniZinc 能告诉我所需的最少颜色数。

我应该怎么做才能获得最少的颜色数?

更新: 我找到了一种方法来获得我想要的答案。我添加了以下内容。

array[1..7] of var int: ts = [wa, nt, sa, q, nsw, v, t];

var int: min_nc = max(ts);

solve minimize min_nc;

有没有更好的方法?

出现此问题是因为声明了其他变量声明。它们被声明为 var 1..nc: X;。但是,现在 nc 是一个变量,集合 1..nc 也变成了一个变量。

在 MiniZinc 中,不允许使用变量集作为域来声明整型变量。 (也许将来会添加此功能)。我们可以做的是使用尽可能大的域添加所有变量,然后将其限制在允许的值范围内。完整模型如下所示:

% Colouring Australia using nc colours
var 1..10: nc;

var 1..ub(nc): wa;   var 1..ub(nc): nt;  var 1..ub(nc): sa;   var 1..ub(nc): q;
var 1..ub(nc): nsw;  var 1..ub(nc): v;   var 1..ub(nc): t;

constraint wa <= nc; % or "wa in 1..nc"
constraint nt <= nc;
constraint sa <= nc;
constraint q <= nc;
constraint nsw <= nc;
constraint v <= nc;
constraint t <= nc;

constraint wa != nt;
constraint wa != sa;
constraint nt != sa;
constraint nt != q;
constraint sa != q;
constraint sa != nsw;
constraint sa != v;
constraint q != nsw;
constraint nsw != v;

solve minimize nc;

output ["colours=\(nc)\nwa=\(wa)\t nt=\(nt)\t sa=\(sa)\n",
        "q=\(q)\t nsw=\(nsw)\t v=\(v)\n",
         "t=", show(t),  "\n"];

请注意,ub(nc)nc 的上限,最高可能值 nc 将采用,在本例中为 10。