シンプルなチェスAIを構築するためのステップバイステップガイド

シンプルなチェスAIの作成に役立つ基本的な概念をいくつか見てみましょう。

  • 移動世代
  • ボード評価
  • ミニマックス
  • およびアルファベータプルーニング。

各ステップで、これらの実績のあるチェスプログラミング手法の1つを使用してアルゴリズムを改善します。それぞれがアルゴリズムのプレイスタイルにどのように影響するかを示します。

最終的なAIアルゴリズムは、GitHubでご覧いただけます。

ステップ1:生成とボードの視覚化を移動する

移動の生成にはchess.jsライブラリを使用し、ボードの視覚化にはchessboard.jsを使用します。移動生成ライブラリは基本的にチェスのすべてのルールを実装しています。これに基づいて、特定の取締役会の状態に対するすべての法的動きを計算できます。

移動生成機能の視覚化。開始位置は入力として使用され、出力はその位置から可能なすべての動きです。

これらのライブラリを使用すると、最も興味深いタスク、つまり最適な動きを見つけるアルゴリズムを作成することにのみ集中できます。

まず、考えられるすべての動きからランダムな動きを返す関数を作成します。

このアルゴリズムは非常に堅実なチェスプレーヤーではありませんが、実際に対戦できるので、良い出発点です。

黒はランダムな動きをします。 https://jsfiddle.net/lhartikk/m14epfwb/4で再生可能

ステップ2:ポジション評価

次に、特定の位置でどちらの側が強いかを理解してみましょう。これを実現する最も簡単な方法は、次の表を使用してボード上の部品の相対的な強度をカウントすることです。

評価機能を使用すると、最高の評価が得られる動きを選択するアルゴリズムを作成できます。

目に見える改善点は、アルゴリズムがピースをキャプチャできるようになったことです。

黒は、単純な評価関数を使用して再生されます。 https://jsfiddle.net/lhartikk/m5q6fgtb/1/で再生可能

ステップ3:Minimaxを使用してツリーを検索する

次に、アルゴリズムが最適な動きを選択できる検索ツリーを作成します。これは、Minimaxアルゴリズムを使用して行われます。

このアルゴリズムでは、考えられるすべての動きの再帰的ツリーが特定の深さまで探索され、位置はツリーの終了「葉」で評価されます。

その後、移動する白か黒かに応じて、子の最小値または最大値を親ノードに返します。 (つまり、各レベルで結果を最小化または最大化しようとします。)

人工位置でのミニマックスアルゴリズムの視覚化。白の最良の動きはb2-c3です。これは、評価が-50になる位置に到達できることを保証できるためです。

ミニマックスが配置されると、私たちのアルゴリズムはチェスのいくつかの基本的な戦術を理解し始めています。

深さレベル2のミニマックス。再生可能なもの:https://jsfiddle.net/k96eoq0q/1/

ミニマックスアルゴリズムの有効性は、達成できる検索の深さに大きく依存しています。これは、次のステップで改善するものです。

ステップ4:アルファベータ枝刈り

アルファベータプルーニングは、ミニマックスアルゴリズムの最適化手法であり、検索ツリーの一部のブランチを無視できます。これにより、同じリソースを使用しながら、ミニマックス検索ツリーをより深く評価できます。

アルファベータプルーニングは、以前に発見された動きよりも悪い状況につながる動きを見つけた場合に、検索ツリーの一部の評価を停止できる状況に基づいています。

アルファ-ベータ枝刈りは、ミニマックスアルゴリズムの結果に影響を与えません。それは、それをより速くします。

アルファベータアルゴリズムは、良い動きにつながるこれらのパスを最初に訪れる場合にも効率的です。

アルファ-ベータ枝刈りが使用され、ツリーが記述された順序で訪問される場合、探索する必要のない位置。

アルファベータでは、次の例に示すように、ミニマックスアルゴリズムが大幅に強化されます。

深さ4で検索を実行する場合に評価するために必要な位置の数で、「ルート」位置が表示されます。

このリンクをたどって、チェスAIの改善されたアルファベータ版を試してください。

ステップ5:評価機能の改善

ボード上で見つかった材料のみを数えるため、最初の評価関数は非常に単純です。これを改善するために、ピースの位置を考慮に入れる要因を評価に追加します。たとえば、ボードの中央の騎士は、ボードの端の騎士よりも優れています(より多くのオプションがあり、したがってよりアクティブであるため)。

チェスプログラミングwikiで元々説明されていた、部分的に調整されたテーブルの少し調整されたバージョンを使用します。

視覚化された正方形のテーブルが視覚化されました。作品の場所に応じて、評価を増減できます。

次の改善により、少なくともカジュアルなプレイヤーの観点から、「まともな」チェスをプレイするアルゴリズムの取得を開始します。

検索の深さ3での評価とアルファベータプルーニングの改善。https://jsfiddle.net/q76uzxwe/1/で再生可能

結論

単純なチェスプレイアルゴリズムでさえ、愚かな間違いをしないという強みがあります。これは、戦略的な理解がまだ欠けていると言いました。

ここで紹介した方法で、基本的なチェスをプレイできるチェスプレイアルゴリズムをプログラムできました。最終的なアルゴリズムの「AIパート」(移動世代を除く)はわずか200行のコードです。つまり、基本的な概念は非常に簡単に実装できます。最終バージョンはGitHubで確認できます。

たとえば、アルゴリズムにさらに改善を加えることができます。

  • 移動順序
  • より速い動きの生成
  • そして、ゲーム固有の評価。

詳細については、チェスプログラミングwikiをご覧ください。ここで紹介したこれらの基本的な概念を超えて探索するのに役立つリソースです。

読んでくれてありがとう!