问题是找到一些人在固定大小的团体中打高尔夫球(或其他什么)的时间表。 我们必须保证每个玩家一次只能在一个小组中。
这是我的代码:
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;
我现在的问题是,如果我使用G12 lazyfd求解器,即
$ 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也能给出正确的结果。
这怎么可能?我如何使用懒惰的求解器,以便我可以依赖它?或者只是我的装置以某种方式搞砸了?
答案 0 :(得分:2)
我会提供Chuffed作为替代品。 Chuffed是用C ++编写的FD解算器,带有延迟子句生成。它应该是正确的并且比G12求解器表现更好(至少在解决方案正确时)。
可以在software page of the MiniZinc website上找到Chuffed和其他MiniZinc解算器。