19

私はJavascriptで書かれた数独ゲームを楽しみのために作っています。
すべてが正常に機能し、ボードは毎回単一のソリューションで完全に生成されます。

私の唯一の問題は、プロジェクトを一般に公開することを妨げているの
は、ボードの難易度を評価する方法がわからないことです。私はどこを見ても
、フォーラムなどに投稿しました。私は自分でアルゴリズムを書きたくありません。それはこのプロジェクトの
目的ではありません。また、私は数学者ではないので、アルゴリズムは複雑すぎます。

私が近づいたのは、 JSを介してグレーディングを行うこのウェブサイト
だけでしたが、問題は、コードがそのようなお粗末な文書化されていない、非常にアドホックな方法で書かれている
ため、借りることができないことです...

要点を説明します-
数独の格付け/評価のソースコードを提供している場所を教えてもらえますか?

ありがとう

アップデート22.6.11:
これは私の数独ゲーム
です 。基本的な人間の論理解法に依存する独自の評価システムを実装しているので、チェックしてください。

4

6 に答える 6

5

私はこの問題を自分で考えました。私ができる最善のことは、パズルを実際に解いてゲームツリーを分析することによって、パズルを解くのがどれほど難しいかを判断することです。

最初に:人間のプレイヤーが使用する可能性が低いアルゴリズムではなく、「人間のルール」を使用してソルバーを実装します。(それ自体が興味深い問題です。)人間が使用する難しさに応じて、ソルバーの各論理ルールをスコアリングします。スコアを相互に自由に調整できるように、数百以上の値を使用してください。

パズルを解く。各位置で:

  • 現在のゲーム位置で論理的に推定できるすべての新しいセルを列挙します。
  • 各控除のスコア(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(これは基本的に、個々の「控除抵抗」などが与えられた位置で「控除を行うことに対する抵抗」d1d2計算します。ただし、これにはすべての可能性を計算する必要があります。)

うまくいけば、このスコアリング戦略は、難易度の主観的な評価が増加するにつれて増加するパズルのメトリックを生成します。そうでない場合は、ルールのスコア(または上記のオプションからのヒューリスティックの選択)を調整することで、目的の相関関係が得られる可能性があります。スコアと主観的な経験の間に一貫した相関関係を達成すると、「簡単」、「難しい」などの数値のしきい値がどうあるべきかを判断できるようになります。そして、あなたは完了です!

于 2011-05-25T16:54:39.203 に答える
4

ドナルド・クヌースはこの問題を研究し、数独を解くためのDancing Linksアルゴリズムを考案し、それらの難易度を評価しました。

グーグルの周りには、ダンシングリンクエンジンのいくつかの実装があります。

于 2011-05-25T17:03:36.840 に答える
2

おそらく、パズルの一般的な「制約」を評価できますか?新しいパズル(ヒントのみ)には、含めることができない値を削除するだけで決定できる特定の数のセルがある可能性があることを考慮してください。これらのセルは、通常のセルよりも少ない数の可能な値に「制約」されており、存在するより高度に制約されたセルは、推測せずにパズルを進めることができます。(ここでは、「推測」の要件がパズルを難しくしていると考えています。)

ただし、ある時点で、プレーヤーは推測を開始する必要があります。また、特定のセルに対して選択する値が少ないほど、正しい値を見つけやすくなる(そして他のセルの制約が増える)ため、セルの制約が重要になります。 )。

もちろん、私は実際に数独をプレイしていません(ゲームとソルバーを書くのが好きです)ので、これが有効なメトリックであるかどうかはわかりません。ただ大声で考えてください=)

于 2011-05-25T16:39:27.050 に答える
2

行、列、正方形のユニークな可能性だけを探す単純なソルバーがあります。この方法で解けるいくつかのセルを解くと、残りの候補を選び、それを試し、単純なソルバーが解または可能性のないセルにつながるかどうかを確認します。最初のケースではパズルが解かれ、2番目のケースでは、1つの可能性が実行不可能であり、したがって排除されることが示されています。3番目のケースでは、最終的な解決策にも実行不可能性にもつながりませんが、控除に達することはできません。

この手順を繰り返すことの主な結果は、正しいセルエントリを選択することで解決策が得られるまで可能性を排除することです。これまでのところ、この手順は最も難しいパズルでさえも確実に解決しました。それは複数の解決策で難なくパズルを解きます。トライアル候補がランダムに選ばれた場合、それはすべての可能な解決策を生成します。

次に、単純なソルバーが解決策を見つける前に排除しなければならない違法な候補の数に基づいて、パズルの難易度を生成します。

これは推測のようなものですが、単純なロジックで候補を排除できれば、最終的な解決策に近づきます。

マイク

于 2012-11-24T21:46:42.033 に答える
1

私は過去にこれをしました。

重要なのは、人間の論理の観点から、どのルールを使用するかを理解する必要があるということです。提供する例では、右上がりのリストとして、さまざまな人間の論理パターンについて詳しく説明しています。

実際には、コンピューターのルールではなく、これらのルールを使用してパズルを解く必要があります(単純なパターン置換を使用すると、ミリ秒単位で解くことができます)。ボードを変更するたびに、「最も簡単な」パターン(たとえば、セルまたは行の単一の開いたボックス)からやり直して、使用する次の論理的な「ルール」が見つかるまでチェーンを下に移動できます。

数独を採点するとき、各方法論にはいくつかのポイント値が割り当てられます。これは、入力する必要のあるすべてのフィールドに合計されます。「単一の空のセル」は0になる可能性がありますが、「XYチェーン」は100になる可能性があります。必要なすべてのメソッド(および頻度)を表にして、最終的な重み付けを行います。それらの重み付けの期待値をリストする場所はたくさんありますが、それらはすべてかなり経験的なものです。あなたは人間の論理をモデル化しようとしているので、自由に独自の重みを考え出すか、システムを強化してください(実際にXYチェーンのみを使用する場合、パズルはより高度なメカニズムを必要とする場合よりもおそらく簡単です)。

また、ユニークな数独を持っていても、人間の論理では解決できないことに気付くかもしれません。

また、これは、標準のパターン化された方法で解決するよりもはるかにCPUに負荷がかかることにも注意してください。数年前、私がコードを書いたとき、私が作成した生成されたパズルのいくつかを解決するのに数秒(正確には忘れましたが、おそらく最大15秒)かかりました。

于 2011-05-25T16:51:19.187 に答える
0

難易度がユーザーがパズルを解くのにかかる時間に正比例すると仮定すると、これは、時間の経過とともに理想的なアルゴリズムの結果に近づく人工知能ソリューションです。

  1. 固定数の開始パズルレイアウト、たとえば100をランダムに生成します。
  2. 最初に、ユーザーが利用可能なレイアウトからランダムなパズルをプレイできるようにするランダムな難易度のセクションを提供します。
  3. 各ユーザーの平均ランダムソリューション時間を維持します。ランダムなパズルをプレイすることに興味を持たせるために、おそらくこれのためにトップ10/トップXのリーダーボードを作成します。
  4. 各パズルソリューションの平均解決時間乗数を保持します(ユーザーが通常5分でパズルを解決し、20分で解決する場合、パズルの平均解決時間乗数に4を計算する必要があります)
  5. パズルの基本難易度を取得するのに十分な回数、たとえば5回パズルをプレイしたら、そのパズルを評価済みパズルのリストに追加し、ランダムに生成された別のパズルを使用可能なパズルレイアウトに追加します。
    注: ランダムパズルリストの最初のパズルを保持して、より良い統計を取得できるようにする必要があります。
  6. 基本評価のパズルが十分にある場合、たとえば50になったら、ユーザーがアプリケーションの「評価された難易度」の部分にアクセスできるようにします。各パズルの難易度は、そのパズルの平均時間乗数になります。
    注: ユーザーが難易度の高いパズルをプレイすることを選択した場合、加重平均の計算に取り掛かる場合を除いて、これは平均ランダム解答時間または平均解答時間乗数に影響を与えません(そうでない場合、ユーザーがより難しいパズルをたくさんプレイする場合は、平均時間と時間の乗数は歪められます)。

上記の方法を使用すると、ソリューションは0(すでに解決済み/解決する時間がない)から1(ユーザーはおそらく平均時間でこのパズルを解決する)から2(ユーザーはおそらくこのパズルを解決するのに2倍の時間がかかる)まで評価されます。彼らの平均時間)から無限大(ユーザーはこのパズルの解決策を見つけるのに永遠にかかります)。

于 2011-05-25T17:32:37.803 に答える