這是一個包,包含多個多人比賽評分系統的實現: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 年網路會議上發布的完整論文。