2017-11-10 4 views
1

問題は、固定サイズのグループでゴルフ(または何でも)をプレイするためのスケジュールを見つけることです。 すべてのプレイヤーは一度に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; 

私の問題は今、すなわち

$ minizinc -b lazy this.mzn 

、私が使用している場合はG12がソルバーlazyfdということです私は無視しているようだ

X = array2d(1..2 ,1..2 ,[1..2, 1..2, 1..2, 1..2]); 
---------- 

を取得します私の2番目の制約。怠惰なオプションなしG12を使用して、一方 は、すなわち

$ minizinc this.mzn 

が正しい

X = array2d(1..2 ,1..2 ,[1..2, 1..2, 3..4, 3..4]); 
---------- 

をもたらします。 G12 MIPとGecodeも正しい結果を返します。

これはどのように可能ですか?そして、私がそれに頼ることができるように、レイジーソルバーをどのように使うことができますか?それとも、どうにかして邪魔されているのは私のインスタレーションですか?

+0

は、「バグ」のように見えますが、こちらに報告してください(https://github.com/MiniZinc/libminizinc/issues)。 'lazy'以外の別のエンジンを使用しない理由は何ですか? –

+0

パフォーマンスは私の理由でしたが、パフォーマンスはバグから来ていると思います...レイジーソルバーだけが合理的な時間内に解決できるもっと複雑な例がありました。間違った解決策! – JTSkywalker

+0

この例では、 'fd'エンジンは1秒未満で' 36 'の配列配列を見つけますが、 'lazy'エンジンは' 777'という異なる配列を見つけます。だから、はい、それは私が気づいていないエンジンそのもののバグや他の本質的な制限に起因しています。 –

答えて

2

G12/lazyFDは、様々な場所で壊れていることが知られています。問題は、G12ソルバーはもはや開発されておらず、間もなく配布物からすぐに削除される可能性が高いということです。

代わりにChuffedを提供します。 Chuffedは、遅延句生成を伴うC++で書かれたFDソルバです。それは正しいはずで、G12ソルバーより優れた性能を発揮します(少なくとも解が正しいときは)。

チャフドなどのMiniZincソルバーは、software page of the MiniZinc websiteにあります。

関連する問題