Hatena::ブログ(Diary)

でこすけの日記

2015-12-01

スプラトゥーンのウデマエ分布に関して

(この記事は、第2のドワンゴ Advent Calendar 2015の第一日目の記事です)

近年のweb業界で流行っている技術の一つがスプラトゥーンにおけるエイム技術なので、スプラトゥーンの話をします。スプラトゥーンとは何かというと、任天堂が作った可愛いイカ同士がじゃれあうピカチュウげんきでちゅうの後継ゲームです。ようするに、イカちゃんドリームランドです。イカちゃんたちがあまりにも可愛いので、ゲーム中のブキ選択は勝利シーンの可愛さで選ぶという方が大半だと思います。

f:id:Dekosuke:20151123173202j:image:w180

(図:異常に可愛いスピナーの勝利シーン)

不思議なことに、スプラトゥーンはゲームのジャンルでいうとサードパーソンシューティングTPS)に属します。ようするに、自分の操作するイカちゃんがインクを相手に当てたり当てられたりするのを後ろから生暖かい視線で見守るゲームです。

f:id:Dekosuke:20151123174726p:image:w180

(図:シューティングゲームに関する一般的な見解)

もちろん、皆様もご存じの通りシューティングゲームは遊びではありません(上図)。

イカたちの住むハイカラシティにおいてはイカにして相手をキルするかを四六時中考えているシリアルキラーのようなイカたちが一定割合で存在し、ガチマッチと呼ばれるサツバツバトルが日夜行われております。

ガチマッチにおいては、棒立ちで射撃をしているようなニュービー・イカニンジャは3秒とたたず海の藻屑となってしまうことでしょう。

FPSをはじめとした対戦ゲームにおいては、個人の実力が存在します。ゲームの強いイカと弱いイカです。強いイカ同士や弱いイカ同士でマッチングしたほうが実力が伯仲して面白いので、イカの強さを測るための目安が必要です。

というわけで、本日はスプラトゥーンのウデマエ(レーティング)の話をします。

レーティングとは

レーティングは、実力をはかる物差しのようなものです。勝敗を予測するために、各プレイヤーに強さの数字を割り当てます。もちろん、勝負には相性や調子などもあるのですが、そういうのを細かく考慮していたらキリがないので、そこらへんはレーティングでは普通考慮しません。

スプラトゥーンのウデマエ

スプラトゥーンのウデマエは、ゲーム内のガチマッチにおけるレーティングシステムです。このレーティングシステムでは、プレイヤーの分身であるイカは開始時に最低クラスであるC-から始まり、最高クラスであるS+を目指すことになります。

f:id:Dekosuke:20151123190933p:image:w180

(図:最高クラスであるS+プレイヤーの例)

ガチマッチでは、8人のプレイヤーが4人ずつの2チームに分かれ、一定のルールの元に勝敗を争います。勝利するとプレイヤーの持つポイントが増え、敗北するとポイントを失います。ポイントが100以上になると上のクラスへ昇格し、0より低くなると下のクラスへ降格します。以下の図がレーティングの増減になります。4人チームの構成によっては貰えるポイントがここから微妙に増えたり減ったりします(強い相手に勝つとポイントが多く貰えるなど)。

クラス勝利敗北
C-+20-10
C+15-10
C++12-10
B-+12-10
B+10-10
B++10-10
A-+10-10
A+10-10
A++10-10
S+4-5
S++3-5

(表:勝利時・敗北時に貰えるポイントの変化。実際は各クラス内でも現有ポイントによって0-39, 40-79, 80-99の3段階に分かれたウデマエ増減システムのようですが、この図では簡単のため省略します。)

C-からB-の位置づけ

C-からB-はニュービー・イカの助走ゾーンとなっています。この期間では、敗北時に失うポイントは10ポイントですが、勝利時に貰えるポイントが10より大きく設定されています。そのため、ある程度戦えるようになれば、この区間は可及的速やかに抜けられるようになっています。

この仕様は個人的には悪くないと思います。

f:id:Dekosuke:20151124005905p:image:w180

(図:ニュービ―・イカの例)

レーティング分布

ちょっと前にイカのようなツイートをしました。

関連したツイートを色々していたのですが、そこらへんの考えが自分の中で結構クリアになったので、現時点でのこのウデマエシステムに関する特徴をまとめてみようと思います。

ウデマエシステムの特徴

ウデマエシステムでは

  1. プレイヤーのクラスをC-からS+の11段階に分けている
  2. それぞれのクラスに一定期間在籍するために、昇格時には次クラス30から開始、降格時には前クラス70から開始

という特徴があります。任天堂がキッズが安心して遊べるために便利なシステムを考えだした、と言えば聞こえは良いのですが、関連してマッチング精度を悪化させるいくつかの問題点があると私は考えます。

問題点

ウデマエシステムには、少なくても以下の3点の問題点があります。

  1. ポイントの和がゼロサムゲームでないこと:クラス昇格時に隠れたボーナスがあります。
  2. 所持ポイント1-39, 40-79, 80-99の間での差:上表では省略しましたが、同じクラスでも1-39では勝ったときに多くポイントが貰えたり、80-99では負けたときにあまりポイントが貰えない補正があります。
  3. クラスS以降のポイント増減が少なく、S以降の実質的な区間幅が大きい点

これらの3点についてそれぞれ説明してゆきます。

問題点1:隠れボーナス

以下の2つの隠れボーナスがあります。

  1. 0ボーナス
  2. A+→Sボーナス

0ボーナスは、ポイントが0になってもクラス降格しないことから生じます。例えば、現在のクラスがBの70だとして、3連勝すると昇格してB+の30になりますが、そのあと3連敗してもB+の0となりギリギリ降格せず、もう一度負けてやっと降格しBの70に戻ります。これを繰り返すとびっくり、3勝4敗でもポイントが維持できてしまいます。その間に自分に勝ったプレイヤーのポイントは上昇しているため、全プレイヤーでの持ちポイントの合計がプラスになります。

A+→Sボーナスは、A+までのクラスと比較して、Sクラスのポイントの増減が少ないことから生じます。A+までは原則勝ち負けでポイントが10増減しますが、Sではポイントが5しか変動しなくなります。例えば、現在のクラスがA+の70だとして、3連勝すると昇格してSの30になりますが、そのあと7連敗してやっとA+の70に戻ります。こちらはさらにびっくり、なんと勝率3割でポイントが維持できます。

問題点2:所持ポイント1-39, 40-79, 80-99の間での差

上のポイント増減表では各クラスでのポイントの増減は固定と書きましたが、実際は同じクラスでも所持ポイントが低いときはポイントが増加しやすく、高いときはポイントが増加しにくい仕様になっています。実際のポイント増減に関して任天堂は仕様を公表していない為、あくまでも予想なのですが、stat.inkのログや自分の体感をもとに、ポイント増減は以下の表で考えるとします。

クラス勝利敗北
(BからA+)ポイント1-39+12-8
(BからA+)ポイント40-79+10-10
(BからA+)ポイント80-99+8-12
S ポイント1-39+5-5
S ポイント40-79+4-5
S ポイント80-99+4-6
S+ ポイント1-39+4-4
S+ ポイント40-79+3-5
S+ ポイント80-99+2-5

この結果として、A+上位では6割7分勝たないとポイントが維持できないのに、S下位だと5割で現状維持できたりします。

問題点3:クラスSでのポイント増減の減少

クラスS以降では、勝敗でのポイントの増減が他の区間の半分程度になります。

で、これは何が起きているかというと、実質的にクラスSは他の区間の倍の長さがあるということになります。

f:id:Dekosuke:20151127000812p:image:w280

(図:レート増減がだんだん小さくなる場合の実質的な区間幅のイメージ)

ウデマエの平衡分布

というわけで、これらを考慮に入れてプレイヤーのウデマエの平衡分布のシミュレーションを行ってみましょう。もちろん全プレイヤーの実力を考慮に入れるのは大変難しいため、簡単のために全勝負の結果を50:50と仮定します。また、プレイヤーは十分たくさんガチマッチを行うものとします。

というわけで、1000人のサンプルプレイヤーでのウデマエのシミュレーションは以下になります。ソースコードこのURLにあります。

f:id:Dekosuke:20151124003950p:image:w280

(図:プレイヤー1000人でのウデマエ分布。縦軸はパーセンテージ)

半分近いプレイヤーがS帯、7割以上がA+以上という結果になります。S帯に行ってちょうど真ん中ぐらいといったところです。言い換えると、だいたいのプレイヤーはA+からSにいるので、11段階のプレイヤーのクラス分けは実際のところプレイヤーの実力を示す役割を果たせていないことになります。

もちろん、上のシミュレーションはプレイヤーがたくさんマッチングを行ったときの平衡分布ですし、プレイヤーのウデマエのばらつきを考慮していないため実際のアクティブプレイヤーのウデマエの分布とは異なると思います。しかし、多くのプレイヤーがS付近に集まるという性質はどうやらあるようです(問題点1のA+→Sゲインが最も効いています)。また、裏付ける証拠の一つとして、(参加バイアスもありますが)イカナカマスプラトゥーンの非公式コミュニティサイト)での実力の平均はA+からSです。

結局、何が困るのか

問題点があってもいいじゃん、所詮お遊びなんだから?という意見もあるかもしれません。また、ウデマエシステムはプレイヤーに達成感を与えるのが目的なため、現行のたくさんプレイすれば半分ぐらいのユーザがクラスSになれるようなシステムが望ましいのだ、という反論は考えられます。

しかし、一応「ウデマエ」という名前で値が割り振られているということから、プレイヤーの実力を反映した数値を割り振るのがあるべき道だと考えられます。また、マッチングの精度が下がるということは大きな問題です。というのは、実力を正しく測れないことにより、ワンサイドゲームが増えたり、ウデマエを信じられなくなるからです。結果として、実力伯仲したゲームがプレイできた場合と比べて、プレイヤーの幸福感(効用)が下がることになります。「クラスSが味方に来てくれたのにこの惨敗っぷりは何なの?」みたいなことが起きる割合を減らすためにも、レーティングシステムをもう少し真剣に考えるのも良いのではないでしょうか。

改善案

文句を言うだけなのは良くないため、いくつかの改善案を提案します。

  • 0ボーナスの除去:所持ポイントがちょうど0になったら降格にします
  • A+→Sボーナスの除去:A+からSに上がった場合のポイント初期値を15にします
  • 1-39でポイントが下がりにくい、80-99でポイントが上がりにくい現象を除去します

最初の2点は問題点1へ、3点目は問題点2への対処です。問題点3についてはこの案では対処していません。

改善案のシミュレーション

改善案を考慮した場合のシミュレーション結果は以下になります。

f:id:Dekosuke:20151124003948p:image:w280

(図:プレイヤー1000人でのウデマエ分布(改善版)。縦軸はパーセンテージ)

元の分布と異なり、クラスBからSにかけてプレイヤーが均等に分布していることが分かります。クラスSの人口が大きいのは問題点3を解決していないためだと考えられます。この問題を解決するためには、Sでのポイント増減を倍にすれば良いと思われます。

S+の人口が極端に少ない点は変わっていませんが、これは全プレイヤーの勝率が5割と仮定した場合なので、実際はコンスタントに勝ち続けるプレイヤーは一定数いるはずですので、もう少しS+のユーザは大きくなるはずです。

その他:ウデマエのローカル保存

サーバ側でデータを管理する多くのオンラインゲームと異なり、スプラトゥーンのウデマエはローカルストレージに保存されています。また、Wii UのデータをUSBドライブにバックアップすることが可能なため、負けたときにはデータをバックアップから復帰させれば、勝ったときの記録だけ残すことが可能になります。そのため、負けたプレイヤーがバックアップからの復帰を行った場合、勝ったプレイヤーのポイントのみが上昇するので、プレイヤーの総ウデマエがゼロサムではなくなり、プレイヤーのウデマエが上側に押し上げられます。この仕様が任天堂の意図したものなのかどうかは不明ですが・・・

さいごに

色々文句を言いましたが、ゲームを楽しみましょう。エンジョイ&エキサイティング!

参考

Eloレーティングシステム:https://en.wikipedia.org/wiki/Elo_rating_system

コロコロ公式サイト(スプラトゥーンのコミック):http://www.corocoro.tv/tachiyomi/splatoon/

イカナカマ:http://ikazok.net/

stat.inkhttps://stat.ink/

ウデマエポイントの計算方法の変更(S,S+のポイント増減):http://www.nintendo.co.jp/wiiu/agmj/update/index_220.html#spa_anchor_05

Evaluating Splatoon's Ranking System(ウデマエがA+までの時代の話ですが、この記事の問題提起のかなりの割合はここから来ています):http://www.evanmiller.org/evaluating-splatoons-ranking-system.html

2012-07-22 HaskellのSystem.Random

Haskell乱数生成関数getStdRandomは、Global Random Generator (GRG)の値を書き換えるためIOになる。GRGはSystem.RandomにtheStdGenという名前で定義されていて、グローバル変数 (IORef)である。GRGに頼らないで自前のRandom Number Generatorを使うこともできる。

つまり

--IOで乱数を取る(Global Random Generatorを読んで書き換える)
rollDice :: IO Int
rollDice = getStdRandom (randomR (1,6))

--自前のRandom Number Generatorを与えると、IO無しで書ける
gen = mkStdGen <ここに適当なseed値>

--1個だけ変数を取る
(fst (random gen))::Int

--10個変数を取る
getRands :: Random a => Int -> StdGen -> [a]
getRands 0 _ = []
getRands x gen =     
  v : getRands (x-1) gen'
  where (v, gen') = random gen 

((getRands 10 gen)::[Int])

2012-02-18 さいきん

”The Little Redis Book”の翻訳を少しずつやってる。

2012-01-20 Winning from losing

ウソには3種類ある。ウソ、みえすいたウソ、そして統計

というわけで数字を扱うにはいろいろなトリックがあるのですが、この問題が面白かったので考えてみました。

http://chrisladroue.com/2012/01/winning-from-losing/

翻訳すると、

  • ゲーム1: 0.49の確率で1ポイント獲得、0.51の確率で1ポイントを失う
  • ゲーム2: 現在のポイントが3の倍数なら、確率0.095で1ポイント獲得、確率0.905で1ポイントを失うゲームを行う。3の倍数でないなら、確率0.745で1ポイント獲得、確率0.255で1ポイントを失うゲームを行う
  • ゲーム3: 毎回コインを振り、表が出たらゲーム1、裏が出たらゲーム2を行う
  • それぞれのゲームは1000ステップ行い、最後ステップ終了時のポイントを得点とする。

ゲーム1とゲーム2は平均すると負ける*1のに、その2つを半分ずつ合わせたゲーム3は平均すると勝てます*2。つまり、勝てないゲームを2つあわせると勝てるゲームになるのです。

なぜでしょう?

*1平均値が負のポイント

*2平均値が正のポイント

2012-01-10 Rで単純ベイズ

全ての人間は二つに分けられる

何事も分類するのは人類の常、幸せになるための方法ということで、データを分類するのは非常に有用です。そして計算機でデータを分類するためのもっとも簡単なモデルは、単純ベイズモデルです。このモデルでは分類に対するデータの影響を全部独立と仮定します。

と、まあそれは置いておいて・・


Rで単純ベイズを使うためには、id:kosugittiさんのベイズな予測にあるように、package:e1071を使うのが一番楽みたいですね

このnaiveBayes関数はデータが正規分布に従うと仮定されているのだけど、もっと一般な分布に対してはどうすればいいのでしょう。まあ単純ベイズぐらいだったら自分で書けという話かもしれないですね


Rのpackageの探し方が知りたいです。今は適当にgoogleで検索しているけど、有名なアルゴリズムに対して、「このアルゴリズムはこのpackageを使うのが定番」みたいなものはどうやって見つけるのでしょう