public DotaPSR(List <Player> team1, List <Player> team2) { sDebugString = ""; double[] team1weights = new double[team1.Count]; // = new List<int>(); double[] team2weights = new double[team2.Count]; // = new List<int>(); double team1weight = 0; double team2weight = 0; double team1totalpsr = 0; double team2totalpsr = 0; for (int i = 0; i < team1.Count; i++) { team1weights[i] = Math.Pow(team1[i].PSR, psf_teamRankWeighting); team1weight += team1weights[i]; team1totalpsr += team1[i].PSR; } for (int i = 0; i < team2.Count; i++) { team2weights[i] = Math.Pow(team2[i].PSR, psf_teamRankWeighting); team2weight += team2weights[i]; team2totalpsr += team2[i].PSR; } double team1avgpsr = team1totalpsr / team1.Count; double team2avgpsr = team2totalpsr / team2.Count; sDebugString += ("team1numplayers=" + team1.Count + Environment.NewLine); sDebugString += ("team2numplayers=" + team2.Count + Environment.NewLine); sDebugString += (Environment.NewLine); sDebugString += ("team1avgpsr=" + team1avgpsr + Environment.NewLine); sDebugString += ("team2avgpsr=" + team2avgpsr + Environment.NewLine); sDebugString += (Environment.NewLine); double team1rating = Math.Pow(team1weight, 1.0 / psf_teamRankWeighting); double team2rating = Math.Pow(team2weight, 1.0 / psf_teamRankWeighting); double diff = team1rating - team2rating; double team1winprobability = 1.0 / (1.0 + Math.Pow(Math.E, ((-1.0 * diff) / psf_logisticPredictionScale))); double team2winprobability = 1.0 - team1winprobability; double[] team1kfactors = new double[team1.Count]; // = []; double[] team2kfactors = new double[team2.Count]; // = []; for (var i = 0; i < team1.Count; i++) { team1kfactors[i] = ((psf_medianScalingRank - team1[i].PSR) / psf_KFactorScale) + psf_baseKFactor; team1kfactors[i] = Math.Min(team1kfactors[i], psf_maxKFactor); team1kfactors[i] = Math.Max(team1kfactors[i], psf_minKFactor); double distancefromteamavgpsr = team1[i].PSR - 50 - team1avgpsr; if (distancefromteamavgpsr > 100) { distancefromteamavgpsr = 100; } if (distancefromteamavgpsr > 0 && distancefromteamavgpsr <= 100) { var implayingwithnewbiesfactor = (100.0 - distancefromteamavgpsr) / 100; // sDebugString+= ("(scaling team1 player#" + (i + 1) + " kfactor by=" + implayingwithnewbiesfactor + ")"); team1kfactors[i] = implayingwithnewbiesfactor * team1kfactors[i]; } } for (var i = 0; i < team2.Count; i++) { team2kfactors[i] = ((psf_medianScalingRank - team2[i].PSR) / psf_KFactorScale) + psf_baseKFactor; team2kfactors[i] = Math.Min(team2kfactors[i], psf_maxKFactor); team2kfactors[i] = Math.Max(team2kfactors[i], psf_minKFactor); double distancefromteamavgpsr = team2[i].PSR - 50 - team2avgpsr; if (distancefromteamavgpsr > 100) { distancefromteamavgpsr = 100; } if (distancefromteamavgpsr > 0 && distancefromteamavgpsr <= 100) { double implayingwithnewbiesfactor = (100.0 - distancefromteamavgpsr) / 100; // sDebugString+= ("(scaling team2 player#" + (i + 1) + " kfactor by=" + implayingwithnewbiesfactor + ")"); team2kfactors[i] = implayingwithnewbiesfactor * team2kfactors[i]; } } double[] team1winpts = new double[team1.Count]; // = []; double[] team1losepts = new double[team1.Count]; // = []; double[] team2winpts = new double[team2.Count]; // = []; double[] team2losepts = new double[team2.Count]; // = []; for (int i = 0; i < team1.Count; i++) { team1winpts[i] = Math.Ceiling(team2winprobability * team1kfactors[i]); team1losepts[i] = Math.Floor(team1winprobability * team1kfactors[i]); } for (int i = 0; i < team2.Count; i++) { team2winpts[i] = Math.Ceiling(team1winprobability * team2kfactors[i]); team2losepts[i] = Math.Floor(team2winprobability * team2kfactors[i]); } iTeam1WinPerc = (team1winprobability * 100); iTeam2WinPerc = 100 - iTeam1WinPerc; sDebugString += ("team1win%=" + iTeam1WinPerc + Environment.NewLine); sDebugString += ("team2win%=" + iTeam2WinPerc + Environment.NewLine); sDebugString += (Environment.NewLine); sDebugString += ("team1kfactors="); foreach (double d in team1kfactors) { sDebugString += (d + " "); } sDebugString += ("team2kfactors="); foreach (double d in team2kfactors) { sDebugString += (d + " "); } sDebugString += (Environment.NewLine); sDebugString += ("team1 win/lose=") + Environment.NewLine; for (int i = 0; i < team1.Count; i++) { sDebugString += ("+" + team1winpts[i] + "/-" + team1losepts[i] + Environment.NewLine); DotaPlayerPSR cPlayer = new DotaPlayerPSR(team1[i].Name, team1winpts[i], -team1losepts[i]); cWinLoseDic.Add(cPlayer.Name, cPlayer); } sDebugString += (Environment.NewLine); sDebugString += ("team2 win/lose=") + Environment.NewLine; for (int i = 0; i < team2.Count; i++) { sDebugString += ("+" + team2winpts[i] + "/-" + team2losepts[i] + Environment.NewLine); DotaPlayerPSR cPlayer = new DotaPlayerPSR(team2[i].Name, team2winpts[i], -team2losepts[i]); cWinLoseDic.Add(cPlayer.Name, cPlayer); } sDebugString += (Environment.NewLine); // return str; }
public DotaPSR(List<Player> team1, List<Player> team2) { sDebugString = ""; double[] team1weights = new double[team1.Count];// = new List<int>(); double[] team2weights = new double[team2.Count];// = new List<int>(); double team1weight = 0; double team2weight = 0; double team1totalpsr = 0; double team2totalpsr = 0; for (int i = 0; i < team1.Count; i++) { team1weights[i] = Math.Pow(team1[i].PSR, psf_teamRankWeighting); team1weight += team1weights[i]; team1totalpsr += team1[i].PSR; } for (int i = 0; i < team2.Count; i++) { team2weights[i] = Math.Pow(team2[i].PSR, psf_teamRankWeighting); team2weight += team2weights[i]; team2totalpsr += team2[i].PSR; } double team1avgpsr = team1totalpsr / team1.Count; double team2avgpsr = team2totalpsr / team2.Count; sDebugString += ("team1numplayers=" + team1.Count + Environment.NewLine); sDebugString += ("team2numplayers=" + team2.Count + Environment.NewLine); sDebugString += (Environment.NewLine); sDebugString += ("team1avgpsr=" + team1avgpsr + Environment.NewLine); sDebugString += ("team2avgpsr=" + team2avgpsr + Environment.NewLine); sDebugString += (Environment.NewLine); double team1rating = Math.Pow(team1weight, 1.0 / psf_teamRankWeighting); double team2rating = Math.Pow(team2weight, 1.0 / psf_teamRankWeighting); double diff = team1rating - team2rating; double team1winprobability = 1.0 / (1.0 + Math.Pow(Math.E, ((-1.0 * diff) / psf_logisticPredictionScale))); double team2winprobability = 1.0 - team1winprobability; double[] team1kfactors = new double[team1.Count];// = []; double[] team2kfactors = new double[team2.Count];// = []; for (var i = 0; i < team1.Count; i++) { team1kfactors[i] = ((psf_medianScalingRank - team1[i].PSR) / psf_KFactorScale) + psf_baseKFactor; team1kfactors[i] = Math.Min(team1kfactors[i], psf_maxKFactor); team1kfactors[i] = Math.Max(team1kfactors[i], psf_minKFactor); double distancefromteamavgpsr = team1[i].PSR - 50 - team1avgpsr; if (distancefromteamavgpsr > 100) { distancefromteamavgpsr = 100; } if (distancefromteamavgpsr > 0 && distancefromteamavgpsr <= 100) { var implayingwithnewbiesfactor = (100.0 - distancefromteamavgpsr) / 100; // sDebugString+= ("(scaling team1 player#" + (i + 1) + " kfactor by=" + implayingwithnewbiesfactor + ")"); team1kfactors[i] = implayingwithnewbiesfactor * team1kfactors[i]; } } for (var i = 0; i < team2.Count; i++) { team2kfactors[i] = ((psf_medianScalingRank - team2[i].PSR) / psf_KFactorScale) + psf_baseKFactor; team2kfactors[i] = Math.Min(team2kfactors[i], psf_maxKFactor); team2kfactors[i] = Math.Max(team2kfactors[i], psf_minKFactor); double distancefromteamavgpsr = team2[i].PSR - 50 - team2avgpsr; if (distancefromteamavgpsr > 100) { distancefromteamavgpsr = 100; } if (distancefromteamavgpsr > 0 && distancefromteamavgpsr <= 100) { double implayingwithnewbiesfactor = (100.0 - distancefromteamavgpsr) / 100; // sDebugString+= ("(scaling team2 player#" + (i + 1) + " kfactor by=" + implayingwithnewbiesfactor + ")"); team2kfactors[i] = implayingwithnewbiesfactor * team2kfactors[i]; } } double[] team1winpts = new double[team1.Count];// = []; double[] team1losepts = new double[team1.Count];// = []; double[] team2winpts = new double[team2.Count];// = []; double[] team2losepts = new double[team2.Count];// = []; for (int i = 0; i < team1.Count; i++) { team1winpts[i] = Math.Ceiling(team2winprobability * team1kfactors[i]); team1losepts[i] = Math.Floor(team1winprobability * team1kfactors[i]); } for (int i = 0; i < team2.Count; i++) { team2winpts[i] = Math.Ceiling(team1winprobability * team2kfactors[i]); team2losepts[i] = Math.Floor(team2winprobability * team2kfactors[i]); } iTeam1WinPerc = (team1winprobability * 100); iTeam2WinPerc = 100 - iTeam1WinPerc; sDebugString += ("team1win%=" + iTeam1WinPerc + Environment.NewLine); sDebugString += ("team2win%=" + iTeam2WinPerc + Environment.NewLine); sDebugString += (Environment.NewLine); sDebugString += ("team1kfactors="); foreach (double d in team1kfactors) { sDebugString += (d + " "); } sDebugString += ("team2kfactors="); foreach (double d in team2kfactors) { sDebugString += (d + " "); } sDebugString += (Environment.NewLine); sDebugString += ("team1 win/lose=") + Environment.NewLine; for (int i = 0; i < team1.Count; i++) { sDebugString += ("+" + team1winpts[i] + "/-" + team1losepts[i] + Environment.NewLine); DotaPlayerPSR cPlayer = new DotaPlayerPSR(team1[i].Name, team1winpts[i], -team1losepts[i]); cWinLoseDic.Add(cPlayer.Name, cPlayer); } sDebugString += (Environment.NewLine); sDebugString += ("team2 win/lose=") + Environment.NewLine; for (int i = 0; i < team2.Count; i++) { sDebugString += ("+" + team2winpts[i] + "/-" + team2losepts[i] + Environment.NewLine); DotaPlayerPSR cPlayer = new DotaPlayerPSR(team2[i].Name, team2winpts[i], -team2losepts[i]); cWinLoseDic.Add(cPlayer.Name, cPlayer); } sDebugString += (Environment.NewLine); // return str; }