ADS用遊戯王AIプロジェクト

目的

本プロジェクトの目的は、従来より強力な判断機構をもった遊戯王オフィシャルカードゲーム(以降、単にOCG)をシミュレートするエージェント(または遊戯王AI)を開発することである。

また、そのエージェントを用いた遊戯王AI提供WEBサービス、環境シミュレーションWEBサービス、およびエージェントのAPIを提供することである。

これらのサービスにより、マッチング待機時間、複数のデッキを用いた一人回しといったタスクの時間コスト削減を目指す。

コミュニティ

ソースリポジトリ

準備中

Discord

準備中

プロジェクト

全般

ユーザーインターフェース

ユーザーインターフェースには現在も開発が続けられているProjectIgnis(ADS)を使用する。

ユーザーはADS介して遊戯王AIと対戦することができる。

開発言語

開発言語には主にMLライブラリが充実しているPythonを使用する。
パフォーマンスが求められる処理には適宜、C/C++、Cythonによる拡張を行う。

プログラム概要

メインプロセスの中で、仮想デュエルとエージェントを立ち上げ、エージェントが仮想デュエルの状況に対してアクションを実行する。

ユーザーと対戦する際は、ADSが提供するTCPプロトコルを利用して通信を行い、仮想デュエルとユーザー画面を同期させる。

エージェント

概要

エージェントは深層学習を行い、アクションを要求される場面でアクションの良し悪しを評価し実行する。

ニューラルネットワーク

エージェントが評価値を算出するのにニューラルネットワーク(NN)を使用する。


出力層
アクションの評価値を出力するパーセプトロンである。

評価値

エージェントから見て相手ターン終了時にお互いのプレーヤーの価値を計算する。
 (アクションの評価値) = (自分の価値) - (相手の価値)とし、この値に近づくようにNNを学習させる。

したがって、1ターン中の全てのアクションは同じ評価値となる。
デュエルは1アクションの報酬を最大化しても勝てるわけではないので、長期的なアクションの評価算出タイミングとして相手ターン終了時という指標を設けた。
また、「悪いアクションは必ず悪い結果を招く」を仮定しているので、1ターンに悪いアクションと良いアクションが混じっていても確率的に悪いアクションの方が評価が低くなることを期待している。

お互いのプレイヤーの価値は、フィールド上のカード枚数、手札枚数、デッキ枚数(デッキを多く掘っている方が基本的に有利)、ライフポイント等から定量的に算出する。
計算式は設計中である。

カードの埋め込みベクトル

一部が欠けたテキストからカード名を予測する3層構造のNNを学習させることによって、各カードを低次元のベクトル表現を抽出できる。

自然言語処理の分野で言う、単語の分散表現であり、そのアルゴリズムはCBoWを模している。
つまり、中心語がカード名であり、周辺語がそのテキストである。

実際、この方法で作成したベクトルでコサイン類似度を計算すると、《ブラックホール》と《激流葬》、《サンダーボルト》と《ハーピィの羽根帚》、《サイクロン》と《コズミック・サイクロン》などは大きい値を取る。
これは似たテキストを持つカードが空間上に上手く配置されていることを示唆している。

テキストの分散表現とカードステータス(種類、属性、ATK/DEF、etc)をどのように同時に扱うかは検討中である。

学習の工夫

環境で想定されるデッキに対していくつかエージェントを作成し、エージェント同士で対戦させる。

対戦の全てのアクションは棋譜のようにすべて記録しておく。

対戦終了後、エージェントは "棋譜" を参照して学習を行う。

また、学習済みとして有限個の "棋譜"を適当なディレクトリに保存しておき、定期的(数対戦後)にその中からランダムに選択した "棋譜" を参照して再び学習させる。

"棋譜" 保存数が上限を超えた場合、最も古いものから削除する。
削除されるタイミングは環境の変わり目であることが望ましい。
また、どの環境でも通用する基本的な戦術はどの環境の "棋譜" にも含まれると予想されるので、貴重なデータが失われることに過度に反応する必要はないと思われる。

ある程度学習したエージェントはさらにユーザーと対戦させることでNNを強化する。

仮想デュエル

既存のBotなどを参考にしながらPythonに焼き直す。
既存のソースコードを使用しない理由は、NNをPythonで実装するからである。
エージェントにクエリを投げる際に、Pythonオブジェクトへ変換するオーバーヘッドを削減するのが目的である。(1デュエル中にクエリは相当数投げられるはずである。)

各種WEBサービスについて

WEBを通して学習済みエージェントを提供し、利用してもらう。

また、ADSサーバーを介して対戦する方法も提供することでより手軽に利用してもらう。
この方法ならば我々も対戦データを取得できるため、より良いエージェントに繋げられる。

さらにエージェント開発者向けとして、ソースコードを公開、あるいはライブラリとして提供することでプロジェクトの発展、コミュニティの拡大を目指す。

弱AIから脱却したいという思い付きで練ったプロジェクトでありますので、もし実生活に影響が出るようでしたら突然投げ出す可能性がございます。

ADSというグレーなツールを利用する関係上見返りはございません。