ポケモンの強化学習AI(1)

ポケモンの強化学習を実現するため、まずは迷路を解く AI を実装した

ポケモンの誕生から 20 年以上経った今でも、初代ポケモンをプレイし続けている人たちがいる。さすがに公式の大会は最新バージョンしか開催されていないが、非公式の Pokemon Showdown (以下 PS) という環境でいまだに数千人はプレイしている。私もふとしたきっかけから初代ポケモンを今プレイすることの面白さに気づき、 Smogon というコミュニティが主催するトーナメントに出場するようになってしまった。

初代ポケモンというと、ゲームバランスがおかしいことが指摘されている。例えば急所率が素早さ依存のため、ケンタロスやフーディンといったポケモンはそのステータス上、ほとんどのポケモンに対して有利を取れる、「こおり」=即死のため、「ふぶき」を打てるポケモンが強すぎる、「ねむり」状態から起きた際に行動できない、などといったものだ。だが、 PS 環境では、これらの点は調整されているといって良い。

PS における初代ポケモンの代表的な対戦ルールはこうだ。

  • ミュウ、ミュウツー以外のポケモンから自由に 6 体選出する
  • 「こおり」及び「ねむり」状態は 1 体まで
    • 相手のポケモンに「こおり」状態のポケモンがいると、こちらが「ふぶき」を打っても「こおり」状態にはならなくなる
  • 「ふぶき」の冷凍率は 10%
  • 下記の技は禁止
    • 「じわれ」などの一撃必殺技
    • 「かげぶんしん」など、回避率を上げる技
    • 「あなをほる」「そらをとぶ」
  • レベルは自由
    • 初代は特性「がんじょう」や「トリックルーム」などは無いため、必然的に 100 になる。
  • 公式大会であるような「見せ合い」は無く、お互いの情報が無いまま即座にゲームがスタートする

これが意外と面白い。6 体というのがポイントで、役割を持てるポケモンが増えるため、戦略に幅が生まれる。例えば黎明期のポケモンにおける全国大会である 1997/1998 カップで大活躍したケンタロスは、もちろんメタポケモンであることに変わりはないが、回復手段が無いため麻痺に弱い。そのため、ケンタロス対策としては、耐久力と素早さに優れるスターミーで「でんじは」を撒き、その後物理耐久に優れたパルシェンを受け出し、「からではさむ」で一方的に攻撃するという手段が取れる。

ちなみにパルシェンも当時はあまり活躍していなかったが、 PS 環境だとケンタロスやカビゴンといった物理アタッカーに強い、タイプ一致で「ふぶき」を打てる、素早さの遅いポケモンに対して「からではさむ」で一方的に攻撃できる、「だいばくはつ」で苦手なポケモンを強引に突破できる可能性を持つなど、トップメタの一角で、個人的にもお気に入りである。

金銀をはじめとして、カビゴンは金銀以降のポケモンで常に環境に入っていた(と思う)。ただ初代ではどちらかというとマイナーで、ノーマル単タイプとしてはケンタロスとラッキーの下だったが、PS 環境においてはトップメタである。理由は、

  • 覚える技が豊富で、初見で型を読みにくい
  • 耐久に優れ、ケンタロスと違って「リフレクター」を貼れるため、物理での殴り合いに強い
  • 「じばく」で最低でも 1:1 交換にもっていける
  • 初代の壊れ性能である「どわすれ」を覚えられる
  • 高い攻撃から、3 割麻痺の「のしかかり」と高威力の「はかいこうせん」で、ほとんどのポケモンを 2 発で KO できる

などである。特にこの環境では物理防御が低いポケモンが多く、特に環境に多いラッキー、フーディン、ゲンガーには(一部の状況を除いて)一方的な殺戮が行えるため、最も重宝されるポケモンの一体である。

PS 環境では、時代とともに戦い方の変遷があるのも面白い。例えば、電気タイプキラーとしての「岩・じめん」複合タイプでは、高い攻撃力をもって「だいばくはつ」を打てるゴローニャが主役だったが、2014 年ころにサイドンに取って代わられた。ラッキーを「じしん」2 発で仕留められる点、「みがわり」を使うと「ちきゅうなげ」をみがわりの消費を無く受けられる点、また交代読み&麻痺狙いでナッシーに対して「のしかかり」を打ったときのダメージ量などが考慮されたのだと思われる。

前置きが長くなってしまったが、ポケモンをやるにつれて「これ AI で最適化できないかな」と考え始めたのと、もともと AI に関して興味があったので、強化学習でトレーニングされたポケモン AI を作ってみようと思った。既に勉強したことや、これからやっていくことをこのブログに書いていきたいと思う。

自分の勉強のためにやっているのが半分なので、「既に実装されている」だとか「ライブラリ使えば簡単にできる」というのは一旦無視している。既に最適化されたものを GitHub で見てしまうと萎えるのが目に見えているので、あえて調べないようにしている。

本当は本稿で、強化学習の基本である Q 学習の素朴な実装をしたことや、 (Python ではなく) Rust で作ってみたことなどを書こうと考えていたが、思ったよりポケモンの話が中心になってしまったのでここらで終わろうと思う。

ポケモン AI を完成できるかは分からないが、久々に技術と実益を兼ねたものを見つけた感じがするので、頑張って完成させたい。このブログで成果は報告していくので、もし良かったら、 Twitter もフォローしてもらえると嬉しい。

https://twitter.com/miyakojima_dev

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy