本文主要是介绍【Algorithm】藏在Ranking中的ELo,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
- 写在前面的
- ELO
- 什么是ELO算法
- 算法模型
- 算法原理
- 验证
- 总结
写在前面的
今天偶尔在BlueHole的HOT FIX&UPDATES的说明中看到了下面的一段话:Next Tuesday, August 1st, we will reset our leaderboard once again. Now that we are getting closer to launch, we will be resetting the leaderboards on the first of each month in order to test new ranking algorithms and ELO changes.
既然提到了”Ranking Algorithms and ELO changes”我就想看看ranking中是否真的存在数学模型,至少得是和我之前推测的差不多,应该是使用了一个正态分布,但是事实好像并不是这么简单。
ELO
目前我所接触的算法当中,主要都是和排序与选择有关系,真正应用到实际项目中的算法好像少之又少,有时候真的很想在一些项目中看一看除了上述之外的算法究竟是怎么工作的。如果你的想法和我一样,那么比较简单ELO就可以帮助你实现这个小目标。
什么是ELO算法?
所谓的ELO ranking system其实是一个名字叫做“阿帕德·埃洛”物理学家创建的一个衡量各类对弈活动水平的一套评价算法。比如人们熟知的棋类运动,如国际象棋、围棋,球类运动,如足球、篮球、斯诺克等,甚至是F1中也有ELO的身影。
一句话:ELO将选手的实力通过一套被所有人认可的形式进行量化,从而得出一个“分数”(姑且称之为分数,或者可以说水平值),这样我们就可以根据这个统一标准下的“分值”来对选手的综合实力进行衡量。
举一个例子,听说过或者玩过LOL的人在“排位赛”(Rank)中,根据自己隐藏分的不同,所匹配的对手或者队友都是有所差别的,这里的隐藏分就是ELO评估出来的分值,可能根据拳头公司自己对产品的需求进行了微调,但总体反映的玩家水平的情况是一样的。
算法模型
用一个经验丰富的运动员来做比较,如果参赛场次足够大(样本足够大),那么我们姑且可以认为一个运动员参赛的平均水平到底是什么样子的,其特征符合“正态分布”模型。公式的话大家高中都学过,就不贴在这里了。
很明显,一般我们认为一个运动员水平的好坏,不是单单看他哪一场发挥的好,也不是看哪一场发挥的不好,反而是他的平均水平才会是他竞技水准的标签。ELO将这个巨大的样本所反映的数据趋势作为假设,即很少有人可以打破长期以来积累的“正太分布”形势,那么就可以使用平均值作为描述水平的参数。由于衡量一个选手的水平并不能通过单一场次比赛来恒定,那么就需要根据选手的胜负平的状态来进行大样本统计,即:赢,加分;输,扣分;平,不得分。
有了这个大的模型,就需要给每个选手真正的根据输赢来分配分值,具体的分配方法请参考一片发表在微软的博客:TrueSkill™ Ranking System。文章中提到的TrueSkill分值就是我们提到的加分分值了。(如果需要翻译的小伙伴可以私信我)
算法原理
我们用胜率,也就是E(X)的期望值来表示选手的水平。
R(a)表示A选手的当前胜率或者rank分值,R(b)表示B选手当前的胜率或者rank分值
E(a)表示A选手的当前期望胜负值,E(b)表示B选手当前的期望胜负值。
这里就是期望公式啦,得出:A对B的期望胜率,E(a)=1/(1+10^[(Rb-Ra)/400]);B对A的期望胜率,E(b)=1/(1+10^[(Ra-Rb)/400]);且E(a)+E(b)=1
同时,S(a)表示队伍A的比赛结果,胜利S值为1,平局S值为0.5,失败S值为0
所以有了上面的式子,那么一场比赛下来,新的胜率或者Rank分数就诞生了:R’(a)=R(a)+(S(a)-E(a))。由于不同的比赛,所得到的RANK分数或者胜率的增加值是不同的,所以就需要引入一个常数K,即R’(a)=R(a)+K(S(a)-E(a)),这里就用查来的魔兽世界WOW的K值作为计算标准,即K=32(wow里的k值可以通过两个1500队伍的比赛推算出,输赢个16,所以k=32)后面再讲K到底是什么。
验证
下面我们用SOLO赛来进行一次模拟,选手A隐藏分1100分,选手B1200分,预估A的胜负值:E(a)=1/(1+10^[(1200-1100)/400])=0.36,预估B的胜负:E(a)=1/(1+10^[(1100-1200)/400])=0.64
假设A赢了,实际胜负值为S(a)=1
A最终得分为 R’a = 1100 + 32*(1-0.36) = 1100+20.5 = 1120.5, 赢20分 B输20分。假设B赢了,实际胜负值为S(b)=1
B最终得分为 R’b = 1200 + 32*(1-0.64) = 1200+11.52 = 1211.5, 赢12分 A输12分。相信到了这里,你就明白了,为什么我玩游戏或者比赛评分的时候,赢了水平高的玩家,那么我加分会多,输给了厉害的玩家加分会少;同理,输给了不厉害的玩家会输的很多,赢了水平低的玩家会赢分很少的原理。给出了数之后我们就可以看出K值就是一个加分极限值,LOL的也就不难推测了,估计K的取值也就是K=25左右
总结
上述就是ELO算法的一些基本的理念了,我觉得这个算法非常贴切我们的日常生活,也是绝大多数人都拥有的经历,让人一眼就可以看到这个算法的本质。同时也会给我们一些其他的提示,比如阿里是如何评判一个人是否信誉良好,再比如神盾局中的那个系统—如何评判一个人是否是个“好人”?所以,我觉得算法有意思的地方恰恰就是在这里,那些基础的算法可以帮助我们解决一些固定的问题,但是帮助不了我们解决一些特有的问题,所以算法的创造才是程序是否好用的灵魂。
参考文章:竞技场积分系统ELO详解
这篇关于【Algorithm】藏在Ranking中的ELo的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!