3 个版本

0.1.2 2021年2月12日
0.1.1 2021年2月3日
0.1.0 2021年2月3日

#644 in 数学

MIT 许可证

110KB
2.5K SLoC

Elo-MMR:大规模多人竞技的评分系统

Crates.io Version Documentation Crates.io Downloads Gitter

这是一个包含多个多人竞技评分系统实现的包:全对Glicko、全对BAR、Codeforces、TopCoder、TrueSkill-SPb以及新的系统Elo-MMR。

评分系统估算参与共同活动的玩家的技能。Elo-MMR算法是为那些在竞技活动中,有中等至大量玩家参与排名,且由于以下任何原因,无法将不同事件的结果标准化的活动而设计的:

  • 每个事件都有新的挑战,例如障碍赛跑、攀岩和学术奥林匹克。

  • 参赛者相对于同一事件的其他参赛者进行评估,可能由具有一定主观性的评委小组进行评估,如在竞技舞蹈、花样滑冰和体操中。

  • 参赛者与同一事件的其他参赛者有大量互动,如在大多数桌面游戏中。

在这些环境中,量化玩家的水平往往是很有用的。评分可以用来跟踪玩家在训练计划中的进步,设定激励目标,预测可能的冠军,或创建仅限新手或专家的邀请赛。Elo-MMR的三个特性使其特别适合这些目标:

  • 大规模多人:该算法即使面对数千或数百万个单独排名的参赛者,也是快速且数值稳定的。

  • 激励兼容:你在比赛中表现越好,你的评分就越高。

  • 稳健响应:一次非常糟糕(或非常好)的事件不会太多地改变你的评分。

注意:理论上,Elo-MMR也可以应用于团队竞赛,但需要额外的研究来确定最佳实现方式。

入门指南

首先,安装Rust。从 multi-skill/ 目录中,运行以下命令

cargo run --release --bin rate mmr codeforces

更新:现在也可以从配置文件运行评分系统。以下是一个示例

cargo run --release --bin rate file: ../experiments/codeforces/mmr-acc.json

这个命令是什么意思?

cargo run 编译并运行一个 Rust 项目。

--release 创建一个发布版本,编译时间更长,但执行速度比调试版本快。

--bin rate 选择入口点 multi-skill/src/bin/rate.rs

mmr 是一个命令行参数,用于指定评级系统。尝试使用 mmr-fast 以获得运行速度更快的近似版本。

codeforces 是一个命令行参数,用于指定数据集。

后面可以跟一个可选的整数参数,用于指定要处理多少场竞赛。

这个命令是做什么的?

它从 data/codeforces/contest_ids.json 中提取 Codeforces 竞赛的指定数据。如果竞赛尚未存储在 cache/codeforces/ 中,则通过 Codeforces 在线 API 下载到那里。最后,所有参赛者的技能评级结果保存在 data/ratings_output.csv 中。

请注意,您的第一次 Codeforces 运行可能会比较慢,因为数据是从 Codeforces API 中提取的,或者如果 Codeforces 网站出现宕机,甚至可能会失败。然而,后续的运行应该会快得多。

我该如何对我的游戏中的参赛者进行评级?

竞赛以 JSON 格式存储,排名从第一到最后列出。以下是一个示例竞赛文件,其中应将尖括号和省略号替换为您的数据

{
    "name": <str, human-readable name of the contest>, 
    "time_seconds": <int, seconds since the Unix epoch>, 
    "standings": [[<str, player 0's name>, <int, low rank>, <int, high rank>], 
                  [<str, player 1's name>, <int, low rank>, <int, high rank>],
                  ...]]
    "weight": <optional float, defaults to 1 if not included>
}

排名的低位和高位是从 0 开始计数的,并且对于涉及平局的玩家会有所不同。它们指定了与该玩家平局的玩家的范围。例如,如果前三名有三个平局,则玩家 0、1 和 2 的低位排名均为 0,高位排名均为 2。

如果您运行上述 Codeforces 命令至少几秒钟,那么您将已下载一些示例竞赛文件到 cache/codeforces/ 中,您可以将其用作参考。

考虑到这种文件格式,您可以按照以下方式运行自己的竞赛

  • 使用连续的整数编号您的文件,第一个竞赛保存在 0.json,第二个保存在 1.json,依此类推。

  • 将您的文件放在 cache/{dataset_name}/ 中。

  • 最后,运行相同的命令,但将 codeforces 替换为 {dataset_name}

数学细节

请参阅 2021 年网络会议发表的完整论文 https://arxiv.org/abs/2101.00400。如果您在研究中使用了这个 crate,请考虑引用我们的论文。

依赖项

~11–27MB
~397K SLoC