Min-Maxの概念、ツリーと枝刈り、ヒューリスティックおよびその他の基本についてはすでにご存知だと思います。ここで書いているのは、過小評価されている可能性のある詳細の一部です。
会社の友人と私は時々前に自分のチェスエンジンを書いた。私たちが持っていたいくつかの問題やアイデアを共有し、それらがあなたの役に立つことを願っています。
二人ともJavaプログラマだったので、私たちの言語はJavaに変わり、オブジェクト指向のアプローチから始めました。ピースはオブジェクト、ボードはオブジェクト、ファイルとランク(チェス文学の行と列)はオブジェクトでした。そして、これは間違っていました。オーバーヘッドは非常に大きく、プログラムは検索ツリーで2移動(4プライ)を超えるのに苦労していました。
そのため、いくつかの検索で、素晴らしいアイデアになりました(ただし、私たちのアイデアではありません!)。ピースとボードを長整数(64ビット)として表現します。チェス盤には64個の正方形があるため、これは理にかなっています。残りは少し賢明な操作でした(CPUに非常に近い速度で実行=非常に高速)。たとえば、あなたの作品が攻撃できるボード上の正方形を1が提示しているバイナリ64ビット整数を考えてみましょう。このように2つの数値間で論理「AND」を実行すると、ゼロ以外の結果は、攻撃者との正方形があることを示します。チェス盤と駒を提示するにはいくつかの方法があります。
1- ボードプレゼンテーションについて決定する
次に、データベースを開く必要があります。チェスのオープニングは何らかの形で解決され、オープニングブックを持っていることを強くお勧めします。この場合、電撃戦には余計な時間がかかります。
2-最初の本を見つけます。
私たちはこれらを行いましたが、それでも私たちは良いとはほど遠いものでした:
3-優れたチェスエンジンは、6ムーブ(12プライ)先を見ることができるはずです。
そのため、私たちが行ったのは、デッドタイムを使用することでした(人間とコンピューターのエンジンの場合)。
4-相手がツリーのいくつかのレベルを作成することを考えている時間を使用します。
それでも、私たちは12プライから遠く離れていました。さらに研究することで、いくつかのトリックを発見します!たとえば、ツリーの1つの層をスキップし、次の層から開始することが提案されました(対戦相手がないように)。アイデアは、動きが非常にばかげている場合、なぜ時間を無駄にし、その動きに対する対戦者の反応を確認することです。ただし、1つの優れたエンジンは、ばかげた動きと天才の女王の犠牲を区別できるはずです。
5- この特定の問題(チェス)のプログラミングトリックを学びます。
私と私の友人は、この状態ではまだ悪かったです:/私たちができること-そして部分的にやったこと-は、計算された位置を保存することでした。位置を計算したら、将来のために保存してください!同じことは、検索ツリーのループにも当てはまります。ポイントは、効率的に保存/取得することでした:
6-生成したデータを保存する...効率的に!
そして最後に:
7-最大の最適化を備えたコード。
この問題は、CPU時間とメモリの両方で非常に高価です。コードを非常に効率的に記述することは非常に重要です。35のブランチファクターについて話していることを思い出してください。これは、ヒューリスティックのどこかで3.3792205e+18
役に立たない「if」が、検索ツリーのどこかで役に立たない「if」に変わることを意味します。
チェスプログラミングは非常に興味深い挑戦であり、プログラミングの機能を本格的なテストにかけることができます。他にも提案できる点はいくつかありますが、自分でそれらを発見できると確信しています。私が知らない多くのポイントがありますが、インターネットでそれらを見つけることができます!
頑張って楽しんでね!
ps私はjavascriptをあまりよく知りませんが、問題の難しさに基づいて何かを教えてくれます。おそらく、C ++が提供できるすべてのことを考えると、javascriptをドロップしてC ++で実行する方が良いでしょう。