2017-11-10 65 views
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也給出了正確的結果。

這怎麼可能?我該如何使用懶惰的解算器,以便我可以依靠它?或者,它只是我的安裝,搞砸了嗎?

+0

看起來像一個'bug',報告它[這裏](https://github.com/MiniZinc/libminizinc/issues);你有什麼理由不使用「懶惰」以外的其他引擎? –

+0

性能是我的理由,但我想性能來自於這個錯誤......我有一個更復雜的例子,其中只有懶惰的解算器能夠在合理的時間內解決它 - 起初我沒有意識到它是錯誤的解決方案! – JTSkywalker

+0

在這個例子中,'fd'引擎在1秒內找到了'36''個不同的數組排列,而'lazy'引擎發現了'777'個不同的排列。所以,是的,這是由於我沒有意識到的引擎本身的缺陷或其他內在限制。 –

回答

2

G12/lazyFD被稱爲在各個地方被打破。問題在於G12求解器不再被開發,很可能很快就會從分佈中移除。

我會提供Chuffed作爲替代。 Chuffed是用C++編寫的懶惰子句生成的FD求解程序。它應該是正確的,並且會比G12解算器的性能更好(至少在解決方案是正確的時候)。

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