Minizinc lazyfd解决方案忽略约束

时间:2017-11-10 19:43:39

标签: constraint-programming minizinc

问题是找到一些人在固定大小的团体中打高尔夫球(或其他什么)的时间表。 我们必须保证每个玩家一次只能在一个小组中。

这是我的代码:

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也能给出正确的结果。

这怎么可能?我如何使用懒惰的求解器,以便我可以依赖它?或者只是我的装置以某种方式搞砸了?

1 个答案:

答案 0 :(得分:2)

已知G12 / lazyFD在各个地方被打破。问题是G12解算器不再开发,很可能很快就会从发行版中删除。

我会提供Chuffed作为替代品。 Chuffed是用C ++编写的FD解算器,带有延迟子句生成。它应该是正确的并且比G12求解器表现更好(至少在解决方案正确时)。

可以在software page of the MiniZinc website上找到Chuffed和其他MiniZinc解算器。