機械学習周りのプログラミング中心。 ポケモンバトルAI本通販中(4/5まで)

3体構成での強化学習【PokéAI】

PokéAIで、従来の1vs1から3vs3バトルへの拡張を進めています。今回は、技を選択する部分の強化学習の仕組みを3vs3に対応させました。

エージェントの入出力の拡張

強化学習におけるエージェントとは、バトルの状態を入力として受け取り、行動を出力する関数です。勝率を高めるような行動がとれるよう関数のパラメータを調整することが強化学習の目的となります。

1vs1のときは、行動はポケモンが覚えている技4種類のうち1つを選択するものでした。今回は3vs3なので交代も可能にしたいです。また、1匹目のポケモンと2匹目のポケモンで、同じ1番目の技でも全く違う技なので、これも別の出力として表現したほうがよいでしょう。

index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
行動 ポケ0技0 ポケ0技1 ポケ0技2 ポケ0技3 ポケ0に交代 ポケ1技0 ポケ1技1 ポケ1技2 ポケ1技3 ポケ1に交代 ポケ2技0 ポケ2技1 ポケ2技2 ポケ2技3 ポケ2に交代

このように15個の候補から1つを選ぶ形式にしました。例えばポケモン0が出ているときは、ポケ0技0~ポケ0技3と、ポケ1に交代、ポケ2に交代の6種類が有効な選択肢です。 ただし、瀕死になっているポケモンには交代できません。 無効な選択肢も出力できてしまいますが、その場合は有効なものからランダムに実行することにします。

このようにどのポケモンが場に出ているかで有効な選択肢が変わるため、エージェントへの入力としてその情報を与える必要があります。

1vs1の場合、入力としては相手ポケモンのタイプ、{自分,相手}の{残りHP率、状態異常、ランク補正}の41次元の値を与えていました。 これに対し、自分の3匹のポケモンのうちどれが場に出ているか(3次元)、どれが瀕死でないか(3次元)という情報を追加します。 相手の残りポケモン数なども役に立つ可能性はありますが、複雑化するためまずは最低限の情報にとどめました。

報酬の改良、対戦相手の変更

上記の入出力変更だけで学習を試みたのですが、戦略があまり学習されず、そもそも無効な選択肢を選ぶ確率が60%近くあるなどうまくいきませんでした。

従来の報酬は、ゲーム終了時のみ勝ったら1、負けたら-1を与えていました。まず無効な選択肢を選ばないように誘導するため、無効な選択肢を選んだ場合は報酬として-0.1を与えるようにしたところ、この点は改善しました。

ポケモンが3匹瀕死にならないとバトルが終了しないため、1匹のときよりターン数が多く、行動と勝敗の因果関係を学習することが難しくなっています。そのため補助的な報酬として、ダメージに基づくものを加えました。 相手に与えたダメージ(HP割合)および、瀕死にした際に即時に0.1程度の報酬を与えます。逆に自分がダメージを受けたり瀕死になったら逆の符号の報酬を与えます。

また、強化学習の際に対戦する相手はランダムに行動していましたが、これだと簡単に90%以上の勝率となってしまい戦略の優劣がつきにくくなっていました。そのため、相手をすでに学習されたエージェントに従って行動させることにしました。パーティごとにエージェントのパラメータを学習しないといけないため、相手パーティの多様性は減ってしまいますが、まずは固定した20パーティを相手に何度も対戦させるようにしました。

定性的な結果

これらの改良を加えた結果、3vs3のバトルにおいてちょっと賢そうな戦略が見られるようになりました。

与えたパーティに対して学習された戦略をいくつか紹介します。戦略の意味付けは対戦ログから私が主観で判断しています。

* ゲンガー (LV 50 HP 167/167)
サイコキネシス すてみタックル 10まんボルト
カブトプス (LV 50 HP 167/167)
いあいぎり なみのり きりさく かげぶんしん
ルージュラ (LV 55 HP 188/188)
れいとうビーム あくまのキッス サイコキネシス

ルージュラは、相手が眠っていなければあくまのキッスを使い、眠っていれば攻撃技を選択します。相手としてフリーザーが出てきたら、ルージュラに交換するという行動も見られました。ふぶきで凍らされないための知恵といえます。

* カイロス (LV 55 HP 188/188)
ちきゅうなげ つるぎのまい のしかかり はかいこうせん
カイリキー (LV 50 HP 197/197)
いわなだれ だいもんじ あなをほる メガトンパンチ
フリーザー (LV 50 HP 197/197)
れいとうビーム ふぶき

カイロスは、つるぎのまいを積んでからのしかかりのコンボを狙っています。エージェントの入力としてランク補正が入っているので、積んでから攻撃という挙動は実現可能で、実際に学習されました。 しかしながら実際は積んでいる間に倒されたり、急所に当たって積んだ効果がなかったり(初代特有の仕様)する場面が多いようでした。

* サンダー (LV 55 HP 215/215)
ドリルくちばし 10まんボルト
ニョロボン (LV 50 HP 197/197)
かげぶんしん れいとうビーム さいみんじゅつ
ガルーラ (LV 50 HP 212/212)
のしかかり かいりき とっしん ちきゅうなげ

サンダーはサイドンに対して効果のない10まんボルトを選択してしまい、うまく学習ができていません。 ニョロボンはさいみんじゅつで相手を眠らせたうえでかげぶんしんを積み、その後れいとうビームを連打するという凶悪な戦法をとることもありました。

面白い例をいくつかピックアップしましたが、全体的にはうまくいかない例が多く、学習方法の改善が必要と思われます。