無限の処理能力が与えられた場合、コンピューターが完全にチェスをプレイできるため、決して失われないようなアルゴリズムが存在しますか?
もしそうなら、どこで擬似コードを見つけることができますか?
無限の処理能力が与えられた場合、コンピューターが完全にチェスをプレイできるため、決して失われないようなアルゴリズムが存在しますか?
もしそうなら、どこで擬似コードを見つけることができますか?
回答:
アルゴリズムは存在しますか?はい。Zermeloの定理によれば、チェスなどの有限決定的完全情報2プレーヤーゲームには3つの可能性があります。最初のプレーヤーが勝利戦略を持っているか、2番目のプレーヤーが勝利戦略を持っているか、どちらかのプレーヤーが引き分けを強制できます。私たちは、それがチェス用かどうかは(まだ)知りません。(一方で、チェッカーは解決されています。どちらのプレイヤーもドローを強制できます。)
概念的には、アルゴリズムは非常に単純です。完全なゲームツリーを構築し、リーフノード(ゲーム終了位置)を分析し、最初の勝者の移動、辞任、または引き分けを行います。
問題は詳細にあります:可能な位置は約10 43で、さらに多くの移動があります(ほとんどの位置には複数の方法で到達できます)。このアルゴリズムを利用できるコンピューターは既知の宇宙に収まらないか、宇宙が終了した後しばらくしてから計算を終了しないため、これを利用するには無限に強力なコンピューターが本当に必要です。
https://en.wikipedia.org/wiki/Endgame_tablebaseを参照してください。
コンピュータの能力が無限であれば、開始位置用のそのようなテーブルを作成してチェスを解くことができます。
実際には、現在のスーパーコンピューターを使用して解決できるのは、最大7人の「男性」(ポーンと駒、キングを数える)のみであるため、チェスの解決にはほど遠い状態です。問題の複雑さは、ピースの数とともに指数関数的に増加します。
もしあなたが本当に無限の処理能力を持っていたら、そのようなアルゴリズムは実際に書くのは簡単でしょう。チェスを持っているとして、有限の可能な状態の数をあなたは完璧なプレーのパスを見つけるまで、あなたは理論的にはちょうどそれらすべてを反復処理できます。それは恐ろしく非効率的ですが、処理能力が無限であれば、それは問題ではありません。
質問に直接対処するには:はい、そのようなアルゴリズムがあります。ミニマックスと呼ばれます。(エンドゲームのテーブルベースはこのアルゴリズムを使用して生成されます(後方!)が、単純で古いシンプルなミニマックスアルゴリズムで十分です)。このアルゴリズムは、任意の2人のプレーヤーのゼロサムゲームを完全にプレイできます。ここで擬似コードを見つけます:
https://en.wikipedia.org/wiki/Minimax
このアルゴリズムのバリアントは、最新のコンピューターチェスプログラムで使用されていることに注意してください。
完全なチェスをプレイするアルゴリズムがあるだけでなく、(無限のリソースを与えられた)決定論的な完全な知識の有限期間の2プレイヤーゲームを完全にプレイする短いプログラムを書くことができます。
ゲームエンジンは、プレイしているゲームのルールを知る必要さえありません。必要なのは、「ゲーム状態」の不透明な表現と、(a)任意のゲーム状態が与えられ、正当な次のゲーム状態のリストを提供し、(b)ゲーム状態が与えられ、プレーヤー1の勝利かどうかを決定する機能です、プレーヤー2の勝利、引き分け、または終了状態ではありません。
これらの機能を考えると、単純な再帰アルゴリズムがゲームを「解決」します。
この事実は、チェスプログラマー(minimax)およびAcccumulation(pythonでプログラムのバージョンを提供する)による以前の回答で暗示されています。
私は20年以上前にそのようなプログラムを書きました。私はそれを試しに、無作法(あなたがアメリカ人なら三目並べ)を試してみました。案の定、完璧なゲームをプレイしました。
もちろん、これは深刻なゲームのために想像できるコンピューターですぐに倒れます。再帰的であるため、スタック上にゲームツリー全体を効果的に構築しているため、他の回答で言及されている10 ^ 123のチェスの状態を分析する前に、「スタックオーバーフロー」(非常に意図的)を取得します。しかし、原理的にこの小さなプログラムが仕事をすることを知るのは楽しいです。
私にとって、これはAIについて興味深いことでもあります。ただし、Deep BlueやGo Zero、または実際にChessまたはGoをプレイしている人間が示す「インテリジェンス」の多くは、これらのゲームには些細で正確に計算可能な最適性があるという意味がありますソリューション。課題は、適切な時間内に最適であるが最適なソリューションを取得する方法です。
簡単にするために、ドローや無限の動きの可能性は無視します。アルゴリズムが理解されると、それらのケースに拡張することは特に難しくありません。
まず、いくつかの定義:
その動きをしたプレイヤーがゲームに勝つ動きは勝ちです。
その動きをしたプレイヤーにとってゲームに負ける動きは負け動きです。
他のプレイヤーに少なくとも1つの勝ち手を残したままにする動きも負けです。(相手がその動きを取り、損失を強制することができるので。)
他のプレイヤーに負けただけの動きを残す動きも勝ちです。(相手がどんな動きをしても、勝ちます。)
完璧な戦略とは、勝ち手が残っている場合は常に勝ち、負け手だけが残っている場合は辞任することです。
今、完璧な戦略を書くことは簡単です。可能なすべての移動シーケンスを単純に爆発させ、勝ち/負けの動きを識別します。膠着状態を無視すると、これは最終的にすべての動きを勝ち手または負け手として識別します。
現在、戦略は簡単です。すべての可能な動きを見てください。勝ち手が残っている場合は、勝ち取って勝ちます。負けた手だけが残っている場合は、相手が負けるように強制することができるため、辞任します。
行き詰まりの可能性を含むように戦略を調整することは難しくありません。
更新:すべての動きが勝ちまたは負けの動きとしてどのように識別されるか明確でない場合、念のため:
n
可能な限り長いチェスゲームでの移動回数を呼び出します。(無制限のシーケンスは現在のところ無視していますが、それらを含めることは難しくありません。)n
私たちが考慮する必要がある前の動きがある動きはありません。n-1
前の手でのすべての手n
は、手が最長のゲームを終了するため、勝つ手または負の手のいずれかです。n-2
勝ち手または負け手だけが続き、したがって、それ自体が勝ち手または負け手です。1. d4
との...resigns
?
:あなたは3つの機能を持っていると仮定しwin_state
、get_player
とnext_states
。の入力win_state
はゲーム状態であり、白がチェックメイトの場合は-1、引き分けの場合は0、黒がチェックメイトの場合は1、None
それ以外の場合は出力です。の入力get_player
はゲーム状態であり、出力は黒の順番の場合は-1、白の順番の場合は1です。の入力next_states
は、合法的な動きから生じる可能性のある次のゲームの状態のリストです。次に、ゲームの状態とプレーヤーを指定すると、次の関数は、そのプレーヤーが勝つためにどのゲームの状態に移行するかを通知する必要があります。
def best_state(game_state,player)
def best_result(game_state):
if win_state(game_state):
return(win_state)
else:
player = get_player(game_state)
return max([best_result(move)*player for move in next_states(game_state)])*player
cur_best_move = next_states(games_state)[0]
cur_best_outcome = -1
for state in next_states(game_state):
if best_result(state)*player > cur_best_outcome:
cur_best_outcome = best_result(state)*player
cur_best_move = state
return(best_move)
はい。それは簡単です。無限の処理能力さえ必要ありません。必要なのは、可能なボードの位置ごとに、その位置でプレーするのに最適な動きを含むルックアップテーブルです。擬似コードは次のとおりです。
def play-move(my-color, board-position):
return table-of-best-moves[my-color, board-position]
唯一の問題は、このルックアップテーブルが非常に大きく、おそらく天の川銀河よりも大きくなければならず、構築に時間がかかること、おそらく宇宙の現在の年齢よりも長いことです。チェスのいくつかの未発見の規則性により、現在見られるよりもはるかに簡単になっています。しかし、このルックアップテーブルがあれば、毎回完璧な動きを選択するサブルーチンをわずか1つのCPU命令で実装できます。
また、チェスに関する現在の知識を考えると、完璧なプレーが負けないことを保証する方法はありません。たとえば、完全なプレーが白の勝利を保証する場合、黒が完全にプレーしても黒は負けます。