ゲームAIの各手法まとめ

[新卒ゆるゆるアドベントカレンダー](https://qiita.com/advent-calendar/2019/yuruyuru-freshman)15日担当です。
15日にしたのになぜか一番バッターです。

# はじめに
あくまで概念的なお話しかしません。
そのため、各ゲームエンジンで実装する際にはそのエンジンごとの最適解や、エンジン改造で無理やり最適解にするなどの手法をとらなければいけないことと思います。その辺りのことはご自身で調べていただけますと幸いです。

# ゲームAIっていったい何でしょう
最近AIがやたらと話題に上がることが多いと思います。最近だとAIを用いて東京のラーメンを評価するというニュースがあり、ラーメン二郎が入選していて何かしらの異論とかが上がっていたりしました。[該当のニュースはこちら](https://news.livedoor.com/article/detail/17389298/)　~~ぼく個人的言えば二郎系が一番おいしいと思います。~~
このような最近話題に上がるような俗世間的に広く認知されているAIの中でもゲームAIについて説明できればと思います。

![https _qiita-image-store.s3.amazonaws.com_0_36899_f2b15c50-d149-a8da-9b3b-21e7628ecbe3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544634/4fdb12b3-156e-7fcf-12a1-31a1a4b1e8ec.png)

この記事の内容の多くは[人工知能の作り方 ―「おもしろい」ゲームAIはいかにして動くのか](https://www.amazon.co.jp/dp/B01MQSH3ZH/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)という本を参考にしています。

## 知能とは
AIはArtificial Intelligenceの略語で人工知能と和訳されるものです。
人工的に開発された知能それがすなわち人工知能なのですが、じゃあ一体知能とは何でしょう。
すごく概念的に言うと**自分の内部を外部から守ること。内部から湧きあがる欲求を環境において実現すること。**になるらしいです。正直これだけ言われても何のことか全くわからないので、別の定義では**外部と内部の環境を調節するもの**になるらしいです。これだとわかりやすいかと思います。例えば、
おなかが減ったら冷蔵庫を開けてチャーハンを作ったり、
![reizouko_woman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544634/42be96a5-2e54-1a77-b75d-91baf2180b50.png)
寒かったらエアコンをつけて部屋を暖めたりすることは、
![setsuden_airconditioner_man.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544634/e8f892b1-3c1a-8e3f-3c5f-1495c41d1a3c.png)
知能が体の状況を判断して処置していることです。
他にもさまざまな定義はあるものの、環境と自身との間に入り、環境内での行動を制御するものを知能としてみていくとわかりやすいかと思います。

##じゃあゲームAIっていったい。。。
さっきの知能をゲーム内に置き換えて考えてみましょう。
例えば、こんなモンスターがいたとします。
![fantasy_game_character_slime.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544634/cf8a18ab-e823-5e79-b978-9fb30ce11a1d.png)

- なわばりをもち、群れで行動する
- 見た目からして弱そう。


よくいるスライムみたいなキャラクターが群れで行動していると考えてみてください。
このモンスターがどういう行動をしたら、”らしく”見えるでしょうか。
見た目からして弱そうなこのモンスターがなわばりに入ってきたプレイヤーを見つけた場合に取りそうな行動は、おそらく一人で神風特攻するよりも仲間を呼んで数の暴力を行う方がらしさがあるかと思います。もしくは、群れごとどこかへ逃げ出してしまうかもしれません。このらしさの部分を作るのがゲームAIであり、そのらしさを作るために様々なものを使用します。

#ゲームAIの必須要素
ゲームAIに必要な共通要素は以下の二つあります。

1. リアリティ(知能シミュレーション)
1. 演技

また、以下のものがあるとよりらしさを演出することができます。

- 反射
- 群れ制御

これらについて説明していきます。

### リアリティ（知能シミュレーション）
例えば、FPS系のゲームで敵キャラクターを作ろうとしたとしたときに、5m以内に入ってきた敵に対して発砲を行いたいとしましょう。
純粋にやろうとすると、プレイヤーとの距離を参照して5m以内に入ったらトリガーを弾くというプログラムになりますが、例えば、後ろから近づかれたらどうするのとか、障害物に隠れてたらどうするのとかそういった箇所においての処理をしなければなりません。純粋に5m以内に入ってきたら攻撃をするだけでは生きてる感じがしないので、キャラクターが状況を記録し、判断するような機能を実装し、実際の行動を起こす必要があります。これを**自立型AI**といい、割と多く用いられている手法かと思います。

### 演技
これは、先ほどのモンスターを例として考えていただければわかりやすいかと思います。
例えば、なわばりに入ってきたプレイヤーに威嚇行動をしてみたり、FPSでは、警戒状態になったら銃を構えながら歩いてみたり、こういった演技をキャラクターにさせることでよりキャラクターがプログラムに動かされている傀儡ではなく、ゲームの世界で生きているかのようにさせることができるものかと思います。

### 反射
これは、例えば、草むらから動物が飛び出して来たらとっさによけるといったことや、まずいものを食べたときに動物はそれを吐き出すといった生理的な行動です。
草食動物や肉食動物、モンスターといったような者たちはどちらかといえば知能による判断というよりかは反射で状況を判断させた方が、よりらしさが出ますし、人間や其れに近しい生き物の場合は反射より知能から状況を判断し、行動に起こす方がらしさができるかと思います。
状況によって使い分けが必要ですが、これを入れることで、行動のすみわけができるため、よりゲーム内の行動にメリハリがつくことでしょう。

### 群れ制御
キャラクターが2体以上存在している場合には、群れ制御のアルゴリズムとして、「レイノルズの群アルゴリズム」が有効です。このアルゴリズムを使用すると、キャラクター同士が衝突しなくなったり、オブジェクトを回避することができます。これは、お互いの位置関係から間接的に自分の位置を変化させていきます。これでAIが周りを認識して行動している感じを醸し出すことがらしさを引き出す際に重要となるのです。

以上のものを実際どのようにして組み合わせるのかを説明していきます。


#意思決定アルゴリズム

意思決定とは、AIが自身で判断する技術です。
ゲームAIに用いられているもので、代表的なものは以下の七つです。

###ルールベースAI
これは行動の基準をルールとして組み上げるAIのことです。
ここでのルールとは「もし～なら(if then)」の形式であらわされるものです。
このタイプのAIでは場合いろいろなルールをあらかじめ作成しておき、それらをルールセレクターというモジュールでどのルールを使用するかを判断させます。
わかりやすい例を上げるならば、FFXIIのガンビットシステムを想像していただくとわかりやすいかと思います。
![7_42028129.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544634/6d9b7dea-d3ab-0a6f-33d2-9b8925f9aaf9.jpeg)
このようにルールを定義しておき、それを一度だけ選ぶ、順番に選ぶ等のセレクターを実装し、動かすAIです。

###ステートベースAI
ステートベースAIはその名前の通り、世界や人間の行動をステートの集合で表現しようとするAIです。
様々な分野で用いられているステートマシンのAI版で、あらかじめ、巡回や休憩中といった状態を定義しておき、AIの行動をステートからステートへ遷移するという形で表現するものです。
このAIはどちらかというとキャラクターに適応するものというよりは、ゲームのフローの中で用いられることが多く、
プレイヤーがこの場所にいる場合にこのイベントを起こす等の使用方法がよく見られます。

###ビヘイビアベースAI
ビヘイビア（振る舞い）を基本としてAIの行動を考えるものがこのビヘイビアベースAIです。
![BT_Overview_Intro.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544634/7118d150-0bff-d783-1644-b97ffc202bf6.jpeg)
UnityでもBehavior treeを組むためのアセットがあったり、Unreal Engineだとデフォルトで使用するAIであったりとゲームを開発する際に使用する機会が多いAIかと思います。
このAIは画像一番上のルートから自身の状況を把握するための様々な機能を利用して枝を見ていき、末端にある葉のノードを実行するAIとなっています。

###タスクベースAI
ある課題を解決するために、行うべき行動を一つ一つ順番に実行するAIです。
これは、人間がパンを作るという行動をする際に小麦粉をこねて、生地を形作り、焼くといった各行動をひとつづつ順番に実行することにより、行動を生成します。
タスクごとに切り分けられているため、行動の入れ替えがとても容易にできるというメリットがあります。


###ゴールベースAI
これは、あるゴールを目指すために到達しなければいけない小さなゴールの集合体を作成しキャラクターを制御するAIです。
例えば、ダンジョンに入った時にボスエリア手前にかぎの掛かった扉があるとしましょう。
この鍵を入手するには中ボスが待っているエリア奥の宝箱を開けなくてはならず、そのエリアに行くには道中でモンスターから特殊なアイテムを手に入れなければいけないといった小さなゴールの集合体を作成し、この小さなゴールを達成するために必要な行動をAIに行わせるものです。

###ユーティリティベースAI
このAIでは行動する際に重要視されるものをユーティリティで表現します。
例えば、HPが少なく賞金も少ないモンスターを倒すのと、HPは多いけれど賞金の多いモンスターを倒すのとどちらが効用（ユーティリティ）が高く感じるでしょうか。
おそらく後者の方が効用が高く感じるかと思います。
このようにAIに効用を評価させ、それに応じて行動を決定させます。

###シミュレーションベースAI
これは、AIにまだ起きていないことを想像させ、それによって現在の行動を生成させるAIです。
答えを見出すまでに様々な数学的手法があり、それらの革新的な応用の一つにモンテカルロ木探索法があります。これは、囲碁AIに用いられ、候補手の評価値を得るために、それ以降の手をランダムにシミュレーションします。これを何度も行うことにより、自身が一番勝率の高い手を選択することができるようになります。
![ki_alphago01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544634/de027be5-2515-a843-053d-ea80d53e0af8.jpeg)


これらの手法を用いて、キャラクターのらしさであったり、ゲームフローの管理などを行います。
これらの手法には向き不向きがあり、適したAIを選ぶのもまた重要になると思います。


#まとめ
最近巷を騒がせているAIの分野は学習等でどれだけAIの判断が正確かどうかを評価する傾向にあるように感じます。
ですが、ゲームAIにおいては正確であることも必要ではあるものの、実際の生き物の反応としてみることができることの方が重要であるような気がします。
初学者の備忘録的にまとめてみました。現在ゲームAIについて勉強していて概念的なところ以外も記事にできたらなぁ（願望）と思っています。その時にまた読んでいただければ幸いです。

それではここまで読んでいただきありがとうございました。