祭囃子は遠く、

祭囃子は遠く、

無職のハッピーエヴリディを書いていきます。

レーティングその1:最も単純なモデル

おはようございます。なんちゃって研究企画をやると前言ってて、その時は蟻がどうこうにしようと思ってたけど、色々調べてるとなんというかやる価値があまりなさそう(結構研究されてるのはいいとしても、自分でやれる範囲で展望が望めない的な意味で)

そして、昔からムカついていたぷよぷよ20thanniversaryのクソ&クソレーティングがなんでクソなのかとか、理想的なレーティングってなんだ、とか考えたくてこれにしました。(後は軽くサーベイしたけどそれっぽいのが出なかったのもある、でも多分適切な検索ワードじゃないだけ)

と言っても式とかから収束性を考える純数学は無理なので、お決まりの簡単プログラミングで、乱数引いてレート推移を覗く形に。全体を通してだけど、あくまでなんちゃってなので許して(懇願)

 

まず大きなところから書く。一貫(多分)して仮定する要素は以下

  1. 勝敗は実力でのみ決まる
  2. 実力はスカラーである
  3. 思いついたら書きます

1.は厳密な書き方ではなく、正確には実力で決まる確率で勝敗が決まる。

2.これは多少1とも被るけど、簡単に言うと戦術を考慮しないことに相当する。おそらく本当のゲームでは実力はある成分(ぷよなら凝視、中盤、連鎖力とか、、、直交はしてないだろうけど)を持ったベクトルの長さで決まっていて、実際の勝敗はこの成分同士の優劣や、大きさで決まりそう。

色々書いたけど言いたかったことは大体1に集約されてる。

 

さて、今回紹介するのは一番簡単なモデルの結果です。はっきり言って20thのレーティングよりクソです。ぶっちゃけデバッグの一環です。

今回の計算条件をまとめると

  • 実力:(0:1)の間の値を一様に乱数で振る。(現実では極値を持って、x=1付近で0に近くなりそう)

f:id:ta_ichi:20170207195512p:plain

  • 勝敗:勝率が以下の実力差(gap)の関数として線形で決まる。さらにその勝率の元で乱数を引いて勝敗を決める(全然関係ないけどこういう時の実力って英語でなんていうんだ、、、ability?capability?)

    f:id:ta_ichi:20170207211053p:plain

     

  • レート計算:ぷよぷよレート戦を想定して2本先取を設定し、本数に比例して線形に増減、幅は1勝につき+10(2本とれば+20、2本取られれば−20)また、初期レートは2000とした
  • マッチング:今回はレートに依らず同じ確率で誰とでも当たるようにした。 

  • その他:プレイ人数(以下N_p)は1000人、総ゲーム数(以下N_g)は300で計算

この条件のもとで計算。

①最強vs最弱たち

構成上申し訳ないが初めに純粋にデバッグ作業でしかないけど一人だけ実力を1にして他を0にして計算をする。

期待される結果→プレイヤー1のみ勝ち続け、レートは線形に増大。他は正確ではないが(プレイヤー1の存在のため)適正レートが初期レートで収束し、そこを軸としたランダムウォークをする。(勝率が半々なので)

①の結果

f:id:ta_ichi:20170207202507p:plain

 

まずプレイヤー1の結果、図のタイトルは前述の通り、図中の1.00~ってやつは実力の数値。期待通り負けることなく勝ち続ける。まるで僕みたいダァ

次は他の奴ら

f:id:ta_ichi:20170207202651p:plain

f:id:ta_ichi:20170207202708p:plain

だいたい大丈夫そう。余談でもあり、本質なのかもしれないけど、ランダムウォークにおいて平均値を軸として正負の領域を定めると、そのどちらかにいる確率というのは等価でない。調べれば無限に出てくるし、多分ランダムウォークの本とかにも絶対書いてあると思う。この設定において試合数が大きければ大きいほどその傾向は大きくなる。じゃあ適正レートってなんだ、どうやって調べるんだまぁ、、、適正レート(収束値)の定義はゆくゆく(?)・・・。もう誰か考えてください。(増減の期待値とかで決まるのかなぁ・・・)

 

今回のメイン計算

上でやったクソみたいな計算はどうでもよくて(デバッグ作業だから)純粋に上に書いた通りに計算する(さっきは実力値の振り方を変えた)

 

期待される振る舞い→レートがある領域に限られていないので強い奴らは正に発散、弱い奴らは負に発散する。(上(下)限が決められていないので一番強い奴は無限にレートが上がるから)中間は、、、どうだろうか、直感的には2000を平均としたランダムウォークしそう。

 

結果

まず強い人

f:id:ta_ichi:20170207204544p:plain

つよい(確信)

 

弱い人は

f:id:ta_ichi:20170207204711p:plain

もっと弱いやつになると

f:id:ta_ichi:20170207204748p:plain

うわあ・・・弱い。メンタルも弱いオタクなら死んでそう

 

中間はというと

f:id:ta_ichi:20170207204833p:plain

おお、これはどうだろうか・・・。とりあえず個人のレート平均値(平衡化を狙っているので計算上は総試合の半分以降から計算)とブレ(エラーに相当)は

2046.33333333333        7.11768793088599

そう試合数をもっと伸ばせばわかるかもしれないが、おおよそは2000付近と言ってもいいだろう。しかし厳密に0.5ではないので試合数無限で無限大に発散する気はする。その他の条件で発散が抑えられるのかも?わからん

f:id:ta_ichi:20170207205301p:plain

もう一人の中間の奴、平均とかは

2128.80000000000        3.12256304980336

これは(平均)計算の問題でもありそうだけどまぁこんなもんか・・・?

 

今回のまとめとか感想とか次回とか

今回の結果はメインの割と非自明(?)な中間実力者のレートの振る舞いくらいが収穫で、あとはデバッグ作業なのでまぁ、、、そうだよな?という結果しか得られなかった。あんまり解析計算は頭が悪いので出来てないけど、実力値とレートの関係はある程度のブレに対して安定な気がする。

今後は、というか明日にでも計算できるけど、まずレートキャップを取り付けてみてどうなるかを見てみる→レートの計算を非線形にする、くらいまでは考えている。レートの非線形な式はなんか妥当な奴を考え中。

また2月は中旬から忙しくなりそうだから次はわりとかかるかも?あと本当は乱数にメルセンヌツイスター使いたかった・・・。(初めて使うと想定外の動きするバグが怖い)