私はこの問題を自分で考えました。私ができる最善のことは、パズルを実際に解いてゲームツリーを分析することによって、パズルを解くのがどれほど難しいかを判断することです。
最初に:人間のプレイヤーが使用する可能性が低いアルゴリズムではなく、「人間のルール」を使用してソルバーを実装します。(それ自体が興味深い問題です。)人間が使用する難しさに応じて、ソルバーの各論理ルールをスコアリングします。スコアを相互に自由に調整できるように、数百以上の値を使用してください。
パズルを解く。各位置で:
- 現在のゲーム位置で論理的に推定できるすべての新しいセルを列挙します。
- 各控除のスコア(1つのセルを完全に解決する)は、その控除を行うのに十分な最も簡単なルールのスコアです。
- 編集:単一の控除を行うために複数のルールを一緒に適用する必要がある場合、または1つのルールを複数回適用する必要がある場合は、それを単一の「複合」ルールアプリケーションとして追跡します。化合物をスコアリングするには、個々のルールアプリケーションの最小数を使用して、セルにそれぞれのスコアの合計を掛けたものを解決します。(このような控除には、かなり多くの精神的な努力が必要です。)アプリケーションの最小数を計算することは、ルールセットによってはCPUを集中的に使用する努力になる可能性があります。1つ以上のセルを完全に解決するルールアプリケーションは、位置の調査を続行する前にロールバックする必要があります。
- すべての控除の中で最小値よりも高いスコアを持つすべての控除を除外します。(ここでの論理は、プレイヤーは難しいものを認識せず、簡単なものを認識してそれを取得したということです。また、これは決定プロセスから多くの計算を取り除くことを約束します。)
- 現在の位置での最小スコアを「最も簡単な」控除の数で割ったもの(多数存在する場合は、1つを見つけるのが簡単です)は、その位置の難しさです。したがって、ルールAがスコア20の最も簡単に適用できるルールであり、4つのセルに適用できる場合、その位置のスコアは5になります。
- プレイとして「最も簡単な」控除の1つをランダムに選択し、次のゲームポジションに進みます。次の位置のために完全に解決されたセルのみを保持し、他の状態を通過させないことをお勧めします。もちろん、これはCPUの無駄であり、すでに行われた計算を繰り返しますが、目標は人間の遊びをシミュレートすることです。
パズルの全体的な難易度は、ゲームツリーを通るパスの位置のスコアの合計です。
編集:代替ポジションスコア:より難しいルールを使用して控除を完全に除外する代わりに、各ルール(または複合アプリケーション)の全体的な難易度を計算し、最小値を選択します。(ここでの論理は、ルールAのスコアが50、ルールBのスコアが400で、ルールAを1つのセルに適用できるが、ルールBを10に適用できる場合、プレーヤーは簡単な1つのプレイよりも難しい10のプレイの1つを見つけます。ただし、これにはすべての可能性を計算する必要があります。)
編集:Briguy37によって提案された代替案:ポジションスコアにすべての控除を含めます。、、などが個々の控除1 / (1/d1 + 1/d2 + ...)
である場合d1
、各位置をスコアリングします。d2
(これは基本的に、個々の「控除抵抗」などが与えられた位置で「控除を行うことに対する抵抗」d1
をd2
計算します。ただし、これにはすべての可能性を計算する必要があります。)
うまくいけば、このスコアリング戦略は、難易度の主観的な評価が増加するにつれて増加するパズルのメトリックを生成します。そうでない場合は、ルールのスコア(または上記のオプションからのヒューリスティックの選択)を調整することで、目的の相関関係が得られる可能性があります。スコアと主観的な経験の間に一貫した相関関係を達成すると、「簡単」、「難しい」などの数値のしきい値がどうあるべきかを判断できるようになります。そして、あなたは完了です!