3 个版本
0.1.2 | 2021年2月12日 |
---|---|
0.1.1 | 2021年2月3日 |
0.1.0 | 2021年2月3日 |
#644 in 数学
110KB
2.5K SLoC
Elo-MMR:大规模多人竞技的评分系统
这是一个包含多个多人竞技评分系统实现的包:全对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