2013年05月14日

イロレーティング

お久しぶりです、GWはしまなみ海道をサイクリングダッシュ(走り出すさま)してきた
(2年連続2回目)コウスケです。
天気もよく、スポーツタイプの自転車だったので
とても快適でしたexclamation×2
***


最近、ふとしたきっかけで統計学を勉強しはじめました。
触れてみるととても面白く、ゲーム開発にも応用できそうなトピックも結構ありますぴかぴか(新しい)
今回はその中の一つを紹介しようと思います。

私のようにオンライン対戦系のゲームをプレイしている方は特に馴染み深いか
と思いますが、「レーティング」という概念があります。
簡単にいうと対戦系のゲームで「自分の強さ」が数値化されたもので、
勝てば上がりグッド(上向き矢印)、負ければ下がるバッド(下向き矢印)アレです。
レーティングの高いプレイヤーに勝つと大きく上がり、
低いプレイヤーだと少ししか上がりません。

これまでどういう計算がされているんだろう・・・と漠然とは思っていたのですが、
ふとしたきっかけで調べてみると、統計学が背景に使われている
ということでした。

しかも、レーティングの数値には意味があって、

レーティングに200ポイント差があるプレイヤー同士の対戦では、
76%の勝率で高いほうが勝つ

(100ポイントなら64%, 400ポイントなら91%)
(※この確率は後で出てくる「イロレーティング」に
基づくもので、計算方法は後ほど出てきます。)

となるように設計されているのですexclamation

つまり、予め対戦者間のレーティングによってその対戦における
自分の勝率が推定できてしまう
のです。
レーティングの数値にそんな意味があると知って目からウロコでした。

もちろん、一口にレーティングといっても適用させる対象により様々な計算方法が採用されていますが、
基本となる計算方法は、【イロレーティング
と呼ばれるものになります。

イロレーティングは元々チェスにおけるレーティング計算方法として
開発されたもので、今では将棋、囲碁、スポーツ、各種TVゲームなど
様々な対戦型ゲームにおいても応用され採用されています。

このイロレーティングは背景に統計学の理論があり、
「プレーヤーのパフォーマンス(結果的には勝率)は
正規分布】に従う」
という仮定を置いています。

正規分布とは、いわゆる「誤差」が発生する確率の分布を表したものです。
例えば、10回コイン投げをして表のでる回数を測定するとします。
表が出る確率は1/2なので5回になるのが一番起こりやすい結果ですが、
実際には4回、6回のように、5回を中心としてその周辺の回数になることもありえます。
充分に大きな回数試行を行い、出た回数を横軸に「0〜10の
発生しうる表の回数」、縦軸に「実際にその回数が出た数」をプロットすると、
それが正規分布のグラフになるのです。

blog_iro2.png

実際にエクセルで3000回の試行シミュレーションをしてみました。
正規分布のあの釣鐘の形になっていますね!


さて、今回のイロレーティングの話に戻ると、
プレーヤーのパフォーマンス(結果的には勝率)が正規分布に従うと仮定し、
そのパフォーマンスを予め数値化しておき、その差により勝ち・負けの発生する
確率(勝率)が推定できるように開発されたものが、
イロレーティングの計算式になります。

計算式は意外と簡単で、プログラム実装も簡単です。

プレーヤーA,Bの現在のレートをRa, Rbとしたとき、
次の計算式でそれぞれの勝率Ea, Ebを表すことができます。

Ea = 1/( 1+10^((Rb-Ra)/400) )
Eb = 1/( 1+10^((Ra-Rb)/400) )


blog_iro1.png
実際にこの式を用いて確率分布をグラフにしてみました。
平均0、分散300の正規分布の累積分布関数とほぼ一致するようです。



一試合行った後のレーティングの増減計算は、新たなレートをRa'とすると、

Ra' = Ra + K(Sa-Ea)

(Saは勝ち:1 負け:0 引き分け:0.5
Kはパラメータ定数で32や16が使われます。)

一試合ごとに各プレーヤーのレートを更新していけば、イロレーティングシステムの完成です。

参考までに、他のレーティングシステムも紹介しておきます。

TrueSkill: XboxLiveのランキングシステムで使われているもの

現実のサッカー界の国別ランキングにイロレーティングを適用したもの

こういった基本を理解した上で、自分の開発するゲームにも適切に応用できるように
したいですねexclamationそれでは。


posted by 管理人 at 17:03 | 日記