Quote:Original post by BTownTKD
Why not come up with a "weight" system, instead of relying solely on "player rating."
For any given player looking for a match, every other potential player would have a "weight," determining the likelyhood of the 2 players being paired up.
"Player ratings" would effect the weight the most, so players with a large rating difference will have (virtually) no chance of playing each other, and the likelihood increasing as player skill-levels become closer. However, other things will effect the weight to a lesser degree;
- "wait time" - how long a player has been waiting for a match.
- "recent-ness" of a partner-pairing - How recently have these 2 players been paired together? This effect will slowly dissipate after a few matches with other players.
This would ideally create kind of a bell curve, with players of identical skill levels being paired up most often, with the likelihood decreasing quickly as skill-levels differ.
The thing is, that I don't have a list of players that I could base my decision on, without an arbitrary waiting time for the whole system. Let's assume I have a weight system:
Player0 at 0 Rating
Player1 at 1000 Rating
=> Match (only 2 teams in the list, which means their probability to match is 1)
The same will happen for every match-up. There will be no decision made, but teams will always match immediately every opponent.
The only way to make a decision here, is by making the whole system wait for an arbitrary time frame, to have a list of players queuing and then make a proper decision. This is somewhat my suggestion 2 since I will make there a probability distribution, which is in this case only weighted on rating difference.
Quote:Original post by hplus0603
My observation: In general, the way you do these matches is very similar to a broad-phase collision test: You want to find overlaps among ranges of values. You could view the allowable match set as a volume in a multi-dimensional parameter space, and you want to find all intersections within that space. Thus, I would imagine that various broad-phase algorithms would work well, assuming you can adopt them to having different types among different axes.
I would probably start with sweep-and-prune. Put all the teams on a single axis (the score). Sort the axis. Then walk along that axis, collecting teams into a "potential match pool" as you enter their "lower" range, and removing them from the pool as you leave their "upper" range. I would probably start by trying to find the best possible match for the team as it's being removed from the match pool, by examining each other team in the pool at the time.
I would increase the "size" of the "match shape" by age in the queue. You could run the algorithm once a second, say, and remove any matches made during each run from the list of potential candidates.
If I understood this idea correctly (sorry, I am not that familiar with collision detection.), this idea would also require an arbitrary time frame, to create a list of players and then make a decision based on that list of players. Thus, I would need to wait for several players joining (the time frame can be reduced, by calling the system after a certain amount of players are in the list as well.). The overall idea to use a "collision system" to find matches, if I have a player list is pretty nice though.
If I look at this problem in a more abstract way:
I can only make a proper decision, if I have a list of players I can choose from (aka arbitrary time frame) or if I have a "game history" I can base my decision on. (The case of simply increasing the rating difference with a timer is ignored here, since a decision based on that is simply not a good decision and leaves expert and "noob" players at very long waiting times.)
The idea of an arbitrary time frame(i.e. 2 min) would increase the waiting times for several cases quite a lot, but somewhat average it over all ratings:
Player0 at 1500 rating queues
Player1 at 1500 rating queues
They now have an average waiting of 1 min, which is really unnecessary.
The "game history" idea (my suggestion 3), would base it's decision on games that previously took place and shape the rating differences accordingly. It's based on the idea that usually players will not only queue once, but several times in a row and thus they will be matching at a similar rating for quite a while.
Quote:Original post by Hazerider
Instead of looking at max rating differences, you should look at percentiles, and match players who are with X% of each other. In effect this is really your solution 3 where the rating difference is determined automatically, based on the distribution of ratings.
In case what I am saying is unclear, for example, a player who is in the top 10% of ratings should only be matched with a player who is between top 5% and 15% of ratings. You could force a redraw (or a few) if you match up players who played against each other in the last X matches.
Do you have other ideas on how to "transfer" the percentile idea into a "game history"? I tried looking at it from the percentile idea itself, but I ran into several dead ends like that. If I look at it from the "suggestion 3", I run into a very complex implementation.
PS.: Thanks for all the ideas presented. I think it's somewhat strange that there are no articles about this topic, since this should be a very common problem, solved in several professional games.
PPS.: The more I think about this problem, it seems to get more and more complex....