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