Recently made a tournament bracket where players can sign up and participate in a chance to get the winning spot. As you can see, here is a picture of it:
Once the tournament bracket is finished, I plan to convert these winnings into rankings. So, as a result, "Achilles" would be ranked #1 since he did the best in the tournament, then #2 would be "rjg 2", and so on. The reason why the tournament bracket would be converted into rankings is because now I want to give players the opportunity of creating matches against other players. This is significant because even though a tournament bracket works, it does not contain the outcome of every possible match between the players. That's fine, the tournament bracket is just there to give others a basic representation of who is the best/worst. However, once the tournament bracket is converted to rankings, new users also have the opportunity to sign up, allowing for more players to compete against each other. Now, before I begin the rankings part, I want to attempt to use Elo ranking in the matches. My problem is, I need to assign these players in the tournaments points. This is tricky because If i'm not careful my K value can mess with the order of things. Here is my table:
#1 Achilles
#2 rjg 2
#3 gg
#4 beta 1
#5 dfgsdf
#6 test2
#7 rjgtest
#8 rocket
I need to assign each player "points" to reflect the rankings. This means #1 Achilles would have the most points while #2 would be rjg2 and so on... However, with the way Elo works, I'm unaware on how much points to assign. If I do it too ranged, the players won't ever have any chance to move up in the rankings, but if I do it too small, the ranks will be constantly altering.
For example, if I set my table up like so:
1 1000
2 900
3 800
4 700
5 600
6 500
7 400
8 300
9 200
10 100
Where #1 would have 1,000 points, #2 would have 900 points, and so on. If rank #10 beats rank #1, it's obviously VERY unlikely. So, when I do the math with elo, here is what happens:
So if I go about it this way (based off of the way it is explained here ), lets say I have rank #10 facing rank #1. According to the website above, my formula is:
R' = R + K * (S - E)
and the rating of #10 only has 100 points where #1 has 1,000. So after doing the math rank #10's expected value of beating #1 is:
1 / [ 1 + 10 ^ ( [1000 - 100] / 400) ]
= 0.0055%
0.55% is very low and makes sense, Rank #10 almost has no chance of beating someone as good as Rank #1. However, if he was to beat him, here is the result:
100 + 32 * (1 - 0.0055)
= 131.824
He would only gain 31 points when beating a player ranked as #1. This obviously won't work but I can either decrease the range in points or increase my K factor.
Does anyone have any suggestions to make this work? Or maybe suggest I rank my players a different way?
I'm afraid I don't know much about Elo ratings, but I understand that choosing an appropriate K value can be problematic.
I know that often the K value is altered depending on how many games a player has played. A player who has played many games is given a lower K value, so their rating does not change too much (because we are more certain about their rating, we want it to remain fairly constant). Similarly a player who has not played many games would get a higher K value (we are less certain about their rating, so we don't mind if it moves about more).
One alternative approach is to use ratings systems which try to incorporate a measure of our uncertainty about a player's rating. For example, the Glicko rating system or Microsoft's TrueSkill algorithm. These systems build up their own estimates of the variability in (or uncertainty about) a player's skill level, so you don't need to set a K value.
There is a very good Python implementation of TrueSkill at http://trueskill.org, written by Heungsub Lee, with plenty of examples of how to use the library. A player's rating comprises a mean (representing their estimated skill) and a standard deviation (representing our uncertainty about their skill).
TrueSkill is used by Microsoft for matchmaking on many Xbox games, so should be a good fit for your intention of matching players of similar ability.