Сообщение об ошибке в MiniZinc при указании переменной решения - PullRequest
2 голосов
/ 18 октября 2019

Я запускаю первый пример MiniZinc в Руководстве, раскрашивая штаты и территории Австралии. Работает нормально, как написано.

% 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;

Есть ли лучший способ?

1 Ответ

3 голосов
/ 18 октября 2019

Эта проблема возникает из-за объявления других переменных. Они объявлены как 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.

...