web-dev-qa-db-ja.com

ゲーム2048の複雑さを解決する方法は?

編集:この質問は ゲーム2048に最適なアルゴリズムは何ですか? の複製ではありません

  • その質問は、「ゲームに勝つための最良の方法は何ですか?」と尋ねます。
  • この質問は、「ゲームの複雑さをどのように解決できるか」という質問です。

それらは完全に異なる質問です。 「勝利」状態に移行するためにどのステップが必要かについては興味がありません。可能なステップの総数を計算できるかどうかを調べることに興味があります。


私はこれを読んでいます 質問 ゲームについて 2048 これは、ゲームをうまくプレイするアルゴリズムを作成するための戦略について説明しています。

受け入れられた回答は次のように述べています。

ゲームは離散状態空間、完全情報、チェスのようなターンベースのゲームです

その複雑さについて考えさせられました。チェスのような決定論的ゲームの場合、(理論的には)勝利状態につながる可能性のあるすべての動きを解決し、逆方向に働き、その結果に向かって進み続ける最良の動きを選択することが可能です。私はこれが多数の可能な動き(宇宙の原子数の範囲内の何か)につながることを知っていますが、2048は多かれ少なかれ複雑ですか?

擬似コード:

for the current arrangement of tiles
    - work out the possible moves
    - work out what the board will look like if the program adds a 2 to the board
    - work out what the board will look like if the program adds a 4 to the board
    - move on to working out the possible moves for the new state

この時点で、私はこれが実行されるのを待っている間ここにいると思っています...

だから私の質問は-このアルゴリズムをどのように書き始めるのか-ゲームの複雑さを計算するのに最適な戦略は何ですか?

2048とチェスの大きな違いは、新しいタイルを追加するときに、プログラムが2から4の間でランダムに選択できることです。これにより、可能な移動が大量に追加されるようです。

最終的には、ゲーム内で可能な順列の数を示す1つの図をプログラムに出力させたいと思います。これは可能ですか?!

9
finoutlook

可能なボード構成がいくつあるかを判断しましょう。

各タイルは空にすることも、2、4、8、...、512、または1024のタイルを含めることもできます。

これは、タイルごとに12の可能性です。タイルは16個あるので、16個になります12 = 248 考えられるボードの状態-そしてこれには、到達できないものがいくつか含まれている可能性があります。

これらすべてをメモリに保存できると仮定すると、次の移動で2048タイルを生成するすべてのボード状態から逆方向に作業し、到達可能なボード状態を相互にリンクするために一定量の作業を行うことができます。これにより、確率が得られます。各州に最適な動き。

すべてのビットをメモリに格納するには、タイルごとに4ビットが必要だとしましょう。つまり、64ビット=ボード​​状態ごとに8バイトです。

248 その場合、理事会の州は8 * 2を必要とします。48 = 2251799813685248バイト= 2048 TB(最高のボードを追跡するための追加のオーバーヘッドは言うまでもありません)これは、巧妙に制限することは可能かもしれませんが、最近のデスクトップコンピューターの容量を少し超えていますたとえば、3 TBハードドライブ、またはおそらくRAM内にさえ収まるものに到達するために、任意の時点で必要なボードの数。


参考までに、 チェスの上限は2です。155 可能な位置


最初から、考えられるすべての動きを実際に計算すると( 幅優先探索 -のように)、膨大な数が得られます。

これは正確な数ではなく、上限の概算です。

いくつかの仮定を立てましょう:(これは常に正しいとは限りませんが、簡単にするために)

  • 常に15個の開いた正方形があります

  • あなたは常に4つの動き(左、右、上、下)を持っています

  • ボード上のすべてのタイルの合計が2048に達すると、単一の2048を取得するために最小の組み合わせ数が必要になります(したがって、2を配置すると合計が2048になる場合、組み合わせは2-> 4-> 8-になります。 > 16-> ...-> 2048、つまり10回の移動)

  • 2は常に配置され、4は配置されません。アルゴリズムはこれを想定しませんが、上限を計算するために、配置します。

  • このプロセス中に重複するボードが生成される可能性があるという事実は考慮されません。

2048に到達するには、2048/2 = 1024タイルを配置する必要があります。

ランダムに配置された2つのタイルから始めて、繰り返し移動すると別のタイルが配置されるため、合計が2048になるまで、約1022回の「ターン」(移動とタイルの配置で構成されるターン)があります。さらに10ターンして、2048タイルを取得します。

各ターンに4回の移動があり、2つのタイルのうちの1つを15の位置(30の可能性)のいずれかに配置できるため、4 * 30 = 120の可能性になります。

これにより、合計で120が得られます。1032 可能な状態。

代わりに、4が常に配置されると仮定すると、120が得られます。519 状態。


exactの数値を計算するには、これらすべての状態を処理する必要がありますが、実際には実行可能ではありません。

7
Dukeling