ゲームプログラミングの基礎
「ゲーム」という範疇でくくられるものは,ボードゲーム,カードゲーム,
コンピュータゲーム,言葉遊び等いろいろあるが,ここでは囲碁,将棋,オセ
ロなどの二人零和完全情報ゲームを対象にした基礎的なプログラミングについて扱
う.
「二人零和完全情報ゲーム」というのは,ゲーム全体の中で以下のような制約
が加えられたものである.
- 二人
- ゲームにはトランプの1人遊び(ソリテア)のようなものから,マージャ
ンのような4名(あるいは3名),あるいは多数でおこなわれるゲームまである.
1人遊びは一種の最適化の問題としてとらえることができる.2人で,それぞれ
が対立した意図を持って行動するという要素が入る.3人以上の場合は,協力
や取引などより複雑な要素も入る.
- 零和
- ゲームの結果がどうなっても,参加プレイヤの得られる利得の総和が零
であるというもの.将棋であっても,リーグ戦の最終戦で片方は挑戦権がかかっ
ていて,片方は挑戦権も陥落も関係ない場合のように,グローバルな視点でみ
ると零和でないというシチュエーションもあるが,
- 完全情報
- 囲碁や将棋では,自分の行動を決定する際には,局面の状態がすべて得
られている.それに対して,トランプやマージャンなどでは,山札,他のプレ
イヤなど見えない部分がある.
他に
- 確定
- サイコロのようなプレイヤの意思とは無関係に影響を与える要素がない.
も特徴に入れることができる.
ゲームのプログラムは結局のところ,
局面(State) -> 着手(Move)
局面がどのようなものであるかはゲームによる.たとえば,囲碁では初心者の
場合「相手の打った手の近くに打つ」という習性があるが,純粋にゲームとし
て見た時は,打った手の履歴に関わらず最善手は決定できるはずである.
このようなゲームをプレイするプログラムを作るには,局面に対して評価関
数を定義するのが一般的である.この評価関数は,勝つ確率(引き分けがない
二人零和完全情報ゲームでは,0か1の2値)が高い局面ほど高い評価値になるよ
うな関数が望ましい.
局面に対して,すべての着手を生成し,それぞれの着手を適応した局面の評
価値を計算し,評価値が最大になるような着手を選択するという単純な方法で
も,評価関数が正確なら,常に最善手が選ばれる.
しかし,実際に使える評価関数は不正確なので,より局面を進めてその上で
の評価関数を計算する方法が使われる.これは,人間のプレイの場合と良く似
ている.
探索を表現するために,探索木というものがよく用いられる.
二人零和ゲームは,自分の利益が相手の不利益なので,相手の立場からみた評
価関数の正負を入れ替えると自分の評価関数になる自分の手番のノードでは,
次の1手後の評価値のうちの最大のもの(MAXを選び),相手の手番は相手にとっ
ての最善手である最小の評価値を選ぶ
このように,何手か先まで読んで,それぞれがその局面での最良の手を選ぶと
仮定して手を決定する方法をMin-Max法と呼ぶ.
理想的には無限手先まで読めば,Min-Max法で最良の手が見つかるが,実際に
は深さを決めて,それ以上は読まないというのが一般的である.Min-Max法で,
評価値を計算する葉(leaf)の数をなるべく減らすために,Alpha-Beta法,
Window探索,反復深化(iterative deepning)などいろいろな方法が用いられる
が,ここでは単純な MinMax法のプログラムの例を見てみる.
次に進む