이는 멀티 플레이어 대회를 위한 여러 평가 시스템(Glicko 올페어, BAR BT-올페어, Codeforces, Topcoder, TrueSkill-SPb 및 새로운 시스템 Elo-MMR)의 구현을 포함하는 패키지입니다. 더 이상 사용되지 않는/cpp/trueskill의 내용을 제외하고 모두 MIT 라이센스를 따릅니다.
등급 시스템은 공통 활동에 참여하는 플레이어의 기술을 평가합니다. Elo-MMR 알고리즘은 중간에서 다수의 플레이어가 경쟁 이벤트에서 순위를 매기는 활동을 위해 설계되었으며 다음과 같은 이유로 여러 이벤트에서 결과를 표준화할 수 없습니다.
각 이벤트에는 장애물 코스 경주, 암벽 등반, 학술 올림피아드 등 새로운 도전 과제가 포함되어 있습니다.
참가자들은 동일한 이벤트에서 다른 사람들과 비교하여 평가되며, 무도회장, 피겨 스케이팅, 체조 경기처럼 어느 정도 주관성을 지닌 심사위원단에 의해 평가됩니다.
참가자들은 대부분의 보드 게임에서와 마찬가지로 동일한 이벤트에서 다른 사람들과 활발하게 상호 작용합니다.
이러한 설정에서는 플레이어의 실력을 정량화하는 것이 유용한 경우가 많습니다. 등급은 훈련 프로그램에 대한 플레이어의 진행 상황을 추적하고, 동기 부여 목표를 설정하고, 챔피언이 될 가능성을 예측하고, 초보자 전용 또는 전문가 전용 초대 이벤트를 만드는 데 사용될 수 있습니다. Elo-MMR의 세 가지 속성은 특히 이러한 목적에 적합합니다.
대규모 멀티플레이어: 알고리즘은 수천 또는 수백만 명의 개별 순위 참가자가 있는 경우에도 빠르고 수치적으로 안정적입니다.
인센티브 호환: 대회에서 더 좋은 성과를 낼수록 등급이 더 높아집니다.
강력한 대응: 하나의 매우 나쁜(또는 매우 좋은) 이벤트로 인해 평점이 너무 많이 바뀔 수는 없습니다.
참고: 이론적으로 Elo-MMR은 팀 대회에도 적용될 수 있지만 이를 수행하는 최선의 방법을 결정하려면 추가 연구가 필요합니다.
먼저 러스트를 설치하세요. 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
에 저장되고 두 번째 콘테스트는 1.json
에 저장됩니다.
cache/{dataset_name}/
에 파일을 저장하세요.
마지막으로 동일한 명령을 실행하되 codeforces
{dataset_name}
으로 대체합니다.
웹 컨퍼런스 2021에 발표된 전체 논문을 참조하세요. 연구에 이 상자를 사용하는 경우 우리 논문 인용을 고려해 보세요.