CCP想定シミュレーション
コメント
この記事ではコメントを受け付けていません。
この記事ではコメントを受け付けていません。
セプト部ポイント(CCP)は、カルドセプト部で行われた対戦から、参加者のおおよその実力の雰囲気を表すための数値です。
このページでは、現在検討している計算方式について、次の点を確認したシミュレーションをまとめます。
ここで示す数値は、将来のCCPを保証するものではありません。実際の対戦相手、参加人数、同順位、切断、作品環境などによって変わります。
CCPは、内部評価と公開表示を分ける二層構造を採用する予定です。
内部評価には、TrueSkill系の方式を使います。
参加者ごとに、次の二つの内部値を持ちます。
mu: 平均的な実力の推定値sigma: その推定がどの程度確かであるか対戦結果を処理する時は、自分の順位だけでなく、対戦相手のmuとsigmaも使います。そのため、同じ1位でも、格上の参加者に勝った場合と、格下の参加者に順当に勝った場合では変動量が異なります。
シミュレーションで使った正規化parameterは次のとおりです。
成熟後のCCPは、内部のmuから次の式で求めます。
成熟CCP = 1500 + 1135.1748 × mu内部値は丸めずに保持し、公開表示する時だけ整数へ丸めます。
内部評価を最初からそのまま表示すると、まだ数戦しかしていない参加者にも、大きく上下した不確かな数値が見えてしまいます。
そこで、公開CCPは0から始め、200戦までは徐々に増えていくように見える補正を加えます。
n = CCP対象となる確定対戦数
P = min(n, 200) / 200
M = その時点の成熟CCP
200戦未満:
表示CCP
= 1500 × (1 - (1 - P)^2)
+ (M - 1500) × P
200戦以上:
表示CCP = Mこの式では、0戦で表示0、200戦で成熟CCPと一致します。
200戦以降は、対戦数だけで増え続けません。対戦結果と対戦相手に応じて上下します。
200人の仮想参加者を、次の潜在的な4人戦1位率で分けました。
閉じた4人戦集団では、全員の実測1位率を平均すると必ず25%になります。
「20~25%が最も多い」「25~30%もそれに近い人数」「35~40%は200人中5人程度」という想定と、全体平均25%を両立させるため、この人数分布にしました。
各実力帯の平均表示CCPは、次のようになりました。
実力が低めの参加者でも、対戦を続けることで「1000 CCPを超える」という目標を持てます。
200戦に到達すると、おおむね本人の実力帯を反映した数値になります。そこから先は、参加するだけでは増えず、対戦結果に応じて変動します。
500戦後の参加者を、想定した実力帯ではなく、実際に記録された1位率で分類し直すと次のようになりました。
目標としていた次の関係を、おおむね再現できました。
25%付近: 1500
30%付近: 1700
35%付近: 1900
40%付近: 2100CCPは作品や対戦形式ごとに別の数値を作らず、一つの数値へまとめる予定です。
ただし、4人戦と2人戦をまったく同じ強さで反映すると、2人戦を多く遊ぶ参加者の変動が大きくなりすぎる可能性があります。そこで、現在の候補は次の反映量です。
TrueSkill系が計算した更新後の値をそのまま採用せず、更新前から更新後への変化をこの割合だけ適用します。不確実性の減少も同じ割合で補間します。
全対戦席の60%を4人戦、24%を3人戦、16%を2人戦として500戦しました。
混在時も、実力帯の順序は大きく崩れませんでした。
対戦ごとに相方と敵を変える2対2同盟戦を500戦しました。
潜在実力との相関は0.869、平均絶対差は107.9でした。
個人戦より精度が下がるのは、相方の実力と、その試合での相方のperformanceが本人の結果へ混ざるためです。それでも、実力帯ごとの上下関係はおおむね維持できました。
同盟戦では恒久的なチームratingを作らず、各参加者が個別のCCPを持ちます。そのMatchの中だけ2人をチームとして計算します。
全Matchの10%に同順位を発生させました。
同順位の参加者へ内部的な順序を付けず、同じrankとして入力した結果、潜在実力との相関は0.955、平均絶対差は55.0でした。
同着1位を単独勝利へ数えることはありませんが、下位参加者に勝った結果はTrueSkill系の内部評価へ反映できます。
arenaのフリー対戦では、アカウントを持たない非登録対戦者が参加する場合があります。
非登録対戦者は継続する人物identityを持たないため、各Matchで独立した標準的な参加者として扱います。
mu = 0
sigma = 2
成熟CCP相当 = 1500対戦後に非登録対戦者の更新値は保存しません。次の対戦へ自動的に同一人物として接続することもありません。
後から本人確認とアカウント登録が完了した場合は、本人に接続された正常終了対戦を本人のCCP履歴へ含めます。その時も、既存対戦相手の過去CCPを連鎖的に書き換えない予定です。
Event主催者が発行するゲスト参加者は、Event内で使える仮のアカウントを持ちます。
そのため、ゲスト参加者はMatchを跨いで内部評価を継続します。後から通常アカウントへ移行した場合は、ゲスト参加者としての対戦履歴と内部評価を引き継ぎます。
通常アカウント160人、ゲスト参加者20人、毎回独立した非登録対戦者20人を混ぜたシミュレーションでも、潜在実力との相関は約0.95でした。
ビギンズでは、参加者が切断するとCPUが同じ席を引き継ぎ、ゲーム自体は続きます。
残った参加者の順位を繰り上げると、ゲーム画面に表示された結果とCCP計算が食い違います。そこで、切断席を1500相当のCPU代理参加者へ置き換え、最終順位をそのまま計算へ使います。
オンライン・オフラインを問わず、次のように扱います。
CPUが1位になった場合、2位の人を1位へ繰り上げません。人間の単独勝利者は不在です。
オフラインでは、目の前で一緒に遊んでいる参加者が故意に切断する可能性は低いと考え、偶発的な事故として本人の評価から外します。
オンラインでは故意か事故かを判断できないため、本人は最下位として計算します。ただし、途中までしかプレイしていない結果なので、最下位として得た内部更新の反映量を0.25とします。
これは順位を「4分の1だけ最下位」にする意味ではありません。rankは明確に最下位のまま、平均値の変化と不確実性の減少だけを25%適用します。
全Matchの5%でオフライン切断が発生する強い条件を試しました。
1500相当が最も安定しました。
全Matchの1%でオンライン切断が発生する条件を3回ずつ試しました。
反映量1.0では、残った参加者へ切断者に対する勝利分を与えず、切断者だけが大きく下がるため、集団全体のCCPが下方向へ動きました。
反映量0.25なら、最下位としての扱いを維持しながら、集団平均のずれを小さくできます。
1人切断と2人切断の両方を試しました。2人切断を全Matchの1%で発生させても、潜在実力との相関は0.951でした。
同盟戦では、CPU代理を切断者が所属していたチームへ入れます。切断があるランダム同盟戦の相関は0.866で、切断のないランダム同盟戦の0.869とほぼ同程度でした。
切断せず残った人が1人以下の場合や、2人と2人に分裂して無効試合とした場合は、全員をCCP対象外にします。
TrueSkill系であっても、まったく対戦しない二つの集団の実力差を自動的に知ることはできません。
上位100人と下位100人が、お互いに一度も対戦しない条件です。
完全分離すると、上位集団にも下位集団にも「その集団内の平均」が存在するため、両方の平均が1500付近へ寄ってしまいます。
一方、全体の10%程度でも集団を跨ぐ対戦があれば、比較精度は大きく回復しました。
同じ相手との対戦をCCP対象外にする必要はありません。ただし、閉じた仲間内だけで遊んでいる場合、コミュニティ全体の中での比較精度は下がります。
これはCCPが絶対的な実力証明ではなく、対戦networkの中で得られる、おおよその雰囲気を示す数値である理由の一つです。
CCPは作品別・platform別に分けず、新作品が発売されてもresetしない予定です。
既存100人が300戦した後、同じ潜在実力分布を持つ新規100人を追加し、その後全員を混ぜて200戦しました。
全体の潜在実力との相関は0.934でした。
新規100人が加わっても、既存参加者の平均値はほとんど動きませんでした。新規参加者も、対戦を重ねることで既存の尺度へ接続できました。
この結果から、DS、3DS、リボルト、サーガ、ビギンズなどを跨ぐ一つのCCPとし、新作発売時にも継続する方針を維持できると考えています。
local独立test dataに保存されている代々木ビギンズの結果を、参加者名等を出さずに確認しました。
代々木ビギンズはオフライン対戦会なので、切断者本人はCCPと通常戦績から外し、切断席を1500相当のCPU代理参加者へ置き換えて残った参加者を評価しました。
一人あたり1~6戦なので、内部の成熟CCP推定はまだ大きく振れます。しかし、公開表示には200戦までの補正があるため、不確実な内部値をそのまま見せず、4~148という初期の数値に収まりました。
代々木ビギンズの正常終了結果をCCPの初期履歴へ含めることは可能です。
このページの結果は、次の前提を持つ参考値です。
実装後は、個人を特定できない集計を使って分布を確認し、必要ならparameterを見直します。