必要な難易度の数独をオンザフライで生成するための別の回答を追加します。
これは、他のアプローチとは異なり、アルゴリズムが 1 回だけ実行され、目的の難易度に一致する数独構成を返すことを意味します (範囲内の高い確率または確率 = 1 で) 。
数独の難易度を生成 (および評価) するためのさまざまなソリューションは、簡単に評価できる人間ベースのテクニックとアプローチに関係しています。
次に、(数独構成を生成した後)人間のようなソルバーで数独を再解決し、ソルバーが使用するテクニック(ペア、Xウィング、メカジキなど)に応じて、難易度も割り当てられます。
このアプローチの問題
(および私が持っていたユースケースの要件)
与えられた難易度で数独を生成するために、以前の方法では数独を 2 回解く必要があります (1 回は基本アルゴリズムで、もう 1 回は人間のようなソルバーで)。
人間のようなソルバーによって解かれた後にのみ難易度を評価できる多くの数独を (事前に) 生成する必要があります。そのため、オンザフライで目的の数独を一度生成することはできません。
人間のようなソルバーは複雑になる可能性があり、ほとんどの場合 (すべてではないにしても) 9x9 の数独グリッドに密接に結合されています。そのため、他の数独 (4x4、16x16、6x6 など) への簡単な一般化はできません。
人間のようなテクニックの難易度は非常に主観的なものです。たとえば、なぜx-wingは隠しシングルよりも難しいと見なされるのでしょうか? (個人的には、公開されている難解な数独パズルを手動で解いたことがあり、そのようなテクニックを使用したことはありません)
次の利点を持つ別のアプローチが使用されました。
- 任意の数独 (9x9、4x4、6x6、16x16 など) に一般化します。
- 必要な難易度の数独構成は、一度だけオンザフライで生成されます
- 難易度は客観的なものです。
使い方?
まず第一に、パズルが難しければ難しいほど、それを解くのに時間がかかるという単純な事実です。
しかし、解決されるまでの時間は、手がかり (与えられた) の数と空のセルごとに調査される平均的な選択肢の両方と密接に相関しています。
私の以前の回答を拡張すると、任意の数独パズルでは、手がかりの最小数はパズルの客観的な特性であることが言及されました (たとえば、9x9 グリッドの場合、有効な数独を持つための手がかりの最小数は 17 です) 。
そこから始めて、難易度ごとの手がかりの最小数を計算できます (線形相関)。
さらに、数独生成プロセスの各ステップで、空のセルごとの平均選択肢 (調査対象) が所定の範囲内にあることを確認できます (目的の難易度の関数として)。
アルゴリズムがバックトラックを使用するかどうかに応じて (アルゴリズムがバックトラックを使用しない使用例について説明します)、目的の難易度は、確率 = 1 または範囲内の高い確率 (それぞれ) で達成できます。
このアルゴリズムで生成された数独と、以前のアプローチ (人間のようなソルバー) に基づいた難易度評価のテストでは、望ましい難易度と推定された難易度の相関関係に加えて、任意の数独構成に一般化する優れた能力が示されています。
(このオンライン数独ソルバー(およびこれも)を使用して、テスト数独の難易度を相関させました)
このコードはgithub sudoku.js (サンプル デモ アプリケーションと共に) で無料で入手できます。これは同じ作者による JavaScript のプロのクロスワード ビルダーである CrossWord.js の縮小版です。