通过ELO机制衡量各类对弈活动水平
Posted 算法与编程之美
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过ELO机制衡量各类对弈活动水平相关的知识,希望对你有一定的参考价值。
0 引言
在日常生活中有许多的比赛,如一对一的象棋、围棋等棋类比赛,也有队伍之间的比赛,如足球、篮球等球类比赛。在这些比赛中,我们总会知道有一些很强的选手、很强的队伍,但是,他们到底有多强?又或者说,我们都觉得某个选手甲比选手乙要强,可是甲比乙强了多少呢,是有六成胜率,还是八成胜率,还是几乎必胜?能不能通过数学的方法来量化这个问题?
因此,elo等级分系统诞生了。
Elo等级分系统是指由匈牙利裔美国物理学家阿帕德·埃洛创建的一个衡量各类对弈活动水平的评价方法,其目的便是为了解决如上的问题。
1 问题
怎样去衡量比赛选手水平?如何通过python实现elo分数?
2 方法
Elo的想法很简单,比大小。如果我们能用一个分数去评估选手的实力,甲2000分,乙1800分,2000比1800要大,那就说明甲的实力是要强于乙的。
但是,乙也有战胜甲的可能。因为甲可能在某场比赛中发挥失常,只发挥出了1800的水平,而乙发挥超常,达到了2000分的水平,这样乙就战胜了甲。
为了解决这个问题,我们可以不妨认为选手的发挥是服从正态分布的——比如甲服从平均值为2000的正态分布,就是在说他有极大多数时候的发挥水平都在2000附近,也有很低的可能到1800以下或者2200以上。这样,根据正态分布的公式,就能得到选手之间的预期胜率。这个公式本来是个比较难以计算的积分式,但是可以用非常简单的另一个近似公式计算。
现在我们可以用一个分数来代表一个选手的实力水平了,现在甲乙选手各有自己的等级分,如果他们进行比赛,赢的一方代表他的实力更强,因此应当提高胜方的elo积分,同理也要降低败方的elo积分。
比如目前甲是1500分,乙是1600分。我们知道,甲乙对战,明显乙更容易占优势,因此如果乙胜利
现在甲乙进行竞技,根据公式,
如果甲胜利了,甲将更新他的elo等级分为1520.5分,而乙的积分将掉到1579.5分,相当于扣除了乙的20.5分给甲。如果乙胜利了,将扣除甲的12分给乙,甲变为1488分,乙变为1612分。
而如果是实力相差悬殊的比赛,甲2000分对阵乙1200分,甲的预期胜率已经极度接近100%,那么他们的elo分不会发生任何变化。
我们不妨假设,在某一个特定时期,一位选手的平均实力不会出现较大的波动,那么他进行的比赛次数越多,他的elo等级分就会越来越接近他的真实实力的等级分。
现在我们可以将一个队伍看成是一名选手,这样在队伍比赛的时候,就可以得到某支队伍的elo等级分了。
3 实验结果与讨论
代码清单 1
Calss Eloscore: ELO_RESULT_WIN=1 ELO_RESULT_LOSS=-1 ELO_RESULT_TIE=0 ELO_RATING_DEFAULT=1500 ratingA=0 ratingB=0 def __init__(self): self.ratingA= ratingA self.ratingB= ratingB def comuteK(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)) |
4 结语
针对许多类似球类,游戏等对弈的公平性问题,使用elo机制分数衡量方法,通过求elo分数实验,证明出可以用elo机制衡量个人选手或者队伍水平,以达到游戏或比赛的公平性。本方法只是单方面考虑比赛成绩,没有顾及到另外方面的特殊情况,所以要想更公平的实现比赛等,还需从多发方面考虑,升级算法,更精准评估。
以上是关于通过ELO机制衡量各类对弈活动水平的主要内容,如果未能解决你的问题,请参考以下文章