1 个稳定版本
1.0.0 | 2022 年 3 月 4 日 |
---|---|
0.0.1 |
|
#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
的玩家意味着其真实实力介于 1350
和 1250
之间,置信度为 95%。
比赛时间注意事项
由于时间影响评级偏差,该算法假定评级期内所有比赛都是同时进行的,并使用相同的不可确定性值。
调整参数
- 评级期长度和数量影响评级偏差的衰减
- 通常每个团队每个周期应有
{10..15}
场比赛
- 通常每个团队每个周期应有
- 初始 mu 和 phi 值影响团队或玩家的变化程度
- 默认分别为
1500
和350
- 默认分别为
- sigma 是基本波动性
- 默认为
0.06
- 默认为
- tau 是基本变化约束;值越高,对冷门赛事的重视程度越高
- 应该是
{0.3..1.2}
- 应该是
问题
- 难以确定单个比赛的 影响
- 在评分期间中间没有可用的评分
- 评分仅在计算时间有效
论文
Mark Glickman 开发了 Glicko2 算法。他的论文可在 此处 找到。