1
問題是要找到一些時間表,讓一些人以固定大小的羣體打高爾夫球(或其他)。 我們必須保證每個玩家一次只能在一個組中。Minizinc lazyfd解決方案忽略約束條件
這裏是我的代碼:
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也給出了正確的結果。
這怎麼可能?我該如何使用懶惰的解算器,以便我可以依靠它?或者,它只是我的安裝,搞砸了嗎?
看起來像一個'bug',報告它[這裏](https://github.com/MiniZinc/libminizinc/issues);你有什麼理由不使用「懶惰」以外的其他引擎? –
性能是我的理由,但我想性能來自於這個錯誤......我有一個更復雜的例子,其中只有懶惰的解算器能夠在合理的時間內解決它 - 起初我沒有意識到它是錯誤的解決方案! – JTSkywalker
在這個例子中,'fd'引擎在1秒內找到了'36''個不同的數組排列,而'lazy'引擎發現了'777'個不同的排列。所以,是的,這是由於我沒有意識到的引擎本身的缺陷或其他內在限制。 –