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

Zend Framework 1.10.x – documentation HTML & CHM

Mis à jour le 31/03/2010 pour la sortie de la version 1.10.3 (HTM, CHM & ZIP associé et documentation API)

Mis à jour le 27/01/2010 pour la sortie de la version 1.10.0 (PDF & ZIP associé)Si vous utilisez Microsoft Internet Explorer sous Windows XP SP2 (ou plus récent) et que vous téléchargez le format CHM, vous devez « Débloquer » le fichier après téléchargement, en cliquant droit sur celui-ci et en sélectionnant le menu « Propriétés ». Ensuite cliquez sur le bouton « Débloquer ». Si vous ne faites pas ceci, vous ne pourrez pas lire le contenu dufichier CHM.

PDF CHM HTML
English
PDF - 9.1 Mo
ZF_1.10.x_EN.pdf (9.1M)
Windows compile help file format - 4.7 Mo
ZF_1.10.x_EN.chm (4.7M)
http://doczf.mikaelkael.fr/1.10/en/
Zip - 5.9 Mo
ZF_1.10.x_EN.pdf.zip (5.9M)
Zip - 4.7 Mo
ZF_1.10.x_EN.chm.zip (4.7M)
Deutsch
PDF - 9.2 Mo
ZF_1.10.x_DE.pdf (9.2M)
Windows compile help file format - 5.2 Mo
ZF_1.10.x_DE.chm (5.2M)
http://doczf.mikaelkael.fr/1.10/de/
Zip - 6.3 Mo
ZF_1.10.x_DE.pdf.zip (6.3M)
Zip - 5.2 Mo
ZF_1.10.x_DE.chm.zip (5.2M)
French
PDF - 9.5 Mo
ZF_1.10.x_FR.pdf (9.5M)
Windows compile help file format - 5 Mo
ZF_1.10.x_FR.chm (5.0M)
http://doczf.mikaelkael.fr/1.10/fr/
Zip - 6.2 Mo
ZF_1.10.x_FR.pdf.zip (6.2M)
Zip - 5 Mo
ZF_1.10.x_FR.chm.zip (5.0M)
Japanese
PDF - 8.2 Mo
ZF_1.10.x_JA.pdf (8.2M)
Windows compile help file format - 5.5 Mo
ZF_1.10.x_JA.chm (5.5M)
http://doczf.mikaelkael.fr/1.10/ja/
Zip - 5.1 Mo
ZF_1.10.x_JA.pdf.zip (5.1M)
Zip - 5.5 Mo
ZF_1.10.x_JA.chm (5.5M)
Portuguese
Windows compile help file format - 4.8 Mo
ZF_1.10.x_PT-BR.chm (4.8M)
http://doczf.mikaelkael.fr/1.10/pt-br/
Zip - 4.8 Mo
ZF_1.10.x_PT-BR.chm.zip (4.8M)
Spanish
Windows compile help file format - 5 Mo
ZF_1.10.x_ES.chm (5.0M)
http://doczf.mikaelkael.fr/1.10/es/
Zip - 5 Mo
ZF_1.10.x_ES.chm.zip (5.0M)