World Ranking Algorithm (JP)

De Bayoen ! (wiki)
Version du 2 janvier 2020 à 20:38 par Hiku (discuter | contributions)

(diff) ← Version précédente | Voir la version courante (diff) | Version suivante → (diff)

このページは、世界ランキングのアルゴリズムを説明します。

このアルゴリズムは全く自分が作ったのです。

アルゴリズムでよく使う用語:AとBが50先取で、スコアは A 50 - 23 B とします。ならばAとBは一つの“マッチ(match)”をしました。そのマッチの“ポイント(point)”は 50 + 23 = 73 点です。

ポイントを分ける

このアルゴリズムは、プレイヤーの総合ポイントを分けます。

プレイヤーの総合ポイントが3000点越えれば、ポイントは2000点ぐらいのグループたちに分けられます。

例えばあるプレイヤーの総合ポイントが6000点とします。これらの点数は、三つのグループに分かられます。

そしてプログラムは、毎グループのポイントを“異なるプレイヤーが持っている”と考えています(同じプレイヤーではありません!)。

結果として、最も新しいのグループから導出したレート(中間レート、下界レート、上界レート)がランキングに出ます。ですから、ランキングで見たレートはプレイヤーの最新レベルと考えられます。

中間レートの導出

中間レートは、プレイヤーの“平均レベル”です。この段落は、中間レートの導出方法を説明します。

以下この段落で、中間レートを“レート”で略書きます。

まず、アルゴリズムの最初時点で、毎プレイヤーはレート1.0とします。そしてアルゴリズムは、総回数50000回のループに入ります。ループが終わった後、毎プレイヤーのレートの導出は完成です。

ループの毎回は、すべてのマッチを一つずつ考えます(一番古いから一番新しいまで)。毎マッチの結果によって、対戦両方のレートが変わっていきます。

大まかに言えば、プレイヤーの表現が予期より良ければ、レートが上がります、その相手も同じ量でレート下がります。そして試合が近く程と相手のレートが高くなら高く程、勝つプレイヤーのレートが低くなら低く程レート上がります。すべてのマッチを考えた後、次回のループに入ります。

では次は、マッチの結果からレートの変わる公式を述べます。

対戦両方をAとBとします。なお、二人のレートもAとBで表記します。二人の試合取った本数をスコアA、スコアBとします。

deltaを

delta=(sqrt(B/A) * スコアA - sqrt(A/B) * スコアB) * 重要係数

とします(sqrt(x)はxの平方根)。ここにおいて重要係数は、試合の重要性を計算した値です。重要係数は、時間係数とレベル係数の関数であります:

重要係数 = 時間係数 * レベル係数 / 1000

ここにおいて、

時間係数 = 1/((マッチの経った年数)^2+1)

ですから新しいマッチの時間係数は1に近づく、古いマッチの時間係数は0に近づきます。一方、レベル係数は

レベル係数 = A/BとB/Aの小さい方

と定義します。ですから両方のレートが近くなら、近くほどレベル係数は1に近づ、両方のレートが遠くなら、遠くほどレベル係数は0に近づきます。

この二つの係数から、重要係数、そしてdeltaを計算できます。もしdeltaが正数であれば、AとBのマッチ後レートは

A ✕ (1 + delta)、B / (1 + delta)

とします。一方もしdeltaが非正数であれば、AとBのマッチ後レートは

A / (1 - delta)、B * (1 – delta)

とします。

ここで一つ実際例で説明します。

仮にAのレートを0.8で、Bのレートを1.6とします。そして一年前に二人は20本先取しました。マッチのスコアを A 15 - 20 B とします。ですからA/B = 0.5、B/A = 2。マッチの重要係数は

重要係数 = 1/(1^2+1) * 1/2 * (1 / 1000) = 1/2 * 1/2 * (1 / 1000)

そしてdeltaは

delta = (sqrt(2) * 15 - sqrt(1/2) * 20) * 重要係数 ≒ 7.07 * 1.2 * 1.2 * (1/1000) = 0.001768

ですからAのマッチ後レートは

0.8 * (1 + 0.001768) = 0.80141

で、Bのマッチ後レートは

1.6 / (1 + 0.001768) = 1.5971

です。

下界レートと上界レートの導出

下界レートと上界レートは、中間レートから導出します。その定義は

下界レート = 中間レート / (1 + C)

上界レート = 中間レート * (1 + C)

これら二つのレートは、プレイヤーのレベルの上下界を概算するレートです。概算の方法は、プレイヤーの対戦経験からCの値を導出するのです。

Cは、プレイヤーのレートが“どの程度まで正しい”を概算する値です。Cが低くなら、低くほどレートは正しいと思われます。Cの数学定義は

C = 0.6 / (c^1.2)

ここにおいて小文字のcは、

c = あるプレイヤーが他のプレイヤーとの“対戦強度”の総合

です。大文字のCと違い、小文字のcが高くなら高くほどレートは正しいと思われます。

プレイヤー間の対戦強度は、以下の通りで定義されます:

AとBの対戦強度 = 1と(sqrt(AとBの対戦総合マッチ強度)/10)の小さい方

そして毎マッチの強度は、重要係数 * マッチのポイントで定義されます。こちらの重要係数は、中間レートで使った重要係数と同じです。

一つ実際例で説明します。仮りにプレイヤーAのレートを2.0とします。プレイヤーAは、プレイヤーBとプレイヤーCと対戦したことあります。そしてAはB、C以外に他のプレイヤーと対戦したことありません。

ならば前記の公式で、Aと他のプレイヤーの対戦強度は0のことがわかります。ですからcを計算するために、AとBの対戦強度と、AとCの対戦強度を計算すればいいです。

例えばAとBの総マッチ数は一回とします。そのマッチの重要係数は0.4で、マッチのポイントは25とします。ですから

AとBの対戦総合マッチ強度 = 0.4 * 25 = 10

それで

AとBの対戦強度 = 1と(sqrt(10)/10)の小さい方 ≒ 0.316

です。一方AとCの総マッチ数も一回とします。そのマッチの重要係数は0.7で、マッチのポイントは43とします。ならば同じく AとCの対戦強度 ≒ 0.549

と計算できます。

ですからAに対して小文字のcの値は

c = Aが他のプレイヤーとの”対戦強度”の総合 ≒ 0.316 + 0.549 = 0.865

それで

C = 0.6 / (c^1.2) ≒ 0.6 / (0.865^1.2) = 0.714

です。最後に

Aの下界レート = 2.0 / (1 + 0.714) = 1.167

Aの上界レート = 2.0 * (1 + 0.714) = 3.428

です。


ランキングに出るレート

ランキングでは、プレイヤーの三つのレートを表示しますが、順位基準は下界レートです。下界レートを選ぶ原因は、ポイントが少ないプレイヤーが幸運や一時の好調で高レートを取るかもしれませんです。もっといいランクが欲しいなら、もっとマッチをしましょう。

何か国の誤植やプレイヤーの重複を見つけたら、ツイッターでHikuを連絡してください!