views:

139

answers:

1

I have a ghost++ bot that hosts games of Dota (a warcraft 3 map that is played 5 players versus 5 players) and I'm trying to come up with good formulas to balance the players going into a match based on their records (I have game history for several thousand games). I'm familear with some of the concepts required to match up players, like confidence based on sample size of the number of games they played, and also perameter approximation and degrees of freedom and thus throwing out any variables that don't contribute enough to the r^2. My bot collects quite a few variables for each player from each game:

The Important ones:
Win/Lose/Game did not finish
# of Player Kills
# of Player Deaths
# of Kills player assisted

The not so important ones:
# of enemy creep kills
# of creep sneak attacks
# of neutral creep kills
# of Tower kills
# of Rax kills
# of courier kills

Quick explination: The kills/deaths don't determine who wins, but the gold gained and lost from this usually is enough to tilt the game. Tower/Rax kills are what the goal of the game is (once a team looses all their towers/rax their thrown can be attacked if that is destroyed they lose), but I don't really count these as important because it is pretty random who gets the credit for the tower kill, and chances are if you destroy a tower it is only because some other player is doing well and distracting the otherteam elsewhere on the map.

I'm getting a bit confused when trying to deal with the fact that 5 players are on a team, so ultimately each individual isn't that responsible for the team winner or losing.

Take a player that is really good at killing and has 40 kills and only 10 deaths, but in their 5 games they've only won 1. Should I give him extra credit for such a high kill score despite losing? (When losing it is hard to keep a positive kill/death ratio) Or should I dock him for losing assuming that despite the nice kill/death ratio he probably plays in a really greedy way only looking out for himself and not helping the team?

Ultimately I don't think I have to guess at questions like this because I have so much data... but I don't really know how to look at the data to answer questions like this. Can anyone help me come up with formulas to help team balance and predict the outcome?

Thanks, Dan

+2  A: 

I think part of the problem is that it's a team based game, and as such, the total of a team's ability is not strickly the sum of the player's abilitys. Player combinations of the same or different styles may compliment or hinder the team as a whole, thus varying the team's overall ability regardless of the players' individual skill levels.

Perhaps you need a method for categorizing each player into a "player type", and then run an analysis of the past data to see how the different sets of player types combine, which you could then use to weight you team ratings.

jball
Well, there are 60 or so heroes to choose from. I host games where players are given a random hero. A 3 kills/3 deaths might be good for some heroes but terrible for some assasin heroes. Part of my problem is that most players have 5 or fewer games, so it doesn't give much much to categorize individuals on. I may just have to dismiss "style" as noise that takes me further from my desired r^2. Player types are going to be a continuim... and so we'd be giving each player at least a 2 dimensional score (skill+type) which might be too much to draw from the limited sample of each player.
Dan
Ran out of characters... I appriciate your feedback and will try to take a look to see if I can see distinct types that contribute to win/lose and see if I can come up with some meaningful charactoristics. Ultimately I'm going to have to experiment with a lot of different ways of cutting the data and just see what is best... no single model will gareentee to be the best variable regression.
Dan
Even a rough one or two parameter player type might be enough to build useful team weightings out of. Perhaps things like Stance = "Offensive/Defensive", Aggression focus = "Player/Creep/Building", Style = "Solo/Group".
jball