Este es un paquete que contiene implementaciones de varios sistemas de clasificación para competiciones multijugador: Glicko all-pairs, BAR BT-all-pairs, Codeforces, Topcoder, TrueSkill-SPb y el nuevo sistema Elo-MMR. Todo bajo licencia MIT excepto el contenido de deprecated/cpp/trueskill.
Los sistemas de clasificación estiman las habilidades de los jugadores que participan en una actividad común. El algoritmo Elo-MMR se diseñó para actividades en las que se clasifica un número moderado a grande de jugadores en eventos competitivos y los resultados no se pueden estandarizar entre diferentes eventos por cualquiera de los siguientes motivos:
Cada evento presenta desafíos novedosos, como carreras de obstáculos, escalada en roca y olimpíadas académicas.
Los concursantes son evaluados en relación con los demás en el mismo evento, quizás por un panel de jueces con cierto grado de subjetividad, como en las competencias de baile de salón, patinaje artístico y gimnasia.
Los concursantes interactúan mucho con otros en el mismo evento, como en la mayoría de los juegos de mesa.
En estos entornos, suele ser útil cuantificar qué tan bueno es un jugador. Las calificaciones podrían usarse para seguir el progreso de un jugador a lo largo de un programa de entrenamiento, establecer objetivos de motivación, predecir posibles campeones o crear eventos por invitación solo para principiantes o expertos. Tres propiedades de Elo-MMR lo hacen particularmente adecuado para estos objetivos:
Multijugador masivo: el algoritmo es rápido y numéricamente estable, incluso con miles o millones de concursantes clasificados individualmente.
Compatible con incentivos: cuanto mejor lo hagas en las competiciones, mayor será tu calificación.
Respuesta sólida: un evento muy malo (o muy bueno) no puede cambiar demasiado su calificación.
Nota: en teoría, Elo-MMR también se puede aplicar en competiciones por equipos, pero se necesita investigación adicional para determinar las mejores formas de hacerlo.
Primero, instale Rust. Desde el directorio multi-skill/
, ejecute el comando
RUST_LOG=debug cargo run --release --bin rate mmr-fast codeforces
ACTUALIZACIÓN: ahora también es posible ejecutar el sistema de clasificación desde un archivo de configuración. Aquí hay un ejemplo: (este archivo de configuración no está actualizado, lo actualizaremos en breve).
RUST_LOG=debug cargo run --release --bin rate file: ../experiments/codeforces/mmr-fast-acc.json
Para probar la nueva función de puntos de control, intente
RUST_LOG=debug cargo run --release --bin rate_from_configs ../experiments/testing/mmr-cf-1to10.json ../experiments/testing/mmr-cf-11to20.json
que produce archivos de puntos de control de estado en el directorio experiments/testing/
.
RUST_LOG=debug
establece una variable de entorno para imprimir información adicional en el terminal durante la ejecución. Tenga en cuenta que las variables de entorno se configuran de manera diferente en Windows.
cargo run
compila y ejecuta un proyecto Rust.
--release
crea una compilación de lanzamiento, que tarda más en compilarse pero se ejecuta más rápido que una compilación de desarrollo.
--bin rate
selecciona el punto de entrada multi-skill/src/bin/rate.rs
.
mmr-fast
es un argumento de línea de comando que especifica el sistema de clasificación. Pruebe mmr
para obtener una versión más lenta pero más precisa de Elo-MMR.
codeforces
es un argumento de línea de comandos que especifica el conjunto de datos.
Puede seguir un argumento entero opcional para especificar cuántos concursos procesar.
Extrae datos de los concursos de Codeforces especificados en data/codeforces/contest_ids.json
. Si un concurso aún no está almacenado en cache/codeforces/
, se descarga allí a través de la API en línea de Codeforces. Finalmente, las calificaciones de habilidades resultantes de todos los concursantes se guardan en data/codeforces/ratings_output.csv
.
Tenga en cuenta que su primera ejecución de Codeforces será más lenta, ya que la clasificación del concurso se extrae de la API de Codeforces. Incluso puede fallar si Codeforces.com experimenta un tiempo de inactividad o decide que ha utilizado demasiado ancho de banda; Si esto sucede, espere unos minutos para volver a intentarlo.
Los concursos se almacenan en formato JSON, con las clasificaciones enumeradas en orden del primero al último lugar. Aquí hay un archivo de concurso de muestra, donde los corchetes angulares y los puntos suspensivos deben reemplazarse con sus propios datos:
{
"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>
}
Los rangos alto y bajo están indexados en 0 y serán diferentes para los jugadores que estén involucrados en un empate. Especifican el rango de jugadores con los que empató este jugador. Por ejemplo, si hay un empate a tres en la parte superior, los jugadores 0, 1 y 2 tendrán cada uno un rango bajo de 0 y un rango alto de 2.
Si ejecutó el comando Codeforces anterior durante al menos unos segundos, habrá descargado algunos archivos de concurso de ejemplo en cache/codeforces/
, que puede usar como referencia.
Con este formato de archivo en mente, puedes realizar tus propios concursos de la siguiente manera:
Numere sus archivos con números enteros consecutivos, guardándose el primer concurso en 0.json
, el segundo en 1.json
, y así sucesivamente.
Coloque sus archivos en cache/{dataset_name}/
.
Finalmente, ejecute el mismo comando, pero con codeforces
reemplazado por {dataset_name}
.
Consulte el artículo completo publicado en la Conferencia Web 2021. Si utiliza esta caja en su investigación, considere citar nuestro artículo.