Проблема состоит в том, чтобы найти расписание, по которому некоторые люди будут играть в гольф (или что-то еще) в группах фиксированного размера. Мы должны гарантировать, что каждый игрок одновременно находится только в одной группе.
Вот мой код:
int: gr; % number of groups
int: sz; % size of groups
int: we; % number of weeks
int: n=gr*sz; % number of players
set of int: G=1..gr; % set of group indices
set of int: P=1..n; % set of players
set of int: W=1..we; % set of weeks
% test instance
gr = 2;
sz = 2;
we = 2;
array[G,W] of var set of P: X;
%X[g,w] is the set of people that form group with index g in week w
% forall group x, |x| = sz
constraint forall (g in G, w in W)
(card (X[g,w]) = sz);
% one person cannot play in two groups simultaneously
constraint forall (g in G, w in W, p in X[g,w], g2 in (g+1..gr))
(not(p in X[g2,w]));
solve satisfy;
Моя проблема теперь в том, что если я использую lazyfd-решатель G12, т.е.
$ minizinc -b lazy this.mzn
я получил
X = array2d(1..2 ,1..2 ,[1..2, 1..2, 1..2, 1..2]);
----------
который, кажется, игнорирует мое второе ограничение. С другой стороны, использование G12 без ленивого варианта, т.е.
$ minizinc this.mzn
дает
X = array2d(1..2 ,1..2 ,[1..2, 1..2, 3..4, 3..4]);
----------
что правильно. G12 MIP и Gecode также дают правильный результат.
Как это возможно? И как я могу использовать ленивый решатель, чтобы на него положиться? Или это просто моя установка как-то испорчена?
bug
, сообщите об этом здесь; по какой причине вы бы не использовали другой движок, кромеlazy
? - person Patrick Trentin   schedule 11.11.2017fd
находит36
различные расположения массивов менее чем за 1 секунду, тогда как механизмlazy
находит777
разные расположения. Итак, да, это связано с ошибкой или некоторыми другими внутренними ограничениями самого движка, о которых я не знаю. - person Patrick Trentin   schedule 11.11.2017lazy
, так как я действительно не понимаю, в чем заключается ошибка. Спасибо! - person JTSkywalker   schedule 11.11.2017