スクリーンショット_2019-12-02_19

AIが流行りのデッキを分析して、対策デッキをレコメンドするシステム

こんにちは。meiheiです。

先日のクラロワリーグアジア 2019 シーズン2 にて、FAV gaminが準優勝をかざっていました。世界大会が待ち遠しいですね。
(追記)JACKさんGOD #FAVWIN

クラロワリーグを見ている方はわかるかと思いますが、どのチームにも情報収集や予測を専門とするアナリストがいます。
あまり活躍が表に出ることはありませんが、確実にチームの勝率を上げる要因になっているはずです。

そう考えると、やはり自分専属のアナリストがほしいわけです。
PSがなくてもトロを上げたいわけです。
でも、お金はかけたくない。。。。。

そうだ!AIをつかって自分専属のアナリストにしよう!

そんな感情に流され、クラロワデータアナライザー(仮)を作ることを決めました。

注意

読者対象はクラロワをやっている人。技術的な詳しいことは書いていません。
また、あえて曖昧な表現(例えば”AI”とか)を使って専門用語を隠しています。詳しい人にとってはツッコミしたいポイントが多いでしょうが、ご了承ください。

本記事 #中途半端成果物 では未完成なものを成果物として公開しています。
なので、結論を導いていないため、読み物としても中途半端なものになっているかもしれませんが、ご了承ください。

全体の構想

目標はサムネイルにあるような万能AI。
でも実は、AIってそこまで万能ではありません。

しかし、1つ1つの処理を専用のAIが処理することで、全体を通しして”レコメンド”が行えるシステムが完成します。

何となくの流れはこんな感じかなって図↓

スクリーンショット 2019-12-03 2.55.34

AI(機械学習)は、大量のデータを学習する”学習ステップ”と、新しいデータから結果を予測する”予測ステップ”があり、この図では上の矢印の流れが”学習ステップ”、下の矢印の流れが”予測ステップ”を意味しています。

ここでつくるAIは、大量の対戦データからデッキの種類や相性、傾向を学習して、自分の対戦データから(自分のトロ帯付近の)環境で勝ちやすいデッキを紹介してもらおうと考えています。

※注意※
ちなみに今完成したのは”デッキ判定AI”のみです。本記事もそこで終わります。

デッキをデータに変換する

はじめに、1デッキ=8枚のカードの集合(重複なし・順番関係なし)をコンピューターで表現してみましょう。

例として、2.6ホグデッキをデータで表現してみようと思います。

まずは、数字とユニットの対応表を作ります。

スクリーンショット 2019-12-03 3.00.25

ここであえて、愚直に”1デッキ=8枚のカード”なのでサイズ8の配列で表現してみます。

スクリーンショット 2019-12-03 3.01.49

インデックスはデッキの何番目に保存するかを決めています。(デッキの上にある数字)
56, 13, 7, ...などの数字は、先程作った数字とユニットの対応表のから参照する数字になります。

この方法はシンプルでわかり易いですが、”順番関係無し”の条件をクリアできません。

参考に以下の2つの順番が異なるデッキがあるとします。
この方法ではこれらを別のデッキと見なしてしまいます。

スクリーンショット 2019-12-03 21.10.43

この問題を解決するのがOne-hotベクトルと呼ばれる表現方法です。

詳しくはこちらのサイトがわかりやすいです。

今回の場合では、ユニットの種類の数をサイズとしています。
そして、デッキで使われていたら1、使われていなかったら0とします。

スクリーンショット 2019-12-03 3.09.24

こうすることで、デッキがどの順番で並んでいても、カードが同じであれば同じデッキと見なせます。

こうして、デッキをデータに変換し、AIに入力する準備ができました。

デッキ判定AI

先程準備したOne-hotベクトル表現で実際にデッキのデータを入力してみます。

デッキのデータは可能な限り良質なものが良いので、RoyaleAPIさんからトッププレイヤーの対戦データをいただきました。(データは2019/5/22のもの)

集めたデータのn次元のベクトルを2次元ベクトルに変換して可視化してみます。

スクリーンショット 2019-12-03 17.57.52

これはデッキを(x, y)の2組の数字で表現したものをグラフにプロットしたものと考えてもらって大丈夫です。

では、このデータから10個の似ているグループに分けてみます。(k-meansという手法を使いました)
ちょっと難しいですが、n次元の空間に10個の重心になる点を決めて、そこから近いところにあるデータをグループに加えるというやり方です。

詳しくはこちらとか。

グループ化されたものはこちらになります。
ここから特徴的なユニットを10体取ってきたものになります。

1: ice-wizard,the-log,mega-minion,poison,miner,tornado,graveyard,ice-spirit,skeletons,baby-dragon
2: golem,lumberjack,baby-dragon,mega-minion,poison,tornado,giant-snowball,barbarian-barrel,lightning,electro-wizard
3: poison,miner,bats,giant-snowball,inferno-tower,barbarian-barrel,prince,electro-wizard,guards,royal-hogs
4: giant,mega-minion,prince,zap,dark-prince,electro-wizard,poison,miner,musketeer,rage
5: giant-snowball,ice-golem,bats,elixir-collector,musketeer,barbarian-barrel,lumberjack,balloon,freeze,bandit
6: golem,prince,mega-minion,baby-dragon,lightning,guards,giant-snowball,barbarian-barrel,skeletons,tornado
7: bandit,electro-wizard,pekka,minions,battle-ram,ram-rider,poison,mega-knight,giant-snowball,barbarian-barrel
8: lava-hound,baby-dragon,mega-minion,miner,poison,guards,inferno-dragon,lumberjack,giant-snowball,lightning
9: rascals,goblin-barrel,dart-goblin,goblin-gang,bats,princess,mortar,giant-snowball,miner,prince
10: royal-giant,mega-minion,lumberjack,baby-dragon,lightning,fireball,giant-snowball,ice-wizard,guards,barbarian-barrel

何となくこのグループに名前をつけるとしたら
1.遅延スケラ
2.ランバー型ゴーレム
3.ディガポイ
4.ジャイ(PP、ディガー)
5.巨大雪玉?ランバーバルーン
6.プリンス型ゴーレム
7.ペッカ攻城(ラム・メガナイト)
8.ラヴァ
9.枯渇
10.ロイジャイ

いい感じにデッキ分けができてるかな?とは思いますが、普段使ってる2.6ホグがなかったのが不服です。
おそらく、きれいに分類されなかったグループ5とかにいそうです。

さて、最後にこの結果を2次元空間で可視化してみます。

スクリーンショット 2019-12-03 20.25.51

位置関係を見ると、ペッカ攻城とロイジャイ、ディガポイとプリンス型ゴーレム、ラヴァと枯渇などが対の位置にあることがわかります。
逆に、プリンス型ゴーレムとランバー型ゴーレム、ペッカ攻城とディガポイなどは近い位置にある事がわかります。

このグラフの位置関係はデッキが似ている・似ていないがわかるので、部分的には納得の行く結果です。

80%ぐらいの精度で分類できるデッキ判定AIが完成した。と言っても大丈夫でしょう(知らんけど)

反省点や考察として
遅延スケラはスケラよりも遅延部分に反応したため真ん中で広がるような分布になっているのかと考えています。
グループ5はデッキ名は無く、”その他”的な扱いに当たるのかと思います。全デッキが同じ回数出現しているわけではないので、(今回使ったデータでは)出現回数が少ない高回転デッキ:2.6ホグ、クロス、みかんバルーンなどが同じ1つのグループになってしまい、その中でも特徴的なユニットのバルーンだけが出てきたのではないかと考えています。

今回は10グループでしたが、15グループとか20グループなどにグループ数を増やすことでより詳細にデッキを分ける事ができます。
しかし、命名できない謎グループ(もはや謎デッキと名付けても良い)が多く出現してしまうため工夫が必要です。

私はここで大変さを感じ、モチベが下がって開発の手を止めました。

おわりに

技術的な話はしないつもりでしたが、そうすると「頑張ったぞ!」ってアピールできる点が皆無になってしまうため、でしゃばって色々話してました。すみません。

せっかく作ったものを公開しなければ、開発に掛けた時間が無駄になるような気がして、このような記事を書いている次第です。

反響があれば開発を続けます。また、Twitterかなにかでお声掛けしてもらえればプログラムは全部無料で公開します。(2次配布禁止のデータは公開しません)

以上になります。最後まで読んでいただきありがとうございます。

この記事が気に入ったらサポートをしてみませんか?