Elo 排名算法由匈牙利裔美国物理学家 Arpad Elo 发明,最初用于计算国际象棋选手的相对实力。该算法通过比赛结果动态调整选手的评分:胜者得分,败者扣分,分差越大的比赛结果对评分影响越小。核心思想是用概率模型预测比赛结果,实际结果与预测偏差越大,评分调整幅度越大。
Python 实现 Elo 排名系统
下面是一个基于 Elo 算法的排名系统实现,包含核心计算逻辑和完整的使用示例:
import math
from typing import List, Dict, Tuple, Optional
class EloRatingSystem:
def __init__(self, k_factor: int = 32, base_rating: int = 1500):
"""
初始化 Elo 排名系统
参数:
k_factor: 影响评分调整幅度的常数,值越大调整幅度越大
base_rating: 新选手的初始评分
"""
self.k_factor = k_factor
self.base_rating = base_rating
self.ratings = {} # 存储选手评分的字典
def add_player(self, player_id: str, initial_rating: Optional[int] = None) -> None:
"""添加新选手"""
if initial_rating is None:
initial_rating = self.base_rating
self.ratings[player_id] = initial_rating
def expected_score(self, rating_a: float, rating_b: float) -> float:
"""计算选手 A 相对于选手 B 的预期得分 (0-1 之间)"""
diff = rating_b - rating_a
return 1 / (1 + math.pow(10, diff / 400))
def update_ratings(self, player_a_id: str, player_b_id: str, score_a: float) -> Tuple[float, float]:
"""
根据比赛结果更新选手评分
参数:
player_a_id, player_b_id: 参赛选手的 ID
score_a: 选手 A 的得分 (1.0 表示胜, 0.5 表示平, 0.0 表示负)
返回:
两位选手的新评分
"""
if

最低0.47元/天 解锁文章
2729

被折叠的 条评论
为什么被折叠?



