elo等级分制度应用很广泛,大部分棋类比赛和网络游戏都会用到,比如国际象棋,我们比较熟悉的手游王者荣耀等都是应用了这个机制。
ELO计算方法:
Ra:A玩家当前的积分
Rb:B玩家当前的积分
Sa:实际胜负值,胜=1,平=0.5,负=0
Ea:预期A的胜负值,Ea=1/(1+10(Rb-Ra)/400)
Eb:预期B的胜负值,Eb=1/(1+10(Ra-Rb)/400)
E值也为预估,Ea+Eb=1
R'a:A玩家进行一场比赛之后的积分,R'a=Ra+k(Sa - Ea);其中k是一个常量系数,k值的大小直接关系到根据胜负关系计算出的积分变化值。
通常水平越高的比赛中,其k值越小,这样做的目的是避免少数的几场比赛就能改变高端顶尖玩家的排名
class Elorating: ELO_RESULT_WIN = 1 ELO_RESULT_LOSS = -1 ELO_RESULT_TIE = 0 ELO_RATING_DEFAULT = 1500 ratingA = 0 ratingB = 0 def __init__(self, ratingA = ELO_RATING_DEFAULT, ratingB = ELO_RATING_DEFAULT): self.ratingA = ratingA self.ratingB = ratingB def setResult(self, result): scoreAwin = self.computeScore(self.ratingA, self.ratingB) scoreBwin = self.computeScore(self.ratingB, self.ratingA) score_adjust = 0 if result == self.ELO_RESULT_WIN: score_adjust = 1 elif result == self.ELO_RESULT_LOSS: score_adjust = 0 else: score_adjust = 0.5 self.ratingA = self.ratingA + self.computeK(self.ratingA) * (score_adjust - scoreAwin) self.ratingB = self.ratingB + self.computeK(self.ratingB) * (score_adjust - scoreBwin) def computeK(self, rating): if rating >= 2400: return 16 elif rating >= 2100: return 24 else: return 36 def computeScore(self, rating1, rating2): return 1 / (1+pow(10, (rating1 - rating2) / 400)) pass