指定决策变量时 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。
我是运行手册中的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。