[Math] An algorithm to rate players in team

algorithmsgame theoryscoring-algorithm

I would like to design an algorithm to rate players in a team sport.
One team of N players plays a match against another team of N players.
The individual players will possibly change, from match to match.
Matches are repeated every time interval T.
Each player has a skill value, initially the same for all players.
Teams are composed casually.
Every match produces a result: team-1 wins / team-2 wins / draw (it should be possible to consider the numerical result, if requested, but it' not mandatory).

The algorithm should assign a proper skill to each player, based upon the player's skill, the skill confidence value (it's variance?), the match result and the team-mates skill.
The skill is supposed to refine with time, with the goal – after some amount of time – to suggest optimal (i.e.: most balanced) team composition.

I would like to know if a similar algorithm already exists, or have a clue to implement it myself (I quite newbie in mathematics, sorry… :-().

P.S.: I already checked 'Trueskill' and 'Elo' algorithms, but they all seem oriented to 'one-to-one' games…

Best Answer

I would suggest an idea based upon 1 team vs 1 team. Assign the "score" (+1 for a win, +0.5 for a draw) to every player who played that game. Normalize each player's score against the number of games they play (this eliminates popularity bias), and over time, the best players (highest normalized score) should float to the top. This is a kind of variation of the ant-colony algorithm used for solving the traveling salesperson problem.

Example:

  • 4 players per team with X.Y (X=name,Y=skill level)
  • Team 1: 1.1, 2.2, 3.3, 4.4
  • Team 2: 5.2, 6.2, 7.3, 8.3
  • Score 1: 0, 0, 0, 0
  • Score 2: 0, 0, 0, 0

Randomly pulling 2 players at a time (high "skill total" wins).

  1. Team 1: 1.1,2.2 Team 2: 6.2,7.3 => Team 2 wins
  2. Score 1: 0,0,0,0 Score 2: 0,1,1,0
  3. Team 1: 2.2,3.3 Team 2: 6.2,7.3 => Draw
  4. Score 1: 0,0.25,0.25,0 Score 2: 0.5,0.75,0.75,0.5
  5. Team 1: 2.2,3.3 Team 2: 6.2,7.3 => Draw
  6. Score 1: 0,0.25,0.25,0 Score 2: 0.5,0.67,0.67,0.5

This process would need to be repeated over and over to determine which "players" are better. Going to need to write a simple program to do this.

Related Question