ゲームのレーティングシステムの数学(Eloレーティング)
ロジスティック関数で「勝てる確率」を予測し、番狂わせを大きく評価する自己調整型スコアリング
- 1
- Eloレーティングは、2人のプレイヤーのレーティング差をロジスティック関数に入れることで「勝率の期待値」を予測する数理モデル
- 2
- 対局後は「実際の結果 − 期待された勝率」の差(予測誤差)に比例してレーティングを増減させる、シンプルな自己修正アルゴリズム
- 3
- 格上が格下に勝っても期待通りなのでレーティングはほぼ動かないが、格下が格上に勝つ「番狂わせ」は期待からのズレが大きいためレーティングが大きく動く
なぜこれを学ぶのか? — 現実社会とテクノロジーでの価値
なぜ生まれたのか?
Eloレーティングは、2人のプレイヤーのレーティング差をロジスティック関数に入れることで「勝率の期待値」を予測する数理モデル
身につく武器・思考力
対局後は「実際の結果 − 期待された勝率」の差(予測誤差)に比例してレーティングを増減させる、シンプルな自己修正アルゴリズム
実社会・ITでの活躍現場
- •オンライン対戦ゲームにおけるレーティング更新とマッチメイキング
- •ITシステム・アルゴリズム実装における論理設計
- •データ分析やシミュレーションにおける数理モデリング
Layer 1 — 直感・シミュレーター
2人のプレイヤーのレーティングをスライダーで調整すると、ロジスティック関数によって計算される「期待勝率」がリアルタイムに表示される。「対戦結果を入力」ボタンで勝敗(または引き分け)を確定させると、Eloの更新式に従って両者のレーティングが変化する。格上が順当に勝った場合と、格下が「番狂わせ」を起こした場合とで、レーティングの変動幅がどれほど違うかを体感しよう。
↑ レーティング差が大きい2人を対戦させ、格下が勝つ「番狂わせ」を発生させてみよう。期待勝率が低かった側ほど、勝利時のレーティング上昇幅が大きくなることが確認できる。
レーティング差が0(実力がほぼ互角)の2人が対局するとき、Eloモデルが予測する片方の勝率はいくらか?
Layer 2 — 定義・受験・証明
定義
Eloレーティングは、プレイヤー のレーティングを 、プレイヤー のレーティングを としたとき、両者のレーティング差を「ロジスティック関数(シグモイド関数)」に通すことで、プレイヤー が勝つ確率の期待値 を次のように定義する。
対局後、実際の結果 (勝ち=1, 引き分け=0.5, 負け=0)が得られたとき、レーティングは「予測とのズレ」に応じて次式で更新される。
ここで は更新の感応度を決める係数(K因子)である。
公式・数理モデル
証明・導出
ロジスティック関数が期待勝率のモデルとして妥当である理由:
Eloモデルでは、各プレイヤーの実力を正規分布(またはロジスティック分布)に従う確率変数とみなし、対局結果はその実力値の大小比較で決まると仮定する。実力差 が大きいほど が勝つ確率は1に近づき、 のとき確率はちょうど になる必要がある。
ロジスティック関数 はこの性質(単調増加・・ で または に漸近)を満たし、かつ計算が容易であるため採用されている。
更新式の妥当性は「ゼロサム性」で確認できる。両者のレーティング変化量を見ると、
ここで (勝敗の合計は必ず1)かつ (期待勝率の合計も必ず1、 であることは定義式から容易に確認できる)なので、
すなわちレーティングの総量は対局によって増減せず、勝者から敗者へ「実力の期待とのズレの分だけ」レーティングが移動する保存則が成り立つ。
押さえておきたいポイント
- 期待勝率が50%に近い「互角の対局」では、勝っても負けてもレーティング変動は小さい
- 期待勝率が低い格下が勝つ「番狂わせ」では が1に近づくため、レーティング変動が最大化する
- 因子が大きいほどレーティングは直近の結果に敏感になり、小さいほど長期的な実力を安定して反映する(初心者にはKを大きく、熟練者にはKを小さくする運用が一般的)
- チェス(FIDE)、囲碁・将棋のオンライン対局場、League of LegendsやOverwatchなどの対戦ゲームのマッチメイキング(近い実力同士を組ませる仕組み)にも応用されている
本トピックの内容・数理モデルは、文部科学省学習指導要領(算数・数学・情報)および国際標準カリキュラムに準拠し、エンジニアリング現場の実装事例と照らし合わせてMath World Lab編集部により検証・作成されています。
Layer 3 — 工学応用・現場実装
オンライン対戦ゲームにおけるレーティング更新とマッチメイキング
対局結果が確定するたびにロジスティック関数で期待勝率を計算し、実際の結果とのズレに比例してレーティングを更新する。マッチメイキングでは、レーティングが近いプレイヤー同士(=期待勝率が50%に近いペア)を優先的にマッチさせることで、接戦になりやすい対戦カードを生成する。
1type MatchResult = "win" | "loss" | "draw";23// レーティング差からプレイヤーAの期待勝率を計算(ロジスティック関数)4function expectedScore(ratingA: number, ratingB: number): number {5 return 1 / (1 + Math.pow(10, (ratingB - ratingA) / 400));6}78// 対局結果を受け取り、両者の新レーティングを返す9function updateElo(10 ratingA: number,11 ratingB: number,12 result: MatchResult,13 kFactor: number = 3214): { newRatingA: number; newRatingB: number } {15 const expectedA = expectedScore(ratingA, ratingB);16 const expectedB = 1 - expectedA;1718 const scoreA = result === "win" ? 1 : result === "loss" ? 0 : 0.5;19 const scoreB = 1 - scoreA;2021 const newRatingA = ratingA + kFactor * (scoreA - expectedA);22 const newRatingB = ratingB + kFactor * (scoreB - expectedB);2324 return { newRatingA: Math.round(newRatingA), newRatingB: Math.round(newRatingB) };25}2627// 例: レーティング1200の挑戦者が、レーティング1800の強豪に「番狂わせ」勝利28const challenger = 1200;29const champion = 1800;3031const expected = expectedScore(challenger, champion);32console.log(`挑戦者の予測勝率: ${(expected * 100).toFixed(1)}%`); // 約 3.1%3334const { newRatingA, newRatingB } = updateElo(challenger, champion, "win", 32);35console.log(`挑戦者の新レーティング: ${newRatingA}`); // 大幅上昇(約1231)36console.log(`強豪の新レーティング: ${newRatingB}`); // 大幅下落(約1769)
次に学ぶならコレ!おすすめトピック
この単元と深い繋がりを持つ、あわせて学ぶと理解が深まるおすすめ単元