Glicko2 est le nom d’une méthode de calcul de la valeur de joueurs qui s’affrontent lors de compétition. J’ai eu besoin d’implémenter ce calcul pour un site que j’ai mis en place, j’ai donc naturellement choisi PHP.
Préambule
Glicko2 est le nom d’une méthode de calcul de la valeur de joueurs qui s’affrontent lors de compétition. Pour eux qui connaissent les échecs, l’esprit est le même que le calcul ELO.
Les informations originales correspondant à ce système sont disponibles sur le site de l’auteur Mark E. Glickman.
Le calcul
Chaque joueur démarre avec un niveau de départ (Rating) et une fiabilité de ce niveau (Rating Deviation). Son niveau et sa fiabilité vont évoluer en fonction des joueurs qu’il va rencontrer.
Le code
Le code et les tests associés sont disponibles sur GitHub : http://github.com/mikaelkael/Ranking. Celui-ci est exclusivement destiné à PHP5.3 minimum puisqu’il utilise les espaces de noms.
Le principe
Vous déclarez une partie :
use Mkk\Game\Ranking\Glicko2 as RankingGlicko2; $game = new RankingGlicko2();
Vous déclarez 2 joueurs :
use Mkk\Game\Player\Glicko2 as PlayerGlicko2; $player1 = new PlayerGlicko2(array('id' => 1, 'rating' => 1500, 'ratingDeviation' => 350, 'volatility' => 0.06)); $player2 = new PlayerGlicko2(array('id' => 2, 'rating' => 1500, 'ratingDeviation' => 350, 'volatility' => 0.06));
Vous les associez à la partie dans l’ordre vainqueur->perdant donc si le joueur 1 à battu le joueur 2 :
$game->addPlayers(array($player1, $player2));
Ceci est le fonctionnement par défaut. L’interface Mkk\Game\PlayerInterface propose setPosition() et getPosition(). La position par défaut d’un joueur est « null ». Lors de l’utilisation d’addPlayer() ou addPlayers(), la position du joueur est testée. Si elle vaut nulle, la position suivante lui est attribuée.
Si toutefois vous souhaitez forcer une position dans le cas par exemple d’un match nul, vous pouvez faire :
$game->addPlayers(array($player1->setPosition(1), $player2->setPosition(1)));
Ou le faire lors à la construction :
use Mkk\Game\Player\Glicko2 as PlayerGlicko2; $player1 = new PlayerGlicko2(array('id' => 1, 'rating' => 1500, 'ratingDeviation' => 350, 'volatility' => 0.06, 'position' => 1));
Vous demandez la mise à jour de leur niveau :
$game->updateRanking();
Vous obtenez le nouveau niveau, la nouvelle fiabilité et la nouvelle volatilité en récupérant les joueurs :
$player = $game->getPlayerById(1); echo $player->getNewRating(); echo $player->getNewRatingDeviation(); echo $player->getNewVolatility();
Comme le fait remarquer eMeRiKa, ces 3 chiffres (incluant la volatilité) sont nécessaires pour le calcul suivant. La volatilité est forte quand les résultats sont erratiques, si les résultats sont constants alors elle est faible.
Quelques exemples
Dans les exemples suivants, j’ai volontairement effacé la volatilité qui alourdit le nombre des informations et qui n’est pas nécessaire à l’établissement de la valeur d’un joueur mais elle est nécessaire à l’établissement de sa variation.
2 joueurs de même niveau avec une fiabilité faible (c’est-à-dire une valeur forte) s’affrontent :
Info | Avant | Après | |
---|---|---|---|
Joueur 1 | Niveau | 1500 | 1578.8 |
Fiabilité | 200 | 180.1 | |
Joueur 2 | Niveau | 1500 | 1421.2 |
Fiabilité | 200 | 180.1 |
2 joueurs de même niveau avec une fiabilité forte (c’est-à-dire une valeur forte) s’affrontent :
Info | Avant | Après | |
---|---|---|---|
Joueur 1 | Niveau | 1500 | 1507.3 |
Fiabilité | 50 | 50.5 | |
Joueur 2 | Niveau | 1500 | 1492.7 |
Fiabilité | 50 | 50.5 |
1 joueur fort bat 1 joueur faible tous les 2 avec fiabilité forte :
Info | Avant | Après | |
---|---|---|---|
Joueur 1 | Niveau | 1800 | 1800.5 |
Fiabilité | 50 | 51 | |
Joueur 2 | Niveau | 1200 | 1199.5 |
Fiabilité | 50 | 51 |
1 joueur faible bat 1 joueur fort tous les 2 avec fiabilité faible :
Info | Avant | Après | |
---|---|---|---|
Joueur 1 | Niveau | 1800 | 1623.2 |
Fiabilité | 200 | 195.8 | |
Joueur 2 | Niveau | 1200 | 1376.8 |
Fiabilité | 200 | 195.8 |
Les autres systèmes
- Elo : http://en.wikipedia.org/wiki/Elo_rating_system en anglais avec les formules de calcul
- TrueSkill : http://research.microsoft.com/en-us/projects/trueskill/default.aspx en anglais aussi
Bonjour,
Merci pour cette ressource. Deux petites questions :
– Il n’est pas possible de faire un match nul avec ce système ?
– Le paramètre volatility dépend de la régularité des résultats du joueur si j’ai bien suivi ? il doit donc être différent à chaque fois ?
En fait si depuis la semaine dernière !
Tu peux voir mon dernier commit : http://github.com/mikaelkael/Ranking/commit/c5d939580527df39e241dc2c67d2a62f1d3c8417
Je vais ajouté ceci à mon article dans les prochains jours 😉
J’ai ajouté les informations permettant le calcul d’un match nul.
J’ai de plus complété les informations concernant la volatilité.
Bonjour,
merci pour ce code particulièrement interessant !
j’ai une petite question; j’aimerais m’en inspirer pour un projet personnel et j’aimerais savoir si je dois selon toi initialiser tous les participants auxquels j’ai besoin avec les mêmes caractéristiques (ranting…) et à combien de ‘match’ en arrière dois-je remonter pour établir un classement fiable ?
Merci d’avance !