ガードナーから取得したパズルから取得した、Minizincでこの問題を解決しようとしていました:
0、...、9 の番号が付けられた 10 個のセルが 10 桁の数字を表し、各セル (i など) がこの数字の中で数字 i が出現する総数を示します。この番号を見つけます。答えは 6210001000 です。
私はそれを解決し、コードは Gecode で正常に動作しています:
int: n=9;
set of int: N=0..n;
array[N] of var N: cell;
include "globals.mzn";
constraint global_cardinality(cell, N, cell);
solve satisfy;
output [show(cell), "\n", show(index_set(cell)), " -- ", show(index_set(N))];
Gecode からの出力:
[6, 2, 1, 0, 0, 0, 1, 0, 0, 0]
0..9 -- 1..10
----------
==========
ただし、G12 ソルバーは、global_cardinality で失敗したアサーションについて不満を述べています。
in call 'assert' アサーションに失敗しました: global_cardinality: カバーとカウントには同一のインデックス セットが必要です
確かに、Gecode からの出力が示すように、N は 1..10 で、セルは 0..9 です。だから私の質問は:
- Gecode が機能する理由 実装が異なるか、プログラムにバグがありますが、幸運でしたか?
- G12 で動作するようにプログラムを修正したり、堅牢で正しいものにしたりするにはどうすればよいですか?