A simple library to rank players.
This package contains functions to rank players, given the results of their games.
For static rankings, where players don't change their skill-level, the Bradley-Terry model computes a score for each player that predicts the probability at which one player would win against another.
For dynamic rankings, where players change their skill-level over time, the ELO ranking system provides a score that dynamically adjust with the results of the players.
A simple usage example for Bradley-Terry:
import 'package:ranking/ranking.dart';
main() {
// In the following list the first entry in the pair (representing a game)
// won that game.
var games = [
["Player 2", "Player 1"], // Player 2 won over Player 1.
["Player 2", "Player 3"],
["Player 3", "Player 2"],
["Player 3", "Player 2"],
];
var scores = computeBradleyTerryScores(games);
// The `scores` map contains a score for each player:
// Player 1 -> 0.000
// Player 2 -> 0.333
// Player 3 -> 0.667
}
A simple usage example for ELO:
import 'package:ranking/ranking.dart';
main() {
// The game-scope (3rd column) indicates the result of the game:
// * 1.0: the first player won decisively.
// * 0.5: a draw.
// * 0.0: the second player won decisively.
var games = [
["Player 2", "Player 1", 1.0],
["Player 3", "Player 2", 0.5],
["Player 3", "Player 1", 0.0],
["Player 3", "Player 2", 1.0],
["Player 2", "Player 3", 1.0],
];
var elo = new Elo(
defaultInitialRating: 100,
// With an `n` of 30, a difference of 30 in score means that the
// stronger player is 10 times more likely to win.
n: 30,
// How much new game-results move the score. With 10, players with
// the same score will have a difference of 10 after a decisive
// victory/loss.
kFactor: 10
);
games.forEach((list) { elo.recordResult(list[0], list[1], list[2] as double); });
var ratings = elo.ratings;
// The `rating` map contains a rating for each player:
// Player 1 -> 101
// Player 2 -> 103
// Player 3 -> 95
}
Please file feature requests and bugs at the issue tracker.