ELO算法原理及实现

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值