Implémentation Glicko2 en PHP 5.3

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

4 réflexions sur « Implémentation Glicko2 en PHP 5.3 »

  1. 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 ?

  2. J’ai ajouté les informations permettant le calcul d’un match nul.

    J’ai de plus complété les informations concernant la volatilité.

  3. 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 !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *