ポケモンGO トレーナーバトル用AIの開発
PvPokeでは、AI相手に、リアルタイムでバトルシミュレーションを行う「トレーニング」機能を提供しています。難しい試みでしたが、結果、いつでもどこでも利用できるバトルトレーニングツールを完成させることができました。ポケモンGOのトレーナーバトルは、パーティ構成から、シールドや交代をタイミングよく使うといった戦術まで、複雑な要素が数多くあります。このゲームプレイを再現するAIの開発は非常に難解なものに思えるかもしれませんが、これを実現するために2つのコアシステムを設計しました:
各項目にジャンプ
ゴールデザイン
AIを開発するにあたって、人間と同じようにプレイし、人間と同じように倒せる相手にしたと考えました。難易度に関しては、以下の箇条書きの内容にいそって設定されています:
- AIは実際のプレイヤーがとるような戦略・思考で動作する。
- AIは、人間の対戦相手が知りえない情報を得てはならない(プレイヤーのパーティ構成、わざ構成のデータを取得できてなならない)。
- 難易度は、ポケモンのCPを上昇させるような物ではなく、戦術・プレイの変化によってのみ調整される。
- AIがミスをしても構わない。
このAIでは、プレイヤーが他のプレイヤーに勝利できるのと同様、AIに勝利できるようにすることが重要だと考えました。GOロケット団のバトルでみられるような、実際のトレーナーバトルでは通用しない性質・動作は発生させたくなりませんでした。また、AIが完全無敵であったり、百発百中であることも望んでいませんでした。もしプレイヤーがAIのミスに遭遇したとしても、それもトレーニングの一環です。
これらの目標を実現するにあたり、以下のことが必要だと考えました。
- AIは、当初予定していた動作を変更する、長期的な戦略を立てることができる
- 戦略決定のため、対戦を評価する手段をもつ
最初に行ったのは、できるだけ多くのプレイヤーの戦略をカタログ化し、それらをアルゴリズムで体系化することでした。例えば、相手のHPが少ないならKOしてエネルギーを稼ぐ、相手が自分に不利なスペシャルアタックを出してきそうなら交代して別のポケモンで受ける、といったものです。
以下の表は、戦略や特徴の例と、それらを採用している難易度です:
初心者 | 中級者 | エリート | チャンピオン | |
シールド | ✔ | ✔ | ✔ | ✔ |
2 スペシャルアタック | ✔ | ✔ | ✔ | |
通常の交代設定 | ✔ | ✔ | ✔ | |
エネルギーチャージ | ✔ | ✔ | ||
シールドの誘発 | ✔ | ✔ | ||
高度な交代 | ✔ | |||
交代時間の管理 | ✔ |
これらはどのように実装されているのでしょうか?AIを動かす2つのコアシステムを解説します。
対戦の評価
対戦を考える場合、タイプ、シールド、エネルギーなど非常に多くの変数を考慮する必要があります。経験を積んだプレイヤーなら、どの変数が現在の対戦を決定づけるかを理解できるはずです。
AIの心臓部を動かしているのは、ご存じのバトルシミュレーターです。AIは現在のポケモンのHPとエネルギーでそれぞれのポケモン同士を戦わせ、現在および予想される対戦のおおよその結果を調べます。その結果によって、AIは4種類のシナリオを実行します。
- お互いシールド誘発: 自身と相手の両方がシールド誘発に成功した場合、自身は勝つことができるか?
- シールド誘発無し: シールド誘発を使わないで自身が勝つことができるか?
- どちらもシールド誘発無し: お互いにシールド誘発なしで自身が勝つことができるか?
- エネルギーチャージ: ノーマルアタックのみで勝つことができるか?
上記のシナリオが良いと思われる場合、AIは粘り強く戦い、勝利に向けて戦略を決定します。これらのシナリオが上手くいかないようなら、交代のチャンスを探ります。
AIはいくつかの特定の瞬間に対戦の評価を行います。
- 大会モード(6vs6)ではパーティメンバー選択の間、 最適およびカウンターポケモンを評価
- 試合開始時
- どちらかのプレイヤーがポケモンを交代したとき
- 各スペシャルアタックの後
この結果、AIはスペシャルアタックの後に交代する傾向があります。これは実際にプレイヤーがスペシャルアタックの間に交代入力する動作と一致します。ターンごとに対戦を評価する方法も考えましたが、不安定な振る舞いとなり、現在の動作に決定しました。
意思決定
AIはこれらの情報を集めた後、どうやって行動を決定するするのでしょうか?ここで、AIの2つ目のコアシステムが働きます。AIの全ての選択、および行動は疑似ランダム意思決定機能によって管理されます。簡単に言えば、この機能は様々な選択肢の抽選機能です。AIはそれらの情報の重み、つまりそれぞれの選択肢が何回抽選で選ばれたのかで決定します。
上記のように、AIはいくつかの選択肢からランダムに選び、その中から特定の選択肢が重みづけによって選ばれます。AIはこの選択が正しくなるよう、重みづけの値を調整しますが、型にはまらない道は常に用意されています。
この疑似ランダム意思決定機能は、私の目指すゴールに対して非常に重要でした。私はAIが同じ対戦になった時でも、常に同じ動作にはならないようにしたいと考えており、予測不可能な部分を加えたかったのです。このシステムでは、AIは失敗や判断ミスをする可能性があるのと同時に、より厳格な意思決定システムでは到達できない、天才的にもなりえるといえます。
大会モードのポケモン選択、戦術の決定、交代、シールドを使うかどうか、AIが行う「全て」がこのシステムを通して決定されます。
パーティ選択
挑戦的なAIを作るなら、パーティ作成も挑戦的である必要があります。これにはいくつかの方法があります。例えば簡単な方法として、あらかじめAIが選択できるパーティのリストを用意しておくことができます。これも良いのですが、私はプレイヤーが自分のパーティ作成のスキルを磨けるように、バリエーションを多くしたいと考えました。どうすれば、バランスの取れた競争力のあるパーティを、難易度に応じてランダムに生成することができるでしょうか?
そのために私がたどり着いたのがスロットシステムでした。候補ポケモンはいくつかのスロットにカテゴライズされており (“Tank”, “Grass,” Mudboi,” など)、AIは上記の疑似ランダム意思決定に従い、スロットを選択、スロットの中からポケモンを選択します。一度選ばれたスロット、ポケモンは二度と選択されず、AIはすべて登録枠が埋まるまでこれを繰り返します。
それぞれのスロットは他のスロットと関りがあります。例えば “Mudboi” が選ばれた場合、AIはくさタイプの弱点をカバーするために “Flying” スロットからポケモンを選ぶ可能性が高くなります。
最後に考えなければならないのは難易度です。低難易度では、AIは上位ポケモンではないものや、上位ポケモンの弱い個体が選ばれます。スロット内の各ポケモンは難易度が設定されており、AIはそのポケモンの難易度と自分の難易度との差が1位内になるように選びます。例えば、難易度3のAI (“チャンピオン”) は難易度2、難易度3に属するポケモンを選び、難易度0のAI (“初心者”) は難易度0、難易度1に属するポケモンを選びます。これにより、高難易度ではリーグなどの条件に最適なポケモン、低レベルでは適性が低いポケモンが選ばれます。
メンバーの選択はこれでよいですが、パーティの選択はどうでしょう?プレイヤーの戦略はいくつかのカテゴリーに分けることができます。C9GotemRedditに投稿されたC9Gotem氏の投稿には、選択戦略に係わるさまざまな考えが詳しく紹介されており、AIのこの部分を考える際の参考になりました。
大会モードでは、AIは以下の選択戦略に基づき候補を選びます:
- ベーシック: AIは自分の候補から順番に3体のセットを直接選びます。これはプレイヤーが良く使う3体を選ぶ場面に似ています。スロットの相乗効果で、これらのパーティは通常バランスが取れていますが、この戦略はいくつか予想外の結果に終わることもあります。
- ベスト: AIは、対戦で最も有利となると思われるポケモンを初手に持ってきます。次にAIは、相手のカウンターに対抗するため、初手のボディーガード役を選び、最後に両方と組合せの良いポケモンでパーティを締めくくります。
- カウンター: 上記と同様ですが、相手のベストのポケモンのカウンターを初手に配置します。
- アンバランス: AIはバランスの良い2体のポケモンを選び、その2体のボディーガードとなるポケモンを初手に配置します。通常のバランス型のパーティを凌駕するパワーを持ち、戦いの流れをコントロールすることを目指しています。
- 同パーティ: 対戦の後、AIが再び同じパーティを使います。前の対戦で勝利した場合に選択されやすいです。
- 同パーティで初手変更: 対戦の後、AIが同じパーティ構成を使います。ただし、先ほどのパーティのボディーガードを初手にもってきます。これは前の対戦の初手カウンターに対するカウンターになります。前の対戦で勝利した場合により選ばれやすいです。
- カウンター初手: AIは、対戦相手が前の対戦に使った初手に対するカウンターを初手に配置します。前の対戦で負けた後に選ばれやすいです。
このように、AIは実際のプレイヤーのようにパーティを作成してくるので、大会でのパーティ作成の練習にもなります。
最後に
このプロジェクトは大きな情熱と努力の結晶です。皆さんがゲームをより楽しみ、そしてバトルで勝利するスキルを身につけられることを願っています。このトレーニングツールが、PvP初心者、開発者、そしてNianticへの刺激になればと願っています。明るく、エキサイティングな未来を期待しています!