0

検索しましたが、答えが見つかりませんでした。

Java で実装されたシミュレーテッド アニーリング (SA) アルゴリズムを使用して 8 クイーン パズル (具体的には N クイーン パズル) を解こうとしていますが、目的関数に関してはちょっと行き詰まっています。目標 (最適解) に近づいているかどうかはどうすればわかりますか?

試行に「ポイント」を与える方法を 2 つ思いつきました (より多くのポイントが試行をより良いものにします)。

  1. 合法的にボードにいるクイーンの数

  2. 合法的にボード上にあるクイーンの数 + 次のクイーンを合法的に配置するための利用可能なスポットの量

しかし、これらが良いかどうかは判断できません。ヒントやその他の情報を提供していただけますか? :)

4

2 に答える 2

1

ソリューションからの距離は、通常、互いに攻撃しているクイーンの数として定義されます。

シミュレーテッド アニーリングで採用される 1 つのアプローチは、すべてのクイーンをランダムに配置してから、攻撃されているランダムなクイーンを選択し、同じ行のランダムな列に移動することです。

それらを1つずつ配置しようとするのではなく。

これはランダム解と同じではありませんか?

いいえ。

私たちはランダムな動きを選びますが、この動きが実際に起こる確率は、その動きがどれだけ優れているか、解決策にどれだけ近づいているかによって異なります。

良い動きは常に起こりますが、それが悪い動きである場合、その動きが実際に起こる確率は最初は高くなりますが、解決策に近づくにつれてどんどん低くなります。したがって、悪い動きをする可能性はまだあるので、最終的には悪い場所から抜け出しますが、全体としては、主に良い動きをしようとします。

これはシミュレーテッド アニーリングの背後にある基本的な考え方です。「温度」(解までの距離に関連する) の考え方があります。温度が低くなる (解に近づく) と、悪い動きをする確率が減少します。

解決策に近づくにつれて、最善の手を選択しないのはなぜですか?

悪い動きを選択する可能性がまだある限り、これも機能します (ただし、これがまだシミュレートされたアニーリングとして分類されるかどうか、またはこれがパフォーマンスの高いソリューションにつながるかどうかはわかりません-各ステップですべての動きを分析することはかなり高価です)。

場合によっては、2 つのクイーンのみが互いに攻撃しているなどの局所最適から離れる必要があるため、悪い動きの可能性がある必要がありますが、そこからソリューションに直接到達することはできません。最良の動きは、次のステップでの最良の動きになります。

于 2013-10-21T00:13:01.463 に答える
-1

ここで「に近い」がうまく定義されているかどうかはわかりません。連続するクイーンをツリー構造として配置できるすべての場所を考えると、完全に間違ったブランチであるかなり深いブランチを構築できます。これは、「カラスが飛ぶように」実際に非常に近い可能性がある他のアルゴリズム(A*が頭に浮かぶ)で発生する可能性がありますが、解決策からはまだ遠いです。

より技術的には、問題の適切なメトリックが不足していないかどうか疑問に思っています。つまり、リンクで指定された 4 つのプロパティを満たすものであり、「近い」を定義する確実な方法を提供します。

于 2013-10-21T00:35:29.643 に答える