問題は、固定サイズのグループでゴルフ(または何でも)をプレイするためのスケジュールを見つけることです。 すべてのプレイヤーは一度に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も正しい結果を返します。
これはどのように可能ですか?そして、私がそれに頼ることができるように、レイジーソルバーをどのように使うことができますか?それとも、どうにかして邪魔されているのは私のインスタレーションですか?
は、「バグ」のように見えますが、こちらに報告してください(https://github.com/MiniZinc/libminizinc/issues)。 'lazy'以外の別のエンジンを使用しない理由は何ですか? –
パフォーマンスは私の理由でしたが、パフォーマンスはバグから来ていると思います...レイジーソルバーだけが合理的な時間内に解決できるもっと複雑な例がありました。間違った解決策! – JTSkywalker
この例では、 'fd'エンジンは1秒未満で' 36 'の配列配列を見つけますが、 'lazy'エンジンは' 777'という異なる配列を見つけます。だから、はい、それは私が気づいていないエンジンそのもののバグや他の本質的な制限に起因しています。 –