Pokemon Showdown用 AI(Percymon) 第8世代対応
これの続編です。最後に「乞うご期待」とか書いといて全然更新してなかった
やっと更新作業が終わりましたよ
(更新が停止したプロジェクトをGitHubでフォークしてます。プログラムに興味がある人はDLして実行してみてね)
前回記事の時点では第7世代までしか対応していなかったですが、今回のポケモンソード・シールドを含む第8世代まで対応させました。
がんばりました。ポケモンAIの開発は新世代へのアップデートができなくて更新が途絶えるものだと古事記にも書いてありますが阻止しました。
今回の撮れ高
Pokemon Showdown 第8世代シングル6→3
× 適当プレイぼく(手前) vs ○ 3手読み Percymon (奥)
PTと選出はいい感じの勝負になるように人間が適当に決定
エースバーンが強かった。
- 数字はその局面の評価値(高いほどPercymon側有利)を表します
- 頂点が現在のターンとお互いのHP残量を表します
- 木構造を下にたどっていき、Percymonのコマンド、Playerのコマンドが揃ったところで実際にゲームが進みその結果のHP残量が記載されています。
- 死に出しの場合そこでもゲームが進みます
- 今回は深さ3の設定なので、上記の数え方で合計3回ゲームが進んだところまで計算しています。(必ずしも3ターン先とはなりません)
改めて何をするやつなのか説明
もちろんこの仕組みはオリジナルの開発者さんが設計したものですが、
前回記事でここらへんを説明していなかったので図を作りました。
- ①PercymonはShowdownサーバーに接続し、対戦募集・コマンド送信などを自動で行います。ランダムでマッチングしたオンラインのプレイヤーが対戦相手となります。
- ②対戦はShowdownサーバー上で行われますが、Percymonは対戦メッセージを手がかりに内部で対戦シミュレーターを動かし、対戦の局面を逐一更新していきます。
- ③④この局面情報を用いてMinimaxモジュールは「現在の情報から推測した、最も有効なコマンド選択肢」を計算します。これは図中で「最善手」と書かれているものです。
- ⑤数秒の後に最善手の計算が終わると、Percymon本体はShowdownサーバーに「最善手」を送信し、対戦相手のコマンド選択を待って対戦が進みます。
- 上記の最善手計算を対戦終了まで、コマンド選択を求められる度に繰り返します。
- おまけ機能として、Webブラウザを介して最善手計算の結果(選択肢ごとの評価値)をツリー構造で確認することができます。
相手ポケモンの技の推測や、選出選択はどうしてるの? など細かい仕様はまた別の機会に説明しようと思ってます。
ついでに改良したとこ
冬休みの自由研究的な。
計算の高速化
上記Minimaxモジュール中で、自分の行動×相手の行動の組み合わせに対応する数十パターンの局面を一個ずつ再現するのですが、そのために毎回局面オブジェクトを複製する ところの処理が結構速くなりました。
局面(Battle)オブジェクトの中身のうち、直接局面の状態に関係せずコピーする必要がないもの(Dexオブジェクト)を複製対象から外しました。あと単純にコンソールに表示されるログメッセージをOFFにするだけでもだいぶ速くなりました。
ケース1 | ケース2 | ケース3 | |
---|---|---|---|
旧(ログメッセージあり) | 1.170s | 8.498s | 25.896s |
新(ログメッセージあり) | 0.798s | 7.139s | 11.450s |
新(ログメッセージなし) | 0.194s | 1.386s | 3.000s |
Minimaxノードの表示機能
これは修正・改善というより新規機能に近いですが、上で説明したような想定される各局面の評価値を分かりやすく表示するようにしました。
Minimaxとかを知らなくてもこれを見れば誰でも直感的に理解できそう?
一応オリジナル(本プログラムはrameshvarunさんからのフォークです)にも簡易的にノードを可視化する機能はあったのですが、木構造の方が見やすかったので新しくHTMLで描きました。デバッグ用途にも重宝してます。
メガシンカ・Z技・ダイマックスの分岐計算
当たり前といえば当たり前ですが、メガシンカ・Z技・ダイマックスが使用できる局面で、それを使用するかしないかの選択は状況によります。
なにがいいたいかというと、今まではこれらは強制的に使用するように設定していたのですが、今回から使用する場合・使用しない場合を分岐して計算し、最適な方を選ぶようにしました。
動機としてはダイマックスの登場がデカイです。メガシンカ・Z技はあらかじめアイテムを持っているポケモンのみが使用できるため、まあまあ半分ぐらいの場合は即発動でも自然な選択肢になりますが、ダイマックスは全ポケモンがいつでも使用できるため、初手発動はあまりにも雑すぎると思いました。
が、結果的に現在もAIはほぼ初手でダイマックスします。これはたかだが2~3ターン先の局面の範囲では早めに使用したほうが有利がとれる(と計算している)からです。これについては今後の課題ですね。
まとめと感想
一応正月休みを含む1ヶ月ほどかかりましたが、対戦エンジン部分は自作していないので1ヶ月で終わってます。そこを自作しているAIだと新ポケの種族名・新規技・ダイマックスシステム、、など全部実装し直さないといけないので正直ポケモン剣盾シミュレーターの開発をしているのかAIを作っているのかわからないくらいの作業量になると思います。
計算の高速化により3手読みが現実的な時間でできるようになって面白いです。
疲れたら適当にランダムマッチに潜らせてオンラインプレイヤーと戦わせてるのですが、初心者と思わしきプレイヤーを一方的に撲殺しているのを見ると達成感を感じます。子供の少年野球を応援するお父さんみたいな。
ちなみに今回作業してて一番思ったのは、「Pokemon Showdownってスゲェなあ~」ってことです。第8世代のアップデートも2週間ぐらいで落ち着いてたし。
Showdownの開発リーダーはCV(履歴書)の一番上にShowdownの開発・運用実績を載っけてて普通にアメリカで活躍しているので、アメリカで働きたい学生はPokemon Showdownみたいなやつを作りましょう。
イタリアで働きたい人はサイゼリヤとオリーブの丘に通いつめてピザの種類を覚えとくといいです。プレ~ゴ~~