これは、マルチプレイヤー競技会用のいくつかの評価システムの実装を含むパッケージです: Glicko オールペア、BAR BT-オールペア、Codeforces、Topcoder、TrueSkill-SPb、および新しいシステム Elo-MMR。 deprecated/cpp/trueskill の内容を除き、すべて MIT ライセンスに基づいています。
評価システムは、共通のアクティビティに参加するプレイヤーのスキルを評価します。 Elo-MMR アルゴリズムは、中規模から多数のプレイヤーが競技イベントでランク付けされるアクティビティ向けに設計されており、次のいずれかの理由により、結果をさまざまなイベント間で標準化することができません。
各イベントには、障害物コース レース、ロック クライミング、学術オリンピックなど、斬新な課題が用意されています。
競技者は、社交競技、フィギュアスケート、体操のように、おそらくある程度の主観を持った審査員団によって、同じイベントの他の選手と相対的に評価されます。
ほとんどのボード ゲームと同様に、出場者は同じイベントで他の参加者と頻繁に交流します。
このような設定では、プレーヤーがどれほど優れているかを数値化することが役立つことがよくあります。レーティングは、トレーニング プログラムにおけるプレーヤーの進捗状況の追跡、モチベーションの目標の設定、優勝候補の予測、または初心者限定または専門家限定の招待イベントの作成に使用できます。 Elo-MMR の 3 つの特性により、以下の目的に特に適しています。
大規模マルチプレイヤー: アルゴリズムは高速であり、数千人または数百万人の個別にランク付けされた出場者であっても、数値的に安定しています。
インセンティブ対応: コンテストで良い成績を収めると、評価も高くなります。
堅牢な対応: 1 つの非常に悪い (または非常に良い) 出来事によって、評価が大きく変わることはありません。
注: 理論上、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
評価システムを指定するコマンドライン引数です。 Elo-MMR の低速ですがより正確なバージョンのmmr
試してください。
codeforces
データセットを指定するコマンドライン引数です。
オプションの整数引数を続けて、処理するコンテストの数を指定できます。
data/codeforces/contest_ids.json
で指定された Codeforces コンテストからデータを取得します。コンテストがcache/codeforces/
にまだ保存されていない場合は、Codeforces オンライン API を介してそこにダウンロードされます。最後に、結果として得られたすべての出場者のスキル評価がdata/codeforces/ratings_output.csv
に保存されます。
コンテストの順位は Codeforces API から取得されるため、最初の Codeforces の実行は遅くなることに注意してください。 Codeforces.com でダウンタイムが発生した場合、または帯域幅の使用量が多すぎると判断された場合は、失敗する可能性もあります。この問題が発生した場合は、数分待ってからもう一度試してください。
コンテストは JSON 形式で保存され、順位が 1 位から最下位の順にリストされます。以下はコンテスト ファイルのサンプルです。山括弧と省略記号は独自のデータに置き換える必要があります。
{
"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 からインデックスされ、引き分けに巻き込まれたプレーヤーによって異なります。これらは、このプレーヤーが引き分けたプレーヤーの範囲を指定します。たとえば、トップが 3 者同点の場合、プレーヤー 0、1、2 はそれぞれ、低ランク 0 と高ランク 2 を持ちます。
上記の Codeforces コマンドを少なくとも数秒間実行すると、サンプルのコンテスト ファイルがcache/codeforces/
にダウンロードされます。これを参照として使用できます。
このファイル形式を念頭に置いて、次のように独自のコンテストを実行できます。
ファイルに連続した整数で番号を付けます。最初のコンテストは0.json
に保存され、2 番目のコンテストは1.json
に保存されます。
ファイルをcache/{dataset_name}/
に配置します。
最後に、同じコマンドを実行しますが、 codeforces
{dataset_name}
に置き換えます。
Web Conference 2021 で公開された論文全文をご覧ください。研究でこのクレートを使用する場合は、私たちの論文を引用することを検討してください。