Update: I wrote up a much easier to read version of it with some extensions Read this doc instead of all the stuff below.
Warning: math ahead.
I have a proposal for a skill system based on ELO but tweaked for ns2. (I work at Google writing search ranking systems, so I know a little bit how to do this sort of thing.) For the time being I've avoided adding anything having to do with commander skill, instead treating them like just another player, but that would be easy to add.
I believe this formula to be mostly abuse-proof, by which I mean that the only incentive each player has is to play fair games (i.e. not stacked) and to try to win them.
The general framework is to predict the probability of the outcome of the game based on the skill of the players. The update rule for the players' skill levels is determined by the gradient of the error on that prediction.
Notation:
P is the probability of a victory by team 1.
Game_outcome is a variable that is 1 if team 1 wins, 0 if team 1 loses.
s_i is the skill of the ith player.
logit(x) is the logisitic function, log(p / (1-p))
t_i be the time spent in the round, (probably an exponential weighting of each second so that being in the round at the beginning counts more than being in the round at the end. Integrals over exponents are easy, so you can implement this via t_i = a^(-time_the_player_entered) - a^(- time_the_player_quit) where a is some constant that makes sense.)
The error on the prediction is Game_outcome - P
If you’re familiar with the math of logistic regression, the update rule for players on team 1 becomes
and the inverse of this for team 2.
What does this mean in english? We predict the outcome of the game based on the players’ skill and how long they each played in the game. After the game, we update each player’s skill by the product of what fraction of the game they played, and the difference between our prediction and what actually happened.
This system has a bunch of desirable properties:
1. If one team smashes another, but the teams were stacked to make that outcome almost certain, nobody’s skill level changes at the end of the round. Only unexpected victories change skill levels.
2. Nothing you do during the round other than winning the game has any effect on your skill level. This means that there’s no incentive to rack up kills at the end of the game rather than finishing it, or to play skulk instead of gorge, or to go offense rather than build.
3. The effect on your score is determined by the time you spent playing the round rather than your points, with the beginning of the game weighted much higher than the end. This means that it doesn’t harm you to join a game that is already lost, because you’ll have played for a very small fraction of the weighted time spent in the game.
Warning: math ahead.
I have a proposal for a skill system based on ELO but tweaked for ns2. (I work at Google writing search ranking systems, so I know a little bit how to do this sort of thing.) For the time being I've avoided adding anything having to do with commander skill, instead treating them like just another player, but that would be easy to add.
I believe this formula to be mostly abuse-proof, by which I mean that the only incentive each player has is to play fair games (i.e. not stacked) and to try to win them.
The general framework is to predict the probability of the outcome of the game based on the skill of the players. The update rule for the players' skill levels is determined by the gradient of the error on that prediction.
Notation:
P is the probability of a victory by team 1.
Game_outcome is a variable that is 1 if team 1 wins, 0 if team 1 loses.
s_i is the skill of the ith player.
logit(x) is the logisitic function, log(p / (1-p))
t_i be the time spent in the round, (probably an exponential weighting of each second so that being in the round at the beginning counts more than being in the round at the end. Integrals over exponents are easy, so you can implement this via t_i = a^(-time_the_player_entered) - a^(- time_the_player_quit) where a is some constant that makes sense.)
logit(P) = (SUM_over_team1(t_i * s_i) - SUM_over_team2(t_i * s_i)) / SUM(t_i) + logit(winrate_of_team_1s_race)
The error on the prediction is Game_outcome - P
If you’re familiar with the math of logistic regression, the update rule for players on team 1 becomes
s_i <- s_i + t_i / SUM(t_i) * (Game_outcome - P)
and the inverse of this for team 2.
What does this mean in english? We predict the outcome of the game based on the players’ skill and how long they each played in the game. After the game, we update each player’s skill by the product of what fraction of the game they played, and the difference between our prediction and what actually happened.
This system has a bunch of desirable properties:
1. If one team smashes another, but the teams were stacked to make that outcome almost certain, nobody’s skill level changes at the end of the round. Only unexpected victories change skill levels.
2. Nothing you do during the round other than winning the game has any effect on your skill level. This means that there’s no incentive to rack up kills at the end of the game rather than finishing it, or to play skulk instead of gorge, or to go offense rather than build.
3. The effect on your score is determined by the time you spent playing the round rather than your points, with the beginning of the game weighted much higher than the end. This means that it doesn’t harm you to join a game that is already lost, because you’ll have played for a very small fraction of the weighted time spent in the game.