【Python 電脳闘技場編 #5】勝敗を数値化しろ!Ultimate Tic-Tac-Toe の「評価関数(ヒューリスティクス)」
第0章:盤面の価値を測る「眼」
「ピッ……ピピピッ……」
Stoneのマトリックス・グラスに、無数の緑色の数字が滝のように流れ落ちていく。
彼が見つめているのは、まだ勝敗のついていない、混沌とした中盤の盤面だ。

美しいコードでMinimaxの骨格を組み上げても、ゲームが終わるまで読み切れないなら意味がない。50msの制限時間が来た瞬間、僕たちは無理やりにでも「今の盤面はどっちが有利か」を結論づけなきゃならないんだ。
盤面の状態をスキャンし、一瞬で「価値」を数値化する。
ハッカーの直感(ヒューリスティクス)を数式に落とし込む作業。
電脳闘技場を生き抜くための「評価関数」の構築が、今始まる。
第1章:評価関数(ヒューリスティクス)とは何か?
完全情報ゲームにおいて、最も確実な評価は「勝ち(+∞)」か「負け(-∞)」か「引き分け(0)」だ。
しかし、O(bd) の絶望的な計算量と50msの制限時間の前では、決着がつく深さまでゲーム木を探索することはできない。
そこで、探索を途中で打ち切った際、その時点での盤面状況から「どれくらい勝ちに近づいているか(有利か)」を概算の点数として算出する関数が必要になる。これが評価関数(Heuristics / ヒューリスティクス)だ。

自分が有利ならプラスの点数(+100など)、敵が有利ならマイナスの点数(-100など)を返すようにする。Minimax関数は、この評価関数が弾き出した点数を信じて、未来の分岐を選択していくんだ。AIの強さは、この評価関数の精度で決まると言っても過言じゃない。
第2章:マスの「重み(価値)」を定義する
Ultimate Tic-Tac-Toe において、盤面の有利・不利はどう決めればいいだろうか?
最もシンプルかつ強力なアプローチは、「マスの位置によって価値(重み)を変える」ことだ。
通常の三目並べを思い出してほしい。一番強い(ビンゴしやすい)マスはどこだろうか?
当然、「中央」だ。縦、横、斜め、計4つのビンゴラインに絡む最強のポジションである。
次点で「角(コーナー)」が強く(3ラインに絡む)、「辺(エッジ)」が最も弱い(2ラインにしか絡まない)。
これを3×3のミクロ盤面に当てはめ、重み付けの配列(Weight Matrix)を定義してみよう。
from typing import List
#ミクロ盤面における各マスの重み(中央が最強、角が次点、辺が最弱)
CELL_WEIGHTS: List[int] = [
3, 2, 3, # 上段: 角(3), 辺(2), 角(3)
2, 4, 2, # 中段: 辺(2), 中央(4), 辺(2)
3, 2, 3 # 下段: 角(3), 辺(2), 角(3)
]
from typing import List
#ミクロ盤面における各マスの重み(中央が最強、角が次点、辺が最弱)
CELL_WEIGHTS: List[int] = [
3, 2, 3, # 上段: 角(3), 辺(2), 角(3)
2, 4, 2, # 中段: 辺(2), 中央(4), 辺(2)
3, 2, 3 # 下段: 角(3), 辺(2), 角(3)
]
第3章:評価関数の実装(スコアの計算)
この CELL_WEIGHTS を使って、盤面全体のスコアを計算する evaluate_board 関数を実装する。
自分の駒(1)があればスコアを加算し、敵の駒(2)があればスコアを減算していくシンプルなロジックだ。
# ※ Stateクラスの定義が別途存在することを前提とする
def evaluate_board(state: 'State’) -> int:
score: int = 0
# 81マスすべてをスキャンする
for i in range(81):
cell_value: int = state.board[i]
# 空マス(0)でなければ評価
if cell_value != 0:
# 1次元インデックス(0~80)から、ミクロ盤面内のインデックス(0~8)を算出
weight_idx: int = i % 9
weight: int = CELL_WEIGHTS[weight_idx]
# 自分の駒(1)ならプラス、敵の駒(2)ならマイナス
if cell_value == 1:
score += weight
elif cell_value == 2:
score -= weight
return score

どうだい? これで、前回のMinimax関数の中で呼び出されていた evaluate_board(state) が、ただの 0 ではなく、「盤面の有利さ」という明確な数値を返せるようになった。
もちろん、これは基礎中の基礎だ。実際の闘技場の上位陣は、ここに「マクロ盤面でのビンゴのリーチ状態」や「次に敵にどこのマクロ盤面を強制指定するか」といった複雑なヒューリスティクスを組み合わせていく。
だが、思考エンジンのベースとしてはこれで十分だ!
次回、第6回:「無駄な未来を切り捨てろ!『Alpha-Beta枝刈り』の魔術」。
今のままではMinimaxはすべての未来をバカ正直に計算してしまう。ハッカーならではのアルゴリズムで、不要な未来を切り落とし、探索スピードを劇的に加速させる技術を伝授するぜ!
🛠️ Stoneの愛用ギア(ハッカーの開発環境)

評価関数や重みの微調整(チューニング)をしていると、広大なコードとターミナルのログを同時に睨みつけることになる。そんな時、視界を物理的に拡張してくれるウルトラワイドモニターは最高のアドバンテージだ。(スポンサーリンク)
34インチウルトラワイド曲面ゲーミングモニター。未来の分岐(ゲーム木)がどれほど広がろうとも、この曲面ディスプレイならすべてを一目で把握できる。視野の広さは、思考の深さに直結するんだ。








ディスカッション
コメント一覧
まだ、コメントがありません