今作っている自作の戦闘システムでAIを作る必要が出てきたので、ゲームAIの一種である「ユーティリティベースAI」を作ることにしました。今回はそのAIについて書きます。
ユーティリティベースAIとは何か
ユーティリティベースAIとは、ゲームAIの中で「効用や見返りから行動を決めるAI」のことを指します(ユーティリティ=効用という意味)。具体的には、例えば戦闘で自分が覚えている技の中から、特に効果の高そうな技を選びたいときにこの方式のAIが使えます。
ユーティリティベースAIでは「評価関数」とよばれる式を使ってその場面での技の効用を見積ります。この評価関数を使った評価を全部の技に対して行い、最終的に評価値が一番高い技を使うというわけです。
ユーティリティベースAIの評価関数の作り方
ユーティリティベースAIを作る際には評価関数を作る必要があります。評価関数はこのAIのミソになるのでとても重要な部分です。しかし困ったことに「こうすればいい」というような決まりはないので、基本的には何を元に判断させたいかを決めて、あとは試行錯誤的に調整していく必要があります。
ここで、例としてRPGの戦闘でどのキャラクターを攻撃するかを判断する場合を考えてみましょう。このとき判断のもとになるのは次のような情報です。
- 残りHP:少ないほど優先度アップ
- 敵の攻撃力:高いほど優先度アップ
- 敵の防御力:弱いほど優先度アップ
まずは残りHPが少ない敵を攻撃するのがRPGの鉄則です(その分相手の手数が減るため)。そして「攻撃力が高く、防御力が低い敵キャラ」を優先して倒したいですよね(攻撃をもらうと痛いが、倒しやすいので早く倒したいから)。なので敵の攻撃力と防御力も考慮する必要があります。
これを元に評価関数を考えると、あるキャラクターに対する評価値Xを求める式は例えば次のように設定できます。
X=(HP最大値-残りHP)×重みα+敵の攻撃力×重みβ+敵の防御力×重みγ
ここで、重みα・β・γはそれぞれの要素をどれくらい重視するかで決定します。例えばαを大きくすれば残りHPの評価が大きくなるので、結果として他の要素よりも残りHPの少ない敵を優先的に倒すという判断になりやすくなります。
ちなみに上の式は分かりやすさを重視して考えたものですが、HP・攻撃力・防御力の値によっては結果に偏りが出る可能性があるため注意してください(ex.最大HPが攻撃力や防御力に比べて非常に大きい場合、残りHPの評価が高くなりすぎてしまう)。実際には極端な値でも偏りが出ないように考慮して式を考える必要があります。