SPSP 理論編 1: 概念
順位評価・直対評価・総合評価のアルゴリズムを言葉で説明する。 厳密な検証は 評価、数式は 数式 を参照。
1. 直対評価の仕組み
直対評価はスマメイトのようなレーティングと同じ系統で、 試合の勝敗ごとに両プレイヤーのレートを更新する。
1.1 「期待勝率」と「実結果」のズレを反映
両者のレートから 期待勝率 を算出し、実結果とのズレを見て、ズレた分だけレートを動かす。
- 期待通りに格上が勝った → 格上は少しだけ上がる、格下は少しだけ下がる
- 格上が負けた (アップセット) → 格上は多めに下がる、勝った格下は多めに上がる
- 差が小さいカードで格上が勝った → 両者の動きは中くらい
つまり「強い相手に勝てば大きく上がる、格下に勝っても小幅、格下に負けると痛い」。 総当たりしなくてもランダムな試合を積み重ねるだけで正しい序列に収束していく。
SPSP は Glicko2 を採用。Elo に「不確実性 (RD)」と「変動性 (volatility)」を加えたモデルで、 Elo より収束が速く覚醒選手の追従が良い。
1.2 不確実性 (RD)
Glicko2 はレートに加えて RD (Rating Deviation、不確実性) をプレイヤーごとに持つ。 RD が大きいほど 1 試合の結果でレートが大きく動く。
- 新規プレイヤー: RD 大 → 1 試合で大きく動き、本来の位置に駆け上がる/下がる
- ベテラン: RD 小 → 1 試合では少ししか動かない
- 新規 vs ベテラン: 新規側は大きく動き、ベテラン側はあまり動かない
1.3 復帰加算 (長期離脱者の RD を膨らませる)
長期間試合をしていないプレイヤーは復帰時の本当の実力が分からない。 そこで一定期間出ていないプレイヤーは RD を膨らませて、復帰戦の結果がより柔軟にレートへ反映されるようにする。
- 30 日以内: 何もしない
- 1.5 年経過頃: RD が現状値と上限 128 のちょうど中間まで上昇
- 2 年以上: RD が上限 128 付近に漸近
増加カーブは sigmoid で滑らか。RD を下げる方向には作用しない。
2. レベルシステム
SPSP は LV1〜LV5 の 5 段階のレベルを持ち、順位評価と直対評価がこの同じレベルシステムを共有する。 プレイヤーは自分が到達した最高 Lv のスコアでランクづけされる。 Lv が上がるにつれて対象大会が厳しくなり、上位帯では本気度の高い大会だけで評価される。
2.1 LV ごとの対象大会
プレイヤーの現 LV により、直対評価の学習対象 (と順位評価の集計対象) が変わる:
- LV1 (全プレイヤー): 参加者 5 名以上
- LV2 (Top 2048): 参加者 9 名以上
- LV3 (Top 1024): 参加者 25 名以上 + 休日
- LV4 (Top 512): 参加者 33 名以上 + 休日
- LV5 (Top 256): 参加者 49 名以上 + 休日
2.2 なぜ上位帯ほど制限を厳しく?
上位プレイヤーは平日のスマコミ・スマパなどで「ガチ大会前の練習」「キャラ調整」目的で参加することが多く、 本来の実力どおりの結果が出ないことが多い。こうした試合を上位プレイヤーのレートに反映すると、本気の試合のレートが歪む。 休日大会は参加者がスケジュールを空けて本気で出ているので、実力差が結果に出やすい。
また小規模大会は母集団が偏りやすくノイズが大きいので、上位帯ほど参加者数しきい値を厳しくする。
2.3 カスケードの流れ
LV は順位評価の 5 段階の絞り込み計算 (= カスケード) で決まる。 各段で順位評価のスコアを計算し、上位 N 名だけを次の Lv の母集団に残す:
- Lv1: 全プレイヤー、参加者 5 名以上 → 上位 2048 名を抽出
- Lv2: 上位 2048 名、参加者 9 名以上 → 上位 1024 名を抽出
- Lv3: 上位 1024 名、参加者 25 名以上 + 休日 → 上位 512 名を抽出
- Lv4: 上位 512 名、参加者 33 名以上 + 休日 → 上位 256 名を抽出
- Lv5: 上位 256 名、参加者 49 名以上 + 休日
各段の昇格判定は、順位評価のランクと直対評価のランクを平均したもので行う (= ランク平均カスケード)。 片方だけ突出するプレイヤーよりも、両方バランス良く高いプレイヤーが昇格しやすい。
2.4 「混在」する試合の扱い
LV が違うプレイヤー同士で「片方は学習対象、もう片方は対象外」の大会で当たった場合は、 学習対象側だけがレートを更新する。 たとえば LV1 と LV4 のプレイヤーが平日大会で当たれば、LV1 側だけ動き、LV4 側は据え置き。
2.5 DQ (棄権) の扱い
DQ となったプレイヤーの試合・順位はスコア計算から除外する。プレイヤーページの大会履歴では SPR の代わりに DQ と表示される。
実装上、DQ 判定は 2 種類。
(1) 途中 DQ: start.gg の試合データで dq=True が立っている試合。
その試合は直対評価の学習や順位評価の計算から取り除かれ、敗者がその大会で DQ 認定される。
(2) no-show DQ: 大会の試合データはあるのに、参加者一覧に名前があるプレイヤーが 1 試合も記録されていない場合 (wins = 0 かつ losses = 0、placement > 2 が条件)。
データ欠損による誤判定を避けるための保守的な判定。
メイン + クラスブラケット構成の大会では、メイン側と class 側の DQ をそれぞれ別に記録する。
3. 順位評価の核心アイデア
順位評価は、各大会の最終順位をベースにポイントを配るが、固定の配点テーブルは使わない。 その大会の参加者の強さに応じて配点を動的に決める。
- 見るのは 大会の規模・参加者層の厚さ・自分の最終順位 だけ。対戦相手は見ない。
- 各順位の配点は 大会開始前に決まる。実際の勝ち上がり方とは独立。
- 同じ大会で同じ最終順位なら、誰でも同じポイント。
3.1 順位 = 敗者復活で何ラウンド勝ち上がったか
SPSP は大会の順位を 敗者復活ブラケットの構造に当てはめて解釈する。 優勝者は全ラウンド勝ち抜け、最下位はラウンドゼロで終わり。
- 1 位 = 全ラウンドを勝ち抜けた
- 3 位 = 残り 2 ラウンドで負けた
- 最下位 = ラウンド 1 で即敗退
最終順位を聞けば「どのラウンドまで勝ち上がったか」が機械的に決まる。 実際にダブルエリミでなくても、シングルエリミ・スイス・リーグでも最終順位を敗者復活ブラケットに換算できる。
3.2 ラウンドの難しさ = そのラウンドの場の強さ
各ラウンドの難しさは、仮想ダブルイリミの敗者ブラケットに参加者をシード順に並べて、 そのラウンドに居る 相手 1 人ずつに勝つことの価値を平均したもので測る。 強い相手で構成されるラウンドほど難しさが大きい。 実際の大会の進行は見ない。シードどおりに進めば居るはずの参加者だけで、大会開始前にラウンドの難しさを確定させる。
8 人ダブルイリミの敗者ブラケットを模式化すると下のようになる (5 ラウンド構造):
各ラウンドの「場」には、そのラウンドで敗退する人とそこを勝ち抜けて次のラウンドへ進む人の両方が含まれる。 場にいる相手それぞれに勝つことの価値を平均することで、そのラウンドの難しさを表現する。
- 序盤: 下位シード中心 → 各相手に勝つ価値が低い → 難しさ低め
- 中盤: 中堅シードが集まる → 価値が中くらい
- 終盤: 上位シードだけ残る → 各相手に勝つ価値が高い → 難しさ高め
「強い相手だらけのラウンドを勝ち抜けた = 1 試合あたりの価値が高い」がポイントに反映される。
厳密には、各相手に勝つことの情報量 ($-\log_2(1-g)$、g = Elo の勝率) の平均をラウンドの難しさとして使う。 厳密な定義は 数式編 §3。
3.3 大会のポイント = 勝ち上がったラウンドの難しさの合計
ラウンド k まで勝ち上がったプレイヤーが大会で稼ぐポイントは、ラウンド 1 から k までの難しさポイントの合計。 上位入賞ほど合計が大きい。強豪が集まる大会のほうがラウンドの難しさが大きくなる。
さらに 大会規模が大きいほどポイントがスケール される。 具体的には、参加者数 $n$ のとき $\sqrt{\log_2 n}$ 倍 (= 8 人で約 ×1.7、32 人で約 ×2.2、128 人で約 ×2.6、512 人で約 ×3.0、2000 人で約 ×3.3)。 たとえば 30 人規模の大会と 2000 人規模の大会では、同じラウンドぶん勝ち抜いても約 1.5 倍のポイント差がつく。
3.4 具体例 (8 人の大会)
架空の 8 人大会で順位評価のポイントがどう決まるかを見てみる。各ラウンドに居る相手 1 人ずつに勝つことの価値を平均したものが、場の強さ (= ラウンドの難しさ):
| ラウンド | 場にいるシード | 場の強さ (= ラウンドの難しさ) |
|---|---|---|
| Round 1 | 5・6・7・8 位シード | 低 (0.2) |
| Round 2 | 3〜6 位シード | 中 (0.6) |
| Round 3 | 3・4 位シード | 高め (0.8) |
| Round 4 (LB Final) | 2・3 位シード | 高 (0.9) |
| Round 5 (Grand Final) | 1・2 位シード | 高 (1.0) |
プレイヤーは 自分が勝ち上がったラウンドぶんの難しさを足し合わせる:
| 最終順位 | 稼ぐラウンド | 合計ポイント |
|---|---|---|
| 1 位 | R1 + R2 + R3 + R4 + R5 | 0.2 + 0.6 + 0.8 + 0.9 + 1.0 = 3.5 |
| 2 位 | R1 + R2 + R3 + R4 | 0.2 + 0.6 + 0.8 + 0.9 = 2.5 |
| 3 位 | R1 + R2 + R3 | 0.2 + 0.6 + 0.8 = 1.6 |
| 4 位 | R1 + R2 | 0.2 + 0.6 = 0.8 |
| 5・6 位 | R1 のみ | 0.2 |
| 7・8 位 | なし | 0 |
上位ほど大きく稼ぐ階段ができ、その段差は 大会の参加者層の厚さ で決まる。 強豪が集まる大会では各ラウンドの難しさが上がり、上位ほど大きく稼げる。
3.5 Lv ごとに基準値を変える
Elo 系の「勝った時のレート増加量」は、両者のレートが大きく離れると差が飽和して見えなくなる。 上位帯にとって格下相手はほぼ 0、格上相手はほぼ満額に張り付く。
SPSP は自分側のレートを Lv ごとの固定値で評価するが、固定値を一通りにすると中堅層と上位層のどちらかの解像度が潰れる:
- 低めに置くと、中堅層は見えるが上位帯の細かい違いが見えない。
- 高めに置くと、上位帯は見えるが中堅層の差が出ない。
そこで Lv ごとに基準値を変える。Lv1 は広い層向けの中庸設定 (基準 1700)、Lv2 以降は上位帯向けに上げる (基準 1900)。 これにより、ピラミッドのどの段にいるプレイヤーも自分の帯に合った解像度で評価される。
あわせて Lv ごとに 勝利ポイントの最低保証 も変える (Lv1: 350、Lv2 以降: 700)。 どんなにレートの低い相手でも、この値のレートを持つ相手に勝った場合と同じ最低限の勝利ポイントは保証される。 極端にレートの低い相手が場の難しさを過剰に下げないための仕組み。
3.6 自己強化を防ぐ
放っておくと、各大会の最強プレイヤーが他より高い点数を稼ぎやすい偏りが出る。 場の難しさを参加者の平均レートで計算しているため、自分の高いレートが場の難しさを引き上げて自分のポイントも持ち上げる自己強化が起きる。 実際に 1 位を取った人ほど影響を受けやすい。
たとえばあcola選手が優勝する大会では、ラウンドの難しさにあcola選手自身のレートが含まれて、 「あcola選手があcola選手に勝った」かのようにポイントが膨らんでしまう。
そこで場の難しさを計算するとき、出場者の中で一番レートが高い人を場にいなかったものとして扱う。 あcola選手の大会では、あcola選手を除いた残りの参加者層で難しさが決まる。 全プレイヤーが同じ「最強除外後」の場で計算されるので、「同じ大会の同じ順位なら同じポイント」は保たれる。
別案として「各プレイヤーが計算するとき自分自身を場から外す」方式も検証したが、精度はほぼ同じで、 同じ大会の同じ順位でも人によってポイントが変わってしまうため採用しなかった。
4. 集計の重みづけ
プレイヤーの最終スコアは、出場した全大会のポイントを 2 種類の重みを掛けて足したもの。
4.1 時間減衰
毎月およそ 4% 減衰する。半年前のポイントは約 78%、1 年前は約 61%、2 年前は約 38%。
4.2 位置減衰 (上位 3 件はそのまま、4 件目以降は減衰)
プレイヤーの大会ポイントを時間減衰後の値で多い順にソートし、上位 3 件 (Lv1 は上位 1 件) はそのまま、4 件目以降は 0.3, 0.09, 0.027, ... と急激に減衰させてから足す。
たとえば 100 pt の大会も 4 件目なら 30 pt、5 件目なら 9 pt、6 件目なら 3 pt になる。 短期間に強い結果を集中させた人のほうが、薄い結果を長期間続けた人より評価される。
5. 総合評価 (順位評価 + 直対評価)
総合評価は順位評価のランクと直対評価のランクの単純平均。 スコアではなくランクを平均することで、両方式のスコアのスケール差に依存しない。
たとえば順位評価 15 位・直対評価 9 位なら、暫定値は (15 + 9) / 2 = 12。これでソートし直したものが SPSP 順位。
平均順位が並んだ場合のタイブレークは、直対評価の順位が上の方を優先する。