Este é um pacote contendo implementações de diversos sistemas de classificação para competições multijogador: Glicko all-pairs, BAR BT-all-pairs, Codeforces, Topcoder, TrueSkill-SPb e o novo sistema Elo-MMR. Tudo sob licença MIT, exceto o conteúdo de obsoleto/cpp/trueskill.
Os sistemas de classificação estimam as habilidades dos jogadores que participam de uma atividade comum. O algoritmo Elo-MMR foi projetado para atividades nas quais um número moderado a grande de jogadores é classificado em eventos competitivos e os resultados não podem ser padronizados em eventos diferentes por qualquer um dos seguintes motivos:
Cada evento apresenta novos desafios, como corridas de obstáculos, escalada e olimpíadas acadêmicas.
Os competidores são avaliados em relação aos demais no mesmo evento, talvez por um painel de jurados com algum grau de subjetividade, como em competições de salão de baile, patinação artística e ginástica.
Os competidores interagem fortemente com outros no mesmo evento, como na maioria dos jogos de tabuleiro.
Nessas situações, muitas vezes é útil quantificar o quão bom é um jogador. As classificações podem ser usadas para acompanhar o progresso de um jogador ao longo de um programa de treinamento, definir objetivos motivacionais, prever prováveis campeões ou criar eventos apenas para iniciantes ou apenas para especialistas. Três propriedades do Elo-MMR o tornam particularmente adequado para estes objetivos:
Massively Multiplayer: o algoritmo é rápido e numericamente estável, mesmo com milhares ou milhões de competidores classificados individualmente.
Compatível com incentivos: quanto melhor você se sair nas competições, maior será sua classificação.
Resposta robusta: um evento muito ruim (ou muito bom) não pode alterar muito a sua classificação.
Nota: em teoria, o Elo-MMR também pode ser aplicado em competições por equipes, mas são necessárias pesquisas adicionais para determinar as melhores formas de fazer isso.
Primeiro, instale o Rust. No diretório multi-skill/
, execute o comando
RUST_LOG=debug cargo run --release --bin rate mmr-fast codeforces
ATUALIZAÇÃO: agora também é possível executar o sistema de classificação a partir de um arquivo de configuração. Aqui está um exemplo: (este arquivo de configuração está desatualizado, iremos atualizá-lo em breve).
RUST_LOG=debug cargo run --release --bin rate file: ../experiments/codeforces/mmr-fast-acc.json
Para testar o novo recurso de checkpoint, tente
RUST_LOG=debug cargo run --release --bin rate_from_configs ../experiments/testing/mmr-cf-1to10.json ../experiments/testing/mmr-cf-11to20.json
que produz arquivos de checkpoint de estado no diretório experiments/testing/
.
RUST_LOG=debug
define uma variável de ambiente para imprimir informações adicionais no terminal durante a execução. Observe que as variáveis de ambiente são definidas de forma diferente no Windows.
cargo run
compila e executa um projeto Rust.
--release
cria uma compilação de lançamento, que leva mais tempo para compilar, mas é executada mais rapidamente do que uma compilação de desenvolvimento.
--bin rate
seleciona o ponto de entrada multi-skill/src/bin/rate.rs
.
mmr-fast
é um argumento de linha de comando que especifica o sistema de classificação. Experimente mmr
para uma versão mais lenta, porém mais precisa, do Elo-MMR.
codeforces
é um argumento de linha de comando que especifica o conjunto de dados.
Um argumento inteiro opcional pode seguir, para especificar quantos concursos serão processados.
Ele extrai dados dos concursos Codeforces especificados em data/codeforces/contest_ids.json
. Se um concurso ainda não estiver armazenado em cache/codeforces/
, ele será baixado lá por meio da API online do Codeforces. Finalmente, as classificações de habilidade resultantes de todos os competidores são salvas em data/codeforces/ratings_output.csv
.
Observe que sua primeira execução do Codeforces será mais lenta, pois as classificações do concurso são obtidas da API do Codeforces. Pode até falhar se o Codeforces.com passar por um período de inatividade ou decidir que você usou muita largura de banda; se isso acontecer, aguarde alguns minutos para tentar novamente.
Os concursos são armazenados no formato JSON, com as classificações listadas do primeiro ao último lugar. Aqui está um exemplo de arquivo de concurso, onde os colchetes angulares e reticências devem ser substituídos por seus próprios dados:
{
"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>
}
As classificações baixa e alta são indexadas em 0 e serão diferentes para jogadores empatados. Eles especificam o leque de jogadores com quem este jogador empatou. Por exemplo, se houver um empate a três no topo, os jogadores 0, 1 e 2 terão, cada um, uma classificação baixa de 0 e uma classificação alta de 2.
Se você executou o comando Codeforces acima por pelo menos alguns segundos, então você terá baixado alguns exemplos de arquivos de concurso em cache/codeforces/
, que você pode usar como referência.
Com esse formato de arquivo em mente, você pode realizar seus próprios concursos da seguinte maneira:
Numere seus arquivos com números inteiros consecutivos, sendo o primeiro concurso salvo em 0.json
, o segundo em 1.json
, e assim por diante.
Coloque seus arquivos em cache/{dataset_name}/
.
Por fim, execute o mesmo comando, mas com codeforces
substituídos por {dataset_name}
.
Consulte o artigo completo publicado na Web Conference 2021. Se você usar esta caixa em sua pesquisa, considere citar nosso artigo.