チェスエンジンはどのように「考える」のですか?


28

私が知りたいのは、動きを見つけるためのエンジンのプログラム方法です。彼らはまず、キャプチャやチェックなどの最も強制的な行を計算すると確信しています。しかし、微妙で深い位置の動きはどうでしょうか?彼らは同様に非常に迅速にそれらを見つけるようです(一般的に言えば、もちろん彼らは時々そのような動きを逃します)。同様に、彼らは静かな動き/位置的なアイデアを探すためにどのようにプログラムされていますか?彼らはすべての動きを単にブルートフォースすることはできません。時間がかかりすぎるので、最高の動きにすばやく到達するための賢い方法があるはずです。私はこれを知ることに興味があります。なぜなら、現実の世界でもプレイヤーがボードを熟考するのに役立つと思うからです。


チェスエンジンは1秒あたり数百万の位置を見るため、実際には、いくつかの動きが深くなるまで、それらすべてを見ることができます。
-RemcoGerlich

2
これは素晴らしい質問です。私は本当に答えを楽しみました。
トラビスJ

基本的に、彼らは検索アルゴリズム(例、ミニマックス)で先に検索し、事前にプログラムされたヒューリスティックを使用して位置を評価します。いくつかの最近のエンジン(AlphaZeroなど)は、自分でプレイすることで独自の評価方法を開発しています。
慣性無知

回答:


22

一般的な方法では、チェスエンジンはデシジョンツリーを使用します。ツリーのルートは現在の位置であり、合法的な移動を行うことによって作成できる各位置の子ノードがあります。これらの各ノードには、順番に合法的な移動を行うことで到達できる位置の子ノードがあります。エンジンは、その機能と「考える」時間で定義された深さまでツリーを押し出します。複数の方法で到達できる位置は単純に相互参照されるため、複数回考慮する必要はありません。ツリーが作成されると、コンピューターは一連の重み付きルールを使用してツリーの最終位置を分析し、望ましくない位置または対戦相手が到達できないようにする位置を削除し始めます。この方法でツリーが切り取られ、1つの動きだけが残り、コンピューターがその動きを行います。

http://www.chess.com/blog/zaifrunには、チェスエンジンの作成方法に関するシリーズまたは記事があります。チェスエンジンの仕組みについて詳しく知りたい場合は、こちらをご覧ください。


いい答えです。深さ30を見ると、エンジンが30のノードを検索したということですか?また、Plyとはどういう意味ですか?
xaisoft

私は、Plyが何の研究をせずに何を意味するのか確信が持てません。頭字語が得意ではありません。むしろ深さとは、ノードがいくつあるか、各ノードが半分移動すること、または深さの移動がプログラマーに依存することを指します。しかし、私はその慣習はそれが深い動きの数であると思います。
エドワードグッドソン

5
プライは動きの半分です。チェスでの移動は、白+黒で行う場合の1つの完全な「セット」です。プライはその半分なので、1色だけです。
ErebusBat

21

かなり複雑な質問をしているが、基本に戻ってみるといい。考慮すべき概念がいくつかあります。

評価

(本物の)プレーヤーにポジションが表示され、「このゲームに勝っているのは誰ですか?」と尋ねられた場合、彼らはどのように決定するのですか?おそらく、彼らはいくつかの基本的なことをチェックします:素材の違い、ピースが開発された、または「うまく」配置されている度合い、ポーンを2倍/分離/接続/渡した、(制御された)ファイルを開く、どこまでポーンのボード。

必要に応じて、上記に基づいて位置スコアを計算する体系的な方法を考え出すことができます。たとえば、ポーンは1ポイントの価値があり、合格したポーンは0.3ポイントの価値があると判断できます。孤立したポーンまたは2倍のポーンは、少なめの価値があります。すべてを足すと、手元の位置の推定値が得られます。

これは評価と呼ばれ、基本的にすべてのチェスプログラムには位置を評価する方法があります(通常非常に弱い新奇なAIチェスエンジンは無視します)。

しかし、微妙で深い位置の動きはどうでしょうか?

さて、私たちは位置評価の表面をかろうじて傷つけただけです。評価関数の実際の実装は、1秒あたりより多くのポジションを評価できるように(大まかな方法​​ではありますが)単純化したり、より複雑になり、評価されるポジションを減らしますが、より高い信頼性が得られます。評価関数が数百または数千もの個別の情報を考慮することは珍しいことではありません。

サーチ

私は上記の内容を特に省略しました。ほとんどの実際のプレイヤーはすぐに考えます-どちらの側でもすぐにゲームに勝つ方法はありますか?合致または「ぶら下がっている」ピースが見えるか?これを簡単にすることは簡単ですが、些細なことではありません。

プレーヤーが組み合わせに完全な自信を持っているとはどういう意味ですか?結局、すべてのオプションを計算したことになります。通常、実際のプレイヤーはこれを行いません(些細な、または非常に強制的な仲間を除く)。ほとんどの場合、少数のオプションのみを考慮し、「非建設的」または明らかに損失につながると思われる他のオプションを除外します。この計算中にミスをすることがよくあります。たとえば、移動順序の変更により脅威が蒸発するなどのことに気付く場合があります。ポイントは、組み合わせを完全に確認するために、プレーヤーは可能な限り最高の動きを可能にします(これは「最小/最大」と呼ばれます)。

さて、チェスはコンピューターが計算できる範囲よりもはるかに大きな検索スペース(これが「将来のすべての可能な動き」と呼ばれるもの)を持っていることを考えると、妥協する必要があります。人間と同じように、コンピューターは特定の基準に基づいて思考の全行を無視することを決定できます。これは、ヒューリスティックとして知られています。強引に組み合わせた場合にのみ確実に組み合わせを確認することができますが、複雑な評価関数はしばしば脅威の存在を検出できることに注意してください(たとえば、その方向に検索を誘導するために分岐、串刺しなどをカウントできます) )。

最後に、コンピューターは非常に高速ですが、ヒューリスティックによって計算を深くすることができます。とはいえ、最新のエンジンが完全に計算していることに驚かれるかもしれません。通常は、速いゲームでも3移動以上です。

結論/すべてを組み合わせる

要約すると、評価関数には多くのインテリジェンスが組み込まれています(つまり、平均的な人間のプレーヤーよりも多くのことを考慮します)。ヒューリスティックにより、コンピューターはおそらくうまくいきそうにないと判断した線を引くことができます。コンピューターは非常に高速です。それらを合計すると、それらを倒すのはかなり困難です。


6

私は答えに同意します。

GMのRoman Dzindzichashviliがそれについて話していたことを覚えています。Roman のラボビデオ 1つで、どんなビデオだったかは覚えていません(詳細がわかれば、答えを編集してください)。

ローマンは、フリッツエンジンの開発者は彼の友人だと言いました。そこでローマンはフリッツをテストして、その良さを確認し、開発者はローマンに、フリッツが複雑な決定を下すには(例えば、位置的優位性と引き換えに素材を犠牲にする)、プログラムに伝えるようにピースの価値を変えなければならないと語った悪い司教は1ポイントの価値があり、開いた対角線上の司教は7ポイントの価値があり、騎士は近い位置で5ポイントの価値があるということです...

私は各ピースの正確な数を知りませんが、それがどのように機能するのか、そしてあなたのエンジンは悪い司教または各ポジションの各ピースの価値を彼に伝えることができれば何でも犠牲にしません。

編集

The Chess Programming Wikiも参照してください。


4

コンピューターが十分に深く(25層以上)見えるようにし、可能な動きをすべてチェックすることは不可能です。

可能になるのは、アルファベータプルーニングと呼ばれる手法です。これは、人間に似た(しかしより優れた)コンピューターが有望な継続のみに従うことを意味します。

彼らは常にポジションを評価し(事前にコード化されたルール、評価材料、キングの安全性、アクティビティ、ポーン構造などに基づいて)、最高のポジションに向かっていると思われるバリエーションを調べます。

数百万のこれらのポジションを1秒で評価するのに十分に効率的にそれを行う方法は、依然として魔法に近い。

要約すると、あなたは正しいです。彼らは戦略的なチェスをする場合、すべての動きを見ることができませんが、まともな動きを非常に素早く見ることができます。問題はまだ彼らが見ることができる非常に長期的な計画と地平線にありますが、これは取り組んでいます(Rybkaははるかに遅く分析しますが、より多くの位置チェスを果たしますが、Houdiniはより多くの動きを計算する「機械的な心」でロマンチックですより積極的にプレイします)。コンピューターにも独自のスタイルがあります!


3

アルファベータプルーニングとは、自分にとって悪い結果になった行を見つけた場合、その候補の動きを見ることをやめて、代わりに他の人を試すことを意味します。これは後方プルーニングの一種であり、結果として良い動きを見逃すことはありません。対照的に、前方プルーニングは推測に基づいています。無益なプルーニング、遅い移動の削減、および剃刀は、前方プルーニングの一種であり、すべての種類の動きを考慮すべきであるというプログラマーの感覚に依存しています。多くの前方剪定を行うプログラムは、交尾につながる驚くべき犠牲を逃す可能性がありますが、一方で、それは多くの本当に悪い動きを排除し、そのため、それが好む動きをより深く見ることができます。

ほとんどのエンジンは、すべての可能性を調べるために、最初のいくつかの動きを徹底的に検索します。高く失敗する動きがない場合(つまり、すでに検討した動きより明らかに悪いように見える場合)、検索をさらに拡張します。一般に、静止位置(チェック、キャプチャ、メイト脅威などなし)に達するまで各行の探索を続け、評価を行います。静かな動きは検索ツリーの奥にあるときには考慮されないかもしれませんが、ゲームの実際の位置に到達すると、エンジンは静かで鋭い動きをすべて見ます。実際にエンジン出力でこれを確認できる場合があります。エンジンが突然数回前の動きを考慮していなかった動きを好む場合です。

エンジンは非常に迅速に計算するため、どの動きを最初に見るかを考慮することはそれほど重要ではありませんが、人間にとってこれは重要な質問です。ジョナサン・ティスダルは、彼の著書「Improve Your Chess Now」でこれに答えることに突き刺します。あなたが攻撃を受けているとき、彼はあなたが最も暴力的な動きを最初に見ることを提案します。防御するときは、最も難しいラインを最初に見てください。彼はまた、どの動きを最初に見るかを決定するときに、位置の経験則(例、集中化、調整)を引用します。

関連するかもしれない他の本は、エマニュエル・ネイマンの目に見えないチェスの動きとチャールズ・ハータンの強制チェスの動きです。Hertanは、そのような戦術のための「コンピューターの目」の開発についても語っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.