0

ガードナーから取得したパズルから取得した、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 で動作するようにプログラムを修正したり、堅牢で正しいものにしたりするにはどうすればよいですか?
4

2 に答える 2

1

これは、array1d() を追加することで修正できます。

 global_cardinality(cell,array1d(0..n,[i | i in N]), cell);

Gecode が機能するが G12/fd が機能しない理由は、Gecode がカーディナリティ チェックを含まない制約の独自の MiniZinc 定義を持っているためです。

于 2016-02-19T18:09:34.560 に答える