エンジンはどのノードを最初に検索するかをどのように決定しますか?


8

これはEngine PlayのRandomnessに対するフォローアップの質問です。SmallChessの答えは、ある例ではStockfishが20代後に指定された数のノードを検索し、他の20代では異なる数を検索したため、ランダム性があることを示しています。

質問:各ノードが特定の位置にある場合、Stockfishはどのノードを最初に検索するかをどのように決定しますか?たとえば、最初のハーフプライを見てください。白は20の最初の移動が可能なため、20のノードがあります。5つのノードを検索した後、Stockfishに移動を要求します。これは、Stockfishが移動する前に、1。a4、1。a3、1。b4、1。b3、1。c3のみを評価した可能性があることを意味しますか?ただし、このような体系的な検索は、ストックフィッシュが最も一般的な最初の動きを評価していないことを意味します。

ゲームの後半では、ハーフプライあたりのノード数が大幅に増えると思います。これは、ストックフィッシュがハーフプライのすべてのノードの評価を完了していなくても、移動を決定する場合があることを意味します。最も有望なノードが検索されたことをどのようにして知るのでしょうか?



リンクをありがとう、それでも本当にそれを取得しないでください。下のグラフを言います。Aが現在のポジションで、B、C、Eが3つの候補となる手だと思いますか?深さ2のIDDFSがA、B、D、F、C、G、E、Fであり、最善の動きがEである場合、到達する前に検索を終了しなければならない場合、最善の動きを見逃す可能性があります。
アリュール

重複する可能性があることはわかりません。質問は明らかに(?)異なります。
アリュール

申し訳ありませんが、@ user3727079、その反対投票を削除してもらえますか?それが役立つかどうかも教えてください。
QuIcKmAtHs 2017

@XcoderX私はあなたに反対票を投じたので、彼はそれを削除できません
SmallChess

回答:


5

http://rebel13.nl/rebel13/ideas.htmlはこれをよく説明しています。

基本的な考え方は、プログラムが検索せずに最良の動きであると考えるものに基づいて動きを順序付けることです。このスコアは、通常、機動性、ピース平方値、センターコントロール、履歴、攻撃の可能性、キャプチャ、およびプログラマーが重要であると考えるその他の要素に基づいています。人間が直感と履歴に基づいて候補者の動きを決定するように、コンピューターは最初に最高得点の動きを検索します。

コンピューターが5つのノードのみに制限されている場合、はい、コンピューターは最もスコアの高い5つの移動のみを検索します。この時間制限要因により、スコアが低い場合、コンピューターは1人の仲間を逃す可能性があります。これを修正する最初の方法は、フェイルセーフを確立することでした。位置が著しく悪くなったり、著しく良くなったりした場合、これらは検索を短縮します。より良い時間を使用する可能性のあるより多くのバリエーションを検索するために、より多くの時間を与えることを望みました。他の検索アルゴリズムである反復深化は、フェイルセーフを実行するまでの時間が短いため、時間管理を改善しています。


0

この問題は、いくつかのコーディングの問題にかなり似ています。ストックフィッシュはすでに複数の計算済みのムーブセットを持っています。これは、複数のビットボードを使用してチェス盤の状態を表し、カテゴリ(チェック、テンポ、チェックメイト)と統計表現(駒の値)を使用してボードの位置を評価するために使用します。ほとんどすぐに、高度なアルファベータ検索アルゴリズムを使用します。同じ位置を何度も分析しないようにするために、転置テーブルが使用されます。これは基本的に検索機能に適用される暗記であり、グラフ理論プログラミングの多くの問題の基本です。したがって、実際にはかなり単純なアルゴリズムを使用します。これは以前に行われたいくつかの研究です:

ステップ1.ノードを初期化する

ステップ2.中止された検索と即時描画を確認します。ここでノード制限を適用します。(これは、Stockfish 2.3.1以降、1つの検索スレッドでのみ機能します。)

ステップ3.メイト距離の剪定。次の移動でメイトしたとしても、スコアは最高でもmate_in(textssrightarrowtextply + 1textssrightarrowtextply + 1)ですが、ツリーの上方に短いメイトが見つかったためにアルファがすでに大きい場合は、さらに検索する必要はないので、現在のアルファを打ちます。同じロジックですが、符号が逆ですが、メイトを与える代わりにメイトされるという反対の条件にも適用されます。この場合、失敗ハイスコアを返します。

ステップ4.転置テーブルの検索。部分検索のスコアが以前の全検索を上書きすることは望ましくありません。移動が除外された場合は、別のポジションキーを使用します。

ステップ5.位置を静的に評価し、親のゲイン統計を更新する

ステップ6. Razoring(PVノードでは省略されます)

ステップ7.静的ヌル移動プルーニング(PVノードでは省略されます)。ヌルムーブを行うと、対戦相手にスコアがfutility_margin(depth)以上減少するムーブがないことに賭けています。

ステップ8.検証検索を使用したヌル移動検索

ステップ9. ProbCut。キャプチャが非常によく、検索数を減らしてもベータをはるかに超える値が返される場合は、前の動きを(ほぼ)安全に除去できます。

ステップ10.内部反復深化。

ステップ11.動きをループします。動きがなくなるか、ベータカットオフが発生するまで、すべての疑似法的動きをループします。

ステップ12.チェックの延長と危険な動き

ステップ13.無益な剪定。

ステップ14.移動する

ステップ15.縮小深度検索(LMR)。移動が失敗した場合は、徹底的に再検索されます。

ステップ16. LMRがスキップされるか、高失敗した場合の全深度検索。

ステップ17.移動を元に戻す

ステップ18.新しいベストムーブを確認する

ステップ19.分割を確認する

ステップ20.仲間と行き詰まりをチェックする

ステップ21.テーブルを更新します。転置テーブルのエントリ、キラー、履歴を更新する

私は教授の研究が何について話しているかを説明しようと試みます。干し魚は、合法的な動きの検索ツリーを作成します。ここに画像の説明を入力してください 次に、最初に浅い検索フィールドを実行してから、得られたアルファ/ベータカットオフ値をより深い検索の開始値として使用することにより、各移動が良いか悪いか、およびどの程度良いか悪いかを評価し始めます。干し魚はまた、駒を優先します。たとえば、騎士は中心で優先されるため、騎士と司教が中心でフォークされた場合、司教を移動することによる他の大きな利益がない限り、騎士を移動します。これは複雑に見えるかもしれませんが、この実行はほぼlog(可能な移動の数)であるため、かなり高速になります。


@ user3727079これは役に立ちますか?
QuIcKmAtHs 2017

1
いいえ、残念ながら。あなたの答えがわかりません。それは私の質問に答えているようではありません、それはどのノードが最初に検索するかであり、Stockfishがどのように決定を下すかではありません(私はツリーを検索することの意味を理解しています)。
アリュール、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.