# ELO algorithm for handling people who don't play often

I'm using the ELO algorithm to rank players in an ongoing pong competition. Most players play every day, but we've got one player who hasn't played in a month. My algorithm currently only tracks scores over the last 30 days, and as a result, this player is rapidly rising through the ranks, despite having never played. He lost a bunch of his first games, but won most of his last few games, which means that his losses are dropping off the charts and his score is going up as a result.

Obviously, my plan to drop off scores after 30 days isn't working. What other methods can I use to penalize players for not playing often?

The only thing I've come up with thus far is to reduce the points based on percentage that is based on the days of inactivity (i.e. if a user hasn't played in a week, his points are only worth 70% of normal, and he would have to play X times to get back up to 100% points).

However, this seems too arbitrary. Does anyone have any better ideas or suggestions for handling inactive players in an otherwise active environment?

It sounds like you're storing the points awarded for each match, and then 'expiring' those point adjustments over time. Which, as you've noticed, is open to easy exploitation.

In a standard ELO implementation, your ELO score is forever; it does not 'decay' over time, as having points leave the ranking system in this way will eventually lead to overall score deflation (ie: 1500 will no longer mean 'average').

Remember that ELO rankings are not "points" in the way that game players usually think of them; they are an attempt at ranking a player's level of skill relative to other players, they are not a reward. These points should not be taken away as a punishment to the player, because they're the only tool you have to try to match players against opponents of a similar skill level. The only thing which should affect these values - ever - are wins and losses against other ranked players.

The approach taken by most games which want to stop players from achieving a high score and then vanishing, never to play again, is to have an activity requirement for the leaderboard display; if a player hasn't played a game in 30 days (or whatever), they simply don't show up in leaderboards until they do. When the player returns and plays another ranked match, they return with their full ELO ranking, exactly as if they had never left. If their skill level has changed relative to other active players in the interim, the game will quickly notice that and adjust their ranking, through the standard process of winning and losing matches against opponents.

• +1 while this is the correct explanation on why this is failing, I'd just drop the ELO instead and go for something completely different. (I don't know what, or I would've posted it ^^) – o0'. Dec 13 '11 at 8:31
• @Lohoris That'd be a perfectly sensible development choice. If the goal isn't to maintain a meaningful comparison of people's objective levels of skill relative to each other, (ie: for matchmaking purposes), then ELO isn't a great choice for use as a scoring mechanism. And there are even some games out there which use a system like ELO under the hood for matchmaking, while using an entirely different "points" system for display purposes, which lets them reward people for playing more frequently. StarCraft 2 does this, for example. – Trevor Powell Dec 13 '11 at 20:55

Algorithms like Elo and TrueSkill determine a player's skill based on the result of each game played, without respect to the passage of time. However, both algorithms come with an "uncertainty" factor -- in the case of Elo, there is a K Factor that is usually set high for new players, such that their Elo rating will converge on their "true" skill rating quickly. After a set time or a set number of games, the K Factor is normally reduced, so that the rating changes less between games.

What you're seeing is likely typical Elo behaviour (depending on your Elo implementation): your player has played fewer games than his competitors, which makes him a "new player" with a higher K Factor; since he's winning his games, the algorithm sees him as a higher-skilled player and awards him a higher ranking!

Note that ranking algorithms are generally used only for comparisons between players, and not to determine the outcome of competitions, given their behaviour. Given you want to reward participation, I'd recommend scoring players in the competition another way. Some suggestions:

• Score players based on the number of wins.
• Assign point values to wins/losses, e.g. 2 points for a win, 1 point for a loss.
• Only count the player's best X games in a given week/month.
• Require players to play a minimum number of games to "qualify".

Note that none of these solutions will give a completely "fair" result, as players who play more will have a higher score than players who don't. The only way to ensure fairness is for players to play an identical number of games.

• I think it's only fair that players who play more (while having the same average win/loss ratio) should have an higher score than players who don't play as much... – David Gouveia Dec 13 '11 at 2:39
• @davidluzgouveia - that's not strictly the definition of "fair". When scoring players in a tournament, the result is "fair" if no player has an advantage that another player does not (without respect to skill). Having said that, I think the case we're talking about is a casual competition between friends; the scoring is more about encouraging participation than outright winning. – Blair Holloway Dec 13 '11 at 2:48
• Yes, this is a casual competition rather than a strict tournament. I agree with David's comment, obviously, which is why I'm seeking a solution here. Thanks for your input! – Jemaclus Dec 13 '11 at 17:58

I don't know about the ELO algorithm, but how about instead of penalizing people who don't play often, you reward people who play often? For instance if you made your score something like:

Score = (Wins / Losses) * (Total Games Played) * Some_Scale_Factor


Then people who play often would probably end up playing more games and having more chances at achieving an higher score.

And another thing that you might want to change is to prevent the purging of old scores from having an impact on the player's total score. That's the main reason why that player is rising in the ranks (and also why he'll eventually fall completely off the charts).

Also, people who play seriously for a while and achieve a great track record, probably won't be happy knowing that their achievements will eventually fade away and disappear. That system is seriously discouraging.

This is easily fixed just by keeping a cache of each player's "total games played" and "win/lose ratio", even after you delete the scores themselves.

With that information you can easily deduce back how many wins and losses the player had and update them accordingly whenever he plays again.