web-dev-qa-db-ja.com

数独ソルバーバックトラッキングとシミュレーテッドアニーリング

さらに読む前に、数独ゲームとその解決方法を知っていると仮定してください。

だから私はブルートフォースで数独ソルバーを作成しました:アルゴリズムは次のようになります

  1. 空の各セルのすべての可能な値を(単純なルールチェックによって)計算します。
  2. 空のセルを数える
  3. いずれかのセルに1つの可能性しかない場合は、セル値を設定し、すべての可能性を再計算します
  4. 空のセルを再カウントする
  5. 古い空のセル数<新しい空のセル数の場合、繰り返します
  6. そうでなければブルートフォースを適用する

ブルートフォースアルゴリズム
1。 (ネストされた)各セルに最初の可能性を適用します
2。 trueの場合、isSolvedを確認しますか?休憩:それ以外の場合は、2番目の可能性を適用して繰り返します。

上記のB.F.アルゴリズムは、簡単な問題と中程度の問題には機能しますが、各セルに多くの可能性がある難しい問題ですが、ネストされたforループのためにプログラムがクラッシュします

私のバックトラッキングアルゴリズムは、同じ最初のアルゴリズムを使用して検索を絞り込み、次に

  1. 最初の空のセルの最初の可能性を設定します
  2. グリッドが有効かどうかを確認します== true; (解決した場合は中断します)、それ以外の場合は次のセルの最初の可能性を設定し、繰り返します
  3. グリッドがisValid == falseの場合、前のセルに戻り、次の可能性を設定して続行します

6x6グリッドにBackTrackingアルゴリズムを適用しましたが、動作しますが、9x9グリッドにはまだ適用していません。

シミュレーテッドアニーリングアルゴリズム:

  1. 空の各セルの値をランダムに設定する
  2. エラー数を計算する
  3. ランダムな近傍解を生成し、エラーを再カウントします
  4. 新しいエラー数<古いエラー数の場合:新しいグリッドを保持し、そうでない場合は古いグリッドを保持します
  5. グリッドが解決されると壊れます。そうでなければ繰り返す

今私の質問のために:

  1. シミュレーテッドアニーリングアルゴリズムは正しいですか?
  2. 明らかに、BackTrackingはBruteForceよりもはるかに速く問題を解決します。SimulatedAnnealingはどれだけ速く問題を解決しますか?ランダムにシャッフルするため、BackTrackingよりも解決に時間がかかる場合があります。
  3. 手順3でランダムな近傍解を生成する方法
2
j4rey
  1. シミュレーテッドアニーリングアルゴリズムは正しいですか?

これは シミュレーテッドアニーリング ではありません。あなたが説明するものは 確率的山登り法 と呼ばれます。 SAは、古い構成よりも悪い場合(および時間の経過とともにその確率が低くなる場合)、特定の確率で新しい構成も受け入れます。「エラー数」を正確に計算する方法を指定しなかったため、 、すでに述べたように、「隣接する解」を生成する方法。非決定論的アルゴリズムが極小値でスタックする場合(つまり、エラーカウント0の解を生成しない場合)は、それらの詳細によって異なります。正しいSAアルゴリズムを実装した場合でも、グローバル最適が見つかる保証はありません。おそらくここで探しているものです。

  1. 明らかに、BackTrackingはBruteForceよりもはるかに速く問題を解決します。SimulatedAnnealingはどれだけ速く問題を解決しますか?

これは、両方の実際の実装と、各実装にどれだけの最適化作業を投資するかによって異なります。ただし、実際のSAアルゴリズムでは、「初期温度」と「冷却」率を指定する必要があります。これらのパラメーターを誤って指定すると、非常に遅いアルゴリズムになるか、または、解決策がまったく見つからないアルゴリズム。単純な「山登り法」を使用すると、おそらく後者が得られます。

  1. 手順3でランダムな近傍解を生成する方法

さまざまなことを試すことができますが、1つの単純なアプローチは、おそらく1つのセルを変更し、1つの番号を別のセルと交換することです。もう1つの簡単なアプローチは、グリッド全体で1から9までの各桁を正確に9回分散してから、セルの内容をランダムに交換することです。

この古いSO質問 )に関する私の回答も確認してください。

2
Doc Brown