使用python3.7.2 实现大名鼎鼎的Elo Score等级分制度
在年度影片《社交网络》中,影片开场,马克扎克伯克和他的女朋友在酒馆里因为琐事分手,气急败坏的他回到了宿舍,在舍友的鼓励和帮助下,充分发挥了作为技术天才的动手能力,做出了Facemash网站,对大学女生的相貌进行分级打分,结果网站访问流量过大,直接把大学网络都搞宕机了。而Facemask就是著名的FaceBook的前身,Facemask大受欢迎的关键就在于扎克伯格的同学爱德华多(他也是facebook的联合创始人之一)写在窗户上的排名公式
这个公式就是鼎鼎有名的ELO等级分制度
ELO的应用非常广泛,大部分棋类比赛,现在流行的MODB游戏,像11平台的DOTA天梯系统,以及炉石传说匹配对手系统,都是采用ELO等级分。
ELO等级分制度是由匈牙利裔美国物理学家Elo创建的一个衡量各类对弈活动选手水平的评分方法,是当今对弈水平评估的公认的权威方法。被广泛应用于国际象棋、围棋、足球等运动,以及很多网游与电子竞技产业。游戏界比较著名的应用有: Fifa online,炉石传说、DOTA、LOL。
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
这里用python来实现以下Elo score
#Ra:A玩家当前的积分 #Rb:B玩家当前的积分 #ea = 1 / 1 + 10 的方 (rb-ra) / 400 class EloScore: #定义胜负关系 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 #定义阈值 k值 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,(rating2-rating1)/400)) if __name__ == "__main__": #实例化一个对象 eloscore = EloScore() #打印胜率 print(eloscore.computeScore(1500,1800)) #打印等级 print(eloscore.computeK(1500)) print(eloscore.computeK(1800))