#rating #glicko #gamedev #elo #trueskill

glicko_2

Glicko2 是一种用于在 1v1 游戏中对对手或团队进行排名的迭代算法

1 个稳定版本

1.0.0 2022 年 3 月 4 日
0.0.1 2022 年 3 月 4 日

#650游戏开发

自定义许可

28KB
490 行 代码

Glicko2 (Rust 版本)

Glicko2 是一种用于在 1v1 游戏中对对手或团队进行排名的迭代算法。这是一个实现该算法的零依赖 Rust 库。

安装

将以下内容添加到您的 Cargo.toml

[dependencies]
glicko_2 = "1.0.0"

示例用法

最常用的用法是更新每个团队的连续一系列比赛,但此库还提供许多其他便利方法。

更新一系列比赛

use glicko_2::{Rating, Tuning, game::Outcome, algorithm};

/// Tune the rating values, here we use the default
let tuning = Tuning::default();

/// Create a Rating struct for each team
let mut team_to_update = Rating::new(&tuning);
let mut opponent_1 = Rating::new(&tuning);
let mut opponent_2 = Rating::new(&tuning);
let mut opponent_3 = Rating::new(&tuning);
let mut opponent_4 = Rating::new(&tuning);

/// Rate our team against a vector of matchup results
algorithm::rate(
    &mut team_to_update,
    vec![(Outcome::Win, &mut opponent_1),
         (Outcome::Loss, &mut opponent_2),
         (Outcome::Draw, &mut opponent_3),
    ]
);

/// Opponent 4 did not play, so their rating must be decayed
opponent_4.decay();

/// Print our updated rating
println!("{:?}", team_to_update); // { mu: 1500.0, phi: 255.40, sigma: 0.0059, is_scaled: false }

获取一支球队击败另一支球队的概率

use glicko_2::{Rating, Tuning, game};

/// Tune the rating values, here we use the default
let tuning = Tuning::default();

/// Create a Rating struct for each team
let mut rating_1 = Rating::new(&tuning);
let mut rating_2 = Rating::new(&tuning);

/// Get odds (percent chance team_1 beats team_2)
let odds = game::odds(&mut rating_1, &mut rating_2);
println!("{}", odds); // 0.5, perfect odds since both teams have the same rating

确定比赛的质量

use glicko_2::{Rating, Tuning, game};

/// Tune the rating values, here we use the defaults
let tuning = Tuning::default();

/// Create a Rating struct for each team
let mut rating_1 = Rating::new(&tuning);
let mut rating_2 = Rating::new(&tuning);

/// Get odds (the advantage team 1 has over team 2)
let quality = game::quality(&mut rating_1, &mut rating_2);
println!("{}", quality); // 1.0, perfect matchup since both teams have the same rating

更新单场比赛中两队的评级

use glicko_2::{Rating, Tuning, game};

/// Tune the rating values, here we use the defaults
let tuning = Tuning::default();

/// Create a Rating struct for each team
let mut rating_1 = Rating::new(&tuning);
let mut rating_2 = Rating::new(&tuning);

/// Update ratings for team_1 beating team_2
game::compete(&mut rating_1, &mut rating_2, false);

/// Print our updated ratings
println!("{:?}", rating_1); // { mu: 1646.47, phi: 307.84, sigma: 0.0059, is_scaled: false }
println!("{:?}", rating_2); // { mu: 1383.42, phi: 306.83, sigma: 0.0059, is_scaled: false }

评级

在 1v1 竞赛中,每一边都被分配了一个评级和一个评级偏差。评级代表玩家或团队的技术水平,而评级偏差衡量对评级值的信心。

评级偏差

团队或玩家的评级偏差随着结果而降低,在非活跃期增加。评级偏差还取决于波动性,即玩家或团队的表现一致性。

因此,置信区间表示团队或玩家的技术水平:评级为 1300 且评级偏差为 25 的玩家意味着其真实实力介于 13501250 之间,置信度为 95%。

比赛时间注意事项

由于时间影响评级偏差,该算法假定评级期内所有比赛都是同时进行的,并使用相同的不可确定性值。

调整参数

  • 评级期长度和数量影响评级偏差的衰减
    • 通常每个团队每个周期应有 {10..15} 场比赛
  • 初始 mu 和 phi 值影响团队或玩家的变化程度
    • 默认分别为 1500350
  • sigma 是基本波动性
    • 默认为 0.06
  • tau 是基本变化约束;值越高,对冷门赛事的重视程度越高
    • 应该是 {0.3..1.2}

问题

  • 难以确定单个比赛的 影响
  • 在评分期间中间没有可用的评分
  • 评分仅在计算时间有效

论文

Mark Glickman 开发了 Glicko2 算法。他的论文可在 此处 找到。

无运行时依赖