無限の処理能力が与えられた場合、完全にチェスをプレイするアルゴリズムはありますか?


29

無限の処理能力が与えられた場合、コンピューターが完全にチェスをプレイできるため、決して失われないようなアルゴリズムが存在しますか?

もしそうなら、どこで擬似コードを見つけることができますか?


8
完璧なチェスとはどういう意味ですか?
ハーブウルフ

5
@HerbWolfe彼は、相手が負けることを強制するような動きをすることは決してなく、可能なすべての動きが相手に負けることを強制する場合にのみ辞任することを意味すると思います。
デビッドシュワルツ

5
@DavidSchwartz-「完璧なチェス」はもちろん定義できません。また、「無限の処理能力」もありません。これは「すべての命令シーケンスを0回で実行する」という意味ですか?「使用可能なプロセッサの数に制限はありませんか?」FWIW-「完璧なチェス」の私の定義は「決してゲームに負けない」です。
ボブジャービス-モニカの復活

24
はい、それはブルートフォースと呼ばれます。無限の処理能力を備えているので、アルファベータのプルーニングを行う必要はありませんが、検索ツリーを保持するためにかなり大量のストレージが必要になる場合もあります。
マイケル

4
「アルゴリズム」の概念と無限の処理能力の概念は、実際には混ざり合いません。アルゴリズムおよび計算可能性の理論はすべて、有限数のステップで結果を達成するという仮定に基づいています。無限の数のステップが許可されている場合、計算可能なものとそうでないものとの区別はなくなります。
マイケルケイ

回答:


62

アルゴリズムは存在しますか?はい。Zermeloの定理によれば、チェスなどの有限決定的完全情報2プレーヤーゲームには3つの可能性があります。最初のプレーヤーが勝利戦略を持っているか、2番目のプレーヤーが勝利戦略を持っているか、どちらかのプレーヤーが引き分けを強制できます。私たちは、それがチェス用かどうかは(まだ)知りません。(一方で、チェッカーは解決されています。どちらのプレイヤーもドローを強制できます。)

概念的には、アルゴリズムは非常に単純です。完全なゲームツリーを構築し、リーフノード(ゲーム終了位置)を分析し、最初の勝者の移動、辞任、または引き分けを行います。

問題は詳細にあります:可能な位置は約10 43で、さらに多くの移動があります(ほとんどの位置には複数の方法で到達できます)。このアルゴリズムを利用できるコンピューターは既知の宇宙に収まらないか、宇宙が終了した後しばらくしてから計算を終了しないため、これを利用するには無限に強力なコンピューターが本当に必要です。


13
@Wildcardいいえ、それは何も想定していません。チェスのすべての可能な合法的なゲームが含まれているだけで、手元のプレーヤーが負けないものをすべて選択します。
17

11
@gented、私はアルゴリズムの「辞任」ステップに言及していました。それはまったく必要なステップではありません。
ワイルドカード

38
3反復ルールは検索スペースを制限するため、コンピューターは無限に強力である必要はなく、天文学的に強力である必要があります。
ホアロングタム

9
参考のため、可能なゲーム数の下限(10 ^ 120)を観測可能な宇宙の原子数(10 ^ 80のオーダー)と比較します。最も単純なアルゴリズムでは、これらのゲームをすべて見つけて、データを保存する必要があります。原子ごとに1つのゲームを保存するには、観測可能な宇宙で推定する原子の10 ^ 40倍の時間がかかります。
エンジニアトースト

6
この答えは、「無限に強力なコンピューター」を参照する最後まで素晴らしいです。それあなたが言っていることではなく、そのフレーズは質問にも議論にも属していません。
ドンハッチ

25

https://en.wikipedia.org/wiki/Endgame_tablebaseを参照してください

コンピュータの能力が無限であれば、開始位置用のそのようなテーブルを作成してチェス解くことができます。

実際には、現在のスーパーコンピューターを使用して解決できるのは、最大7人の「男性」(ポーンと駒、キングを数える)のみであるため、チェスの解決にはほど遠い状態です。問題の複雑さは、ピースの数とともに指数関数的に増加します。


9
ちなみに、実際にそのようなテーブルを作成した場合、どのような情報を保存したとしても、観測可能な宇宙の約10 ^ 43倍の重量があります。〜10 ^ 123のチェスの位置があり、観測可能な宇宙には〜10 ^ 80のバリオンしかないことを考慮してください。
シャッフルパンツ

6
バリオンを使って保管していると言った@Shufflepants?
マイケル

3
@Christophそして、情報の保存を想定し、無限の処理能力を備えた検出器とスーパーコンピューターを持っていると想定すると、googolplex年のような過程でゆっくりとテーブルベースをタカのように放射することができます。
シャッフルパンツ

3
@Shufflepants実際の勝利戦略は、フルテーブルベースよりもはるかに少ないスペースで済むことに注意してください。たとえば、Nimには簡単に説明できる勝利戦略があり、すべての可能な状態の巨大なテーブルを作成する必要はありません。
フェデリコポロニ

1
前述のこのソリューションは実行可能ではありません。そのようなテーブルの質量はブラックホールを形成し、そこからデータを抽出することは不可能です。
エモリー

19

もしあなたが本当に無限の処理能力を持っていたら、そのようなアルゴリズムは実際に書くのは簡単でしょう。チェスを持っているとして、有限の可能な状態の数をあなたは完璧なプレーのパスを見つけるまで、あなたは理論的にはちょうどそれらすべてを反復処理できます。それは恐ろしく非効率的ですが、処理能力が無限であれば、それは問題ではありません。


それは真実ではない。彼はあなたには無限の処理能力があると言ったが、無限の空間については何も言わなかった。
ubadub

@ubadub:無限のスペースは必要ありません。ゲームの長さは50ムーブルールにより制限されており、ルールを作成して、ある位置から可能なすべての動きをソートすることができます。ソートできるため、整数として保存できます。これは、ツリー全体を歩くために必要なすべてのメモリです。また、無限の時間がある場合は、好きなだけツリーを歩くことができるため、可能なチェスゲームをすべて保存する必要はありません。
VSZ

ゲームの長さは限られていますが、非常に長いです。他の誰かが指摘したように、そのようなすべてのゲームを保存するテーブルを作成した場合、「情報を保存したものに関係なく、観測可能な宇宙の約10 ^ 43倍の重量があります。チェスの位置と観測可能な宇宙のたった10 ^ 80バリオン
ubadub

2
@ubadub:それは本当ですが、私は「そのようなゲームをすべて保存するテーブル」について話していませんでした。ツリー全体のすべてのノードをメモリに保持する必要のない多くのツリー関連アルゴリズムがあります。
VSZ

@ vszの良い点
ubadub

13

質問に直接対処するには:はい、そのようなアルゴリズムがあります。ミニマックスと呼ばれます。(エンドゲームのテーブルベースはこのアルゴリズムを使用して生成されます(後方!)が、単純で古いシンプルなミニマックスアルゴリズムで十分です)。このアルゴリズムは、任意の2人のプレーヤーのゼロサムゲームを完全にプレイできます。ここで擬似コードを見つけます:

https://en.wikipedia.org/wiki/Minimax

このアルゴリズムのバリアントは、最新のコンピューターチェスプログラムで使用されていることに注意してください。


4

完全なチェスをプレイするアルゴリズムがあるだけでなく、(無限のリソースを与えられた)決定論的な完全な知識の有限期間の2プレイヤーゲームを完全にプレイする短いプログラムを書くことができます。

ゲームエンジンは、プレイしているゲームのルールを知る必要さえありません。必要なのは、「ゲーム状態」の不透明な表現と、(a)任意のゲーム状態が与えられ、正当な次のゲーム状態のリストを提供し、(b)ゲーム状態が与えられ、プレーヤー1の勝利かどうかを決定する機能です、プレーヤー2の勝利、引き分け、または終了状態ではありません。

これらの機能を考えると、単純な再帰アルゴリズムがゲームを「解決」します。

この事実は、チェスプログラマー(minimax)およびAcccumulation(pythonでプログラムのバージョンを提供する)による以前の回答で暗示されています。

私は20年以上前にそのようなプログラムを書きました。私はそれを試しに、無作法(あなたがアメリカ人なら三目並べ)を試してみました。案の定、完璧なゲームをプレイしました。

もちろん、これは深刻なゲームのために想像できるコンピューターですぐに倒れます。再帰的であるため、スタック上にゲームツリー全体を効果的に構築しているため、他の回答で言及されている10 ^ 123のチェスの状態を分析する前に、「スタックオーバーフロー」(非常に意図的)を取得します。しかし、原理的にこの小さなプログラムが仕事をすることを知るのは楽しいです。

私にとって、これはAIについて興味深いことでもあります。ただし、Deep BlueやGo Zero、または実際にChessまたはGoをプレイしている人間が示す「インテリジェンス」の多くは、これらのゲームには些細で正確に計算可能な最適性があるという意味がありますソリューション。課題は、適切な時間内に最適であるが最適なソリューションを取得する方法です。


アルゴリズムは、完全な知識を持つ2人用ゲームでのみ機能します。関数(a)の実装はゲームルールに違反するため、Strategoなどの隠し情報ゲームでは失敗します。また、潜在的に無限の期間のゲームに対しても失敗します。たとえば、チェスから50ムーブルールをドロップし、ボードの周りでお互いを追いかけている2人のキングが勝ち得る状態ではないことはわかりません。わかるのは、それが終了状態ではないということだけです。
マーク

有効なポイント。回答を編集します。
ガレス

3

簡単にするために、ドローや無限の動きの可能性は無視します。アルゴリズムが理解されると、それらのケースに拡張することは特に難しくありません。

まず、いくつかの定義:

  1. その動きをしたプレイヤーがゲームに勝つ動きは勝ちです。

  2. その動きをしたプレイヤーにとってゲームに負ける動きは負け動きです。

  3. 他のプレイヤーに少なくとも1つの勝ち手を残したままにする動きも負けです。(相手がその動きを取り、損失を強制することができるので。)

  4. 他のプレイヤーに負けただけの動きを残す動きも勝ちです。(相手がどんな動きをしても、勝ちます。)

  5. 完璧な戦略とは、勝ち手が残っている場合は常に勝ち、負け手だけが残っている場合は辞任することです。

今、完璧な戦略を書くことは簡単です。可能なすべての移動シーケンスを単純に爆発させ、勝ち/負けの動きを識別します。膠着状態を無視すると、これは最終的にすべての動きを勝ち手または負け手として識別します。

現在、戦略は簡単です。すべての可能な動きを見てください。勝ち手が残っている場合は、勝ち取って勝ちます。負けた手だけが残っている場合は、相手が負けるように強制することができるため、辞任します。

行き詰まりの可能性を含むように戦略を調整することは難しくありません。

更新:すべての動きが勝ちまたは負けの動きとしてどのように識別されるか明確でない場合、念のため:

  1. 勝利につながるすべての動きは勝利の動きです。
  2. 損失につながるすべての動きは、負けの動きです。
  3. 勝者または敗者の動きのみを相手にもたらすすべての動きは、勝者または敗者のいずれかの動きです。
  4. n可能な限り長いチェスゲームでの移動回数を呼び出します。(無制限のシーケンスは現在のところ無視していますが、それらを含めることは難しくありません。)
  5. n私たちが考慮する必要がある前の動きがある動きはありません。
  6. n-1前の手でのすべての手nは、手が最長のゲームを終了するため、勝つ手または負の手のいずれかです。
  7. したがって、深さでのすべての動きは、n-2勝ち手または負け手だけが続き、したがって、それ自体が勝ち手または負け手です。
  8. そして最初の動きに戻ります。

1
あなたの勝ち負けの動きの定義は十分に包括的ではありません。たとえば、最初の動きはゲームに勝つ(#1)ことも、負けた動きだけで対戦相手を残す(#4)こともないので、「勝つ動き」ではありません。また、ゲームに負けず(#2)、勝者の動きを相手に残さない(#3)ため、「負けの動き」ではありません。戦略では、すべての動きを「勝ち手」または「負け手」として定義する必要がありますが、これは定義したとおりではありません。
原子力王

2
@NuclearWangすべての動きを勝ち手または負け手として定義します。3番目の選択肢は何だと思いますか?考えられるすべてのチェスゲームのツリーを視覚化します(今のところ、タイまたは無限シーケンスを除外していることを思い出してください)。すべてのチェーンは、勝ち負けで終わります。これは最終的にツリー全体に浸透し、最終的にすべての動きを勝ち手または負け手として識別します。
デビッドシュワルツ

13
@NuclearWangは、最初の動き 1人のプレーヤーの勝ちの動きであるか、チェスが(三目並べのように)完璧なプレイの描かれたゲームです。誰もこのアルゴリズムを最後まで実行する計算能力を持っていなかったので、誰もこれを知りません。
ホッブズ

8
チェスにはランダム性や隠された情報はなく、「多分」の余地はありません。すべてのポジションが勝ち、負け、または引き分けられます(たとえそれらを特定できなかったとしても)。また、この説明では、簡単にするために「描画」オプションを省略していますが、1)ルールに従って描画された場合は位置が描画され、2)勝ちの動きがないが位置が描画されますが、勝者の動きがない対戦相手を残す少なくとも1つの動き。
ホッブズ

2
@DavidSchwartz:誰かが負けている場合を除き、完璧ではないすべての動きは悪いです。負けたポジションでは、一般的に単一の「完璧な」動きはありません(強制的な動きの場合を除く)。しかし、辞任は、明白な最悪の「移動」と思われます。ゲームがd4でのWhiteの勝利として解決されたと仮定します。あなたはに応えチェスプログラムプレイしたい1. d4との...resigns
supercat

2

:あなたは3つの機能を持っていると仮定しwin_stateget_playernext_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)

0

ルックアップテーブルを使用する

はい。それは簡単です。無限の処理能力さえ必要ありません。必要なのは、可能なボードの位置ごとに、その位置でプレーするのに最適な動きを含むルックアップテーブルです。擬似コードは次のとおりです。

def play-move(my-color, board-position):
    return table-of-best-moves[my-color, board-position]

キャッチ

唯一の問題は、このルックアップテーブルが非常に大きく、おそらく天の川銀河よりも大きくなければならず、構築に時間がかかること、おそらく宇宙の現在の年齢よりも長いことです。チェスのいくつかの未発見の規則性により、現在見られるよりもはるかに簡単になっています。しかし、このルックアップテーブルがあれば、毎回完璧な動きを選択するサブルーチンをわずか1つのCPU命令で実装できます。

また、チェスに関する現在の知識を考えると、完璧なプレーが負けないことを保証する方法はありません。たとえば、完全なプレーが白の勝利を保証する場合、黒が完全にプレーしても黒は負けます。

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