Elo, elo, elo, how low

Elo, elo, elo, how low

Pour Card Battle Nolife, je voulais un système de score global, histoire d’avoir un enjeu au delà de la simple partie et permettant aux joueurs de se comparer.

Un de mes TIPE en prépa était sur les systèmes de classement. J’y avais étudié deux systèmes : l’Elo et le TrueSkill. Mais n’ayant pas envie de replonger dans les formules de TrueSkill, je suis parti sur ce bon vieil Elo.

Petit rappel : chaque joueur dispose d’un score S, ayant généralement pour valeur de départ 1000. Le score évolue après chaque confrontation contre un autre joueur, suivant cette formule : `S’=S+K(W-p(D))`.
`S` représente le score initial du joueur et `S’` son nouveau score. `W` est le résultat de la partie (1 pour une vitoire, 0 pour une défaite, 0,5 pour un match nul). `p(D)=1/(1+10^(-D/400)` représente la probabilité qu’un joueur gagne en fonction de la différence `D` de score des deux joueurs (rendez-vous sur la page Wikipédia de l’Elo pour les détails du comment arriver à cette fonction). Enfin, `K` est un facteur de dilatation des résultats.

Je voulais cependant quelques caractéristiques supplémentaires.

  • Les scores doivent être globalement à la hausse : dans l’Elo classique, on gagne les points perdus par l’adversaire et inversement. Là, je voulais que le gain de points soit plus commun et que le joueur perde des points que si le résultat était nettement défavorable.
  • Plus de précision dans le résultat que victoire/défaite. Le jeu oppose deux équipes disposant chacune de trois cartes et la gagnante est celle qui a toujours une ou plusieurs cartes à la fin. Cela donne trois résultats possibles : 3-0, 3-1, 3-2.
  • Chaque équipe peut comporter de un à trois joueurs. Les gains ou pertes doivent correspondre au niveau global de chaque équipe mais aussi au score de chaque joueur pour le calcul de son nouveau score.

Pour les deux premiers points, la solution a été de modifier la valeur de `K` en fonction du résultat et de ne pas se contenter d’un choix binaire 0 ou 1. Pour une victoire, `K` prend la valeur 1 pour une victoire 3-2, 1,1 pour une victoire 3-1 et 1,2 pour une victoire 3-0. Cela permet d’ajouter des points en cas de large victoire. Pour une défaite, `K` vaut 0,4 pour une défaite 3-2, 0,3 pour une défaite 3-1 et 0,2 pour une défaite 3-0. La perte de points est donc limitée en cas de défaite et il est même possible de gagner des points si la défaite était très probable.

Pour le dernier point, la solution a été de calculer un gain pour chaque équipe puis un gain personnel pour chaque joueur. Le gain d’équipe est calculé à partir de la moyenne des scores des joueurs dans chaque équipe. Puis pour chaque joueur, un nouveau gain est calculé en effectuant la confrontation entre le score d’un joueur et la moyenne de l’équipe adverse. Il était également possible de faire la comparaison en calculant le gain de chaque joueur contre chaque joueur de l’équipe adverse puis de faire la moyenne du résultat, mais les résultats sont très proches entre les deux calculs sauf que la seconde méthode demande plus d’opérations à réaliser. La première a donc été préférée.

On obtient donc comme formule `S’=S+K(W-p(D_(équipe)))+K(W-p(D_(perso)))`. `K` est fixé à 10, `D_(équipe)` est la différence entre la moyenne des scores des deux équipes, `D_(perso)` la différence entre le score du joueur et la moyenne des scores de l’équipe opposée et `W` dépend du résultat selon le tableau suivant.

Résultat3-03-13-22-31-30-3
W1,21,110,40,30,2

Laisser un commentaire

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

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.