ミニマックス法
ミニマックス法は、チェスや将棋などの二人零和有限確定完全情報ゲームで最善手を見つけるためのアルゴリズムです。 「相手は常に最善手を打つ」という仮定のもと、最悪の展開でも最善の結果が得られる手を選びます。
インタラクティブデモ
三目並べを例に、ミニマックス法がどのように動作するか見てみましょう。 盤面を選択して「ミニマックス法を実行」ボタンをクリックすると、探索の様子をステップバイステップで確認できます。
初期盤面を選択
現在の盤面(Xの手番)
ミニマックス法について
ミニマックス法(Minimax Algorithm)は、1928年にジョン・フォン・ノイマンによって提唱されたゲーム理論の基本的なアルゴリズムです。 このアルゴリズムは、対戦型ゲームにおいて「相手が最善を尽くす」という最悪のケースを想定し、その中で自分にとって最も有利な手を選択します。
「ミニマックス」という名前は、自分のターン(MAX層)では評価値を「最大化」し、相手のターン(MIN層)では評価値を「最小化」することに由来しています。 この交互の最大化・最小化により、両者が最善を尽くした場合のゲームの結果を予測できます。
アルゴリズムの流れ
- ゲームツリーの構築: 現在の盤面から可能なすべての手を列挙し、それぞれの手を打った後の盤面を子ノードとして展開します。 これを再帰的に繰り返し、ゲームが終了する(勝敗が決まる or 引き分け)まで続けます。
- 終端ノードの評価: ゲームが終了した盤面(終端ノード)に対して、評価関数で点数をつけます。 例えば、自分の勝ちなら+10、相手の勝ちなら-10、引き分けなら0といった具合です。
- 評価値の伝播: 終端ノードから親ノードへ評価値を伝播させます。 MAX層(自分の手番)では子ノードの中で最大の評価値を選び、MIN層(相手の手番)では最小の評価値を選びます。
- 最善手の選択: ルートノードまで評価値が伝播したら、最も高い評価値を持つ子ノードに対応する手が最善手となります。
特徴と応用
- 完全性: ゲームツリー全体を探索するため、必ず最善手を見つけることができます
- 決定論的: 同じ盤面に対しては常に同じ手を選択します
- 計算量: O(b^d) - 分岐数bの深さdまでの探索。チェスでは計算量が膨大になります
- チェス・将棋AI: Deep BlueやAlphaZeroなどの基礎となっています
- オセロ・囲碁: 評価関数と組み合わせて実用的なAIに使用されています
擬似コード
function minimax(node, depth, isMaximizing):
if depth == 0 or node is terminal:
return evaluate(node)
if isMaximizing:
maxEval = -∞
for each child of node:
eval = minimax(child, depth - 1, false)
maxEval = max(maxEval, eval)
return maxEval
else:
minEval = +∞
for each child of node:
eval = minimax(child, depth - 1, true)
minEval = min(minEval, eval)
return minEvalよくある質問
自分のターンでは評価値を「最大化(Maximize)」し、相手のターンでは評価値を「最小化(Minimize)」することから、 この2つの操作を組み合わせて「Minimax(ミニマックス)」と呼ばれています。 自分は利益を最大に、相手は自分の利益を最小にするよう行動するという、ゲーム理論の基本的な考え方を表しています。
実際のゲームAIでは、いくつかの最適化技術が使われています。 最も有名なのは「αβ枝刈り(Alpha-Beta Pruning)」で、明らかに不利な手の探索を省略することで計算量を大幅に削減できます。 また、「反復深化」「トランスポジションテーブル」「キラー手法」などの技術も組み合わせて使用されます。 チェスのDeep Blueでは、専用ハードウェアを使って1秒間に2億局面を評価していました。
はい、ミニマックス法は「二人零和有限確定完全情報ゲーム」と呼ばれるカテゴリのゲームすべてに適用できます。 これには、チェス、将棋、オセロ、囲碁、コネクトフォー、チェッカーなどが含まれます。 ただし、ゲームの複雑さに応じて、探索の深さを制限したり、評価関数を工夫したりする必要があります。 ポーカーなどの不完全情報ゲームには、そのままでは適用できません。