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

问题描述 投票:2回答:1

我正在运行手册中的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可以告诉我所需的最少颜色数。

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

UPDATE:我找到了一种获取所需答案的方法。我添加了以下内容。

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

var int: min_nc = max(ts);

solve minimize min_nc;

还有更好的方法吗?

minizinc
1个回答
3
投票

发生此问题是由于其他变量声明的声明。它们被声明为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。

© www.soinside.com 2019 - 2024. All rights reserved.