私は、TicTacToe を解決する小さなプログラムを作成して、簡単なゲームでいくつかの剪定手法の効果を試すことにしました。ミニマックスを使用してそれを解決する完全なゲーム ツリーは、549,946 の可能なゲームしかありません。α-β プルーニングにより、評価に必要な状態の数は 18,297 に減少しました。次に、数値を 2,592 に下げる移調表を適用しました。今、私はその数がどれだけ低くなるかを見たいと思っています。
私が適用したい次の強化は、戦略的削減です。基本的な考え方は、同等の戦略的価値を持つ州を結合することです。たとえば、最初の手で、X が最初にプレイした場合、別のコーナーではなく 1 つのコーナーを選択することについて戦略的に違いはありません (対戦相手が最適にプレイすると仮定)。同じ状況では、ボードの壁の中心についても同じことが言え、中心も重要です。重要な状態のみに減らすことで、最初の移動で評価する状態が 9 つではなく 3 つのみになることになります。この手法は、ゲーム ツリーの最上部付近の状態を削除するため、非常に便利です。このアイデアは、CMU のグループによって作成された GameShrink メソッドから生まれました。一般的な形式を書くことを避けようとしているだけで、TicTacToe にテクニックを適用するために必要なことだけを行っています。
これを達成するために、ハッシュ関数 (転置テーブル用) を変更して、(回転関数と反転関数を使用して) 戦略的に同等の位置をすべて列挙し、各ボードの最低値のみを返すようにしました。残念ながら、私のプログラムは、X が最初に行ったときに、空のボードから 5 つの手で強制的に勝つことができると考えています。長いデバッグセッションの後、プログラムが常に戦略的に重要な最も低い移動の移動を返していることが明らかになりました (私は状態の一部として転置テーブルに最後の移動を保存します)。この機能を追加するためのより良い方法、または既に行ったことを使用して現在の状況に適用できる正しい動きを判断する簡単な方法はありますか?