这是一个包,包含多个多人比赛评分系统的实现:Glicko 全对、BAR BT-全对、Codeforces、Topcoder、TrueSkill-SPb 和新系统 Elo-MMR。除 deprecated/cpp/trueskill 的内容外,所有内容均受 MIT 许可。
评级系统评估参与共同活动的玩家的技能。 Elo-MMR 算法专为在竞争性赛事中对中等至大量玩家进行排名的活动而设计,并且由于以下原因无法在不同赛事中对结果进行标准化:
每项赛事都具有新颖的挑战,例如障碍赛、攀岩和学术奥林匹克竞赛。
在同一项目中,参赛者的评价可能是由具有一定主观性的评委小组相对于其他人进行的,例如在竞技舞厅、花样滑冰和体操比赛中。
与大多数棋盘游戏一样,参赛者在同一赛事中与其他人互动频繁。
在这些设置中,量化玩家的水平通常很有用。评级可用于跟踪球员在训练计划中的进度、设定激励目标、预测可能的冠军,或创建仅限初学者或仅限专家的邀请赛。 Elo-MMR 的三个特性使其特别适合这些目标:
大型多人游戏:该算法速度快且数值稳定,即使有数千或数百万单独排名的参赛者也是如此。
激励相容:你在比赛中表现越好,你的评分就越高。
稳健响应:一件非常糟糕(或非常好)的事件不会对您的评级产生太大影响。
注意:理论上,Elo-MMR 也可以应用于团队比赛,但需要更多的研究来确定最佳方法。
首先,安装 Rust。从multi-skill/
目录中,运行命令
RUST_LOG=debug cargo run --release --bin rate mmr-fast codeforces
更新:现在还可以从配置文件运行评级系统。这是一个示例:(此配置文件已过时,我们将很快更新它。)
RUST_LOG=debug cargo run --release --bin rate file: ../experiments/codeforces/mmr-fast-acc.json
要测试新的检查点功能,请尝试
RUST_LOG=debug cargo run --release --bin rate_from_configs ../experiments/testing/mmr-cf-1to10.json ../experiments/testing/mmr-cf-11to20.json
它在experiments/testing/
目录中生成状态检查点文件。
RUST_LOG=debug
设置一个环境变量以在执行期间将附加信息打印到终端。请注意,Windows 上的环境变量设置有所不同。
cargo run
编译并运行 Rust 项目。
--release
创建一个发布版本,它的编译时间较长,但执行速度比开发版本快。
--bin rate
选择入口点multi-skill/src/bin/rate.rs
。
mmr-fast
是指定评级系统的命令行参数。尝试mmr
以获得更慢但更精确的 Elo-MMR 版本。
codeforces
是指定数据集的命令行参数。
可以跟随一个可选的整数参数,以指定要处理的比赛数量。
它从data/codeforces/contest_ids.json
中指定的 Codeforces 竞赛中提取数据。如果竞赛尚未存储在cache/codeforces/
中,则会通过 Codeforces 在线 API 将其下载到此处。最后,所有参赛者的技能评分结果保存在data/codeforces/ratings_output.csv
中。
请注意,您的第一次 Codeforces 运行速度会较慢,因为比赛排名是从 Codeforces API 中提取的。如果 Codeforces.com 遇到停机,或者认为您使用了过多的带宽,它甚至可能会失败;如果发生这种情况,请等待几分钟重试。
比赛以 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>,
"perf_ceiling": <optional float, defaults to infinity if not included>
}
低位和高位的索引为 0,并且对于平局的玩家来说会有所不同。它们指定了与该玩家并列的玩家范围。例如,如果顶部存在三路平局,则玩家 0、1 和 2 的低排名均为 0,高排名为 2。
如果您运行上述 Codeforces 命令至少几秒钟,那么您将在cache/codeforces/
中下载一些示例竞赛文件,您可以将其用作参考。
考虑到这种文件格式,您可以按如下方式举办自己的比赛:
使用连续整数对文件进行编号,第一个比赛保存在0.json
中,第二个比赛保存在1.json
中,依此类推。
将文件放入cache/{dataset_name}/
中。
最后,运行相同的命令,但将codeforces
替换为{dataset_name}
。
请参阅 2021 年网络会议上发布的完整论文。如果您在研究中使用此箱子,请考虑引用我们的论文。