通过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机制衡量各类对弈活动水平的主要内容,如果未能解决你的问题,请参考以下文章

TrueSkill 原理及实现

基于胜率矩阵的PageRank排序

基于胜率矩阵的PageRank排序

洛谷 P1626 象棋比赛

对弈机器人与图像识别

极狐GitLab硬实力助力中国开源生态建设