1. ELO算法数学实现介绍

其中表达式各字母含义:

EA:预期A玩家的胜负值

EB:预期B玩家的胜负值

RA:A玩家当前的积分
RB:B玩家当前的积分

SA:实际胜负值(A VS B),胜=1,平=0.5,负=0

SB:实际胜负值(B VS A),胜=1,平=0.5,负=0

K :常量系数

2. 程序分析

2.1 从数学的角度来看,EA + EB = 1,但实际在程序计算中,很难获取精确的EA或EB,可能导致EA + EB != 1,所以我们这里选择计算出EA,而EB由1 - EA获取,这样可以修正一定的数据误差。再者,我们知道,在ELO算法中,两个玩家的得失分总是相抵的,也就是说,两个玩家的总分是不变的(在积分不存在限制的情况下),这样我们只要得出一个玩家的本次所增加的积分(失败表示增加的积分为负),便可求出其对手的积分变化情况。

2.2 在现实的业务场景中,积分总是以整数方式存在着,所以我们对计算所得的积分进行处理,数字从浮点型变成整型一般方式有:四舍五入,去尾及其它方式,在我看来,玩家竞技对于胜利的一方,不论双方的积分相差较大或较小,能应该增加积分,基于此考虑,我选择偏离0取整(即正数向上取整,负数向下取整),以保证每次不为和局的竞技都会产生积分变动。

2.3 另一个在实现中遇到的问题,是由2.1使用的方式引起的,即可能产生由公式计算而来的EB和由1 - EA计算而来的EB之间存在错误(精度问题),这将导致出现相同数据计算结果不同的问题。举个例子,由参数(A的积分,B的积分,A胜B)和参数(B的积分,A的积分,B负A)计算出来的结果是不一样的,就比如说,由参数(A的积分,B的积分,A胜B)算出的EA是0.516,而由(B的积分,A的积分,B负A)算出来的EB是0.481,这是有可能的,因为精度及取舍问题产生,所以,我们必须解决这个结果不可重复的问题。解决方式至少有两种,第一次,我们统一由胜利的一方计算出变动积分,但这个时候还要另外处理和局的情况。所以我使用另一种方式,统一由积分高的一方计算出变动积分,以下是JAVA代码实现:

import java.math.BigDecimal;public class EloMatch {public static void main(String[] args) {System.out.println("我启动了");int aScore = 100;int bScore = 50;float sa = 0;int k = 16;EloResult eloResult = EloUtils.rating(aScore, bScore, sa, k, false);if (sa == 1) {System.out.println("A 赢了比赛后得分:" + eloResult.getRa());System.out.println("B 输了比赛后得分:" + eloResult.getRb());} else if (sa == 0) {System.out.println("A 输了比赛后得分:" + eloResult.getRa());System.out.println("B 赢了比赛后得分:" + eloResult.getRb());}}
}class EloUtils {private final static BigDecimal DONE = new BigDecimal("1.0");private final static BigDecimal D400 = new BigDecimal("400.0");/** 通过ELO算法计算比赛得分* ra        玩家A本轮比赛前得分* rb        玩家B本轮比赛钱得分* sa        A VS B 结果:胜利 1,平 0.5,失败 0  sa代表A玩家胜利或失败结果,统一由分数高的一方计算出积分变动的情况,若分数相同选择其中一方计算* k         极限值,代表理论上最多可以赢的分数和失去的分数* Limit     是否开启下限为0的限制* return    比赛结束后返回A,B玩家的得分和失分*/public static EloResult rating(int ra, int rb, float sa, int k, boolean limit) {//统一由分数高的一方计算出积分变动的情况if (ra > rb) {EloResult result = rating(rb, ra, 1.0f - sa, k, limit);int temp = result.getRa();result.setRa(result.getRb());result.setRb(temp);return result;}BigDecimal ea = DONE.divide(DONE.add(new BigDecimal(Math.pow(10, new BigDecimal(rb - ra).divide(D400, 6, BigDecimal.ROUND_HALF_UP).doubleValue()))), 6, BigDecimal.ROUND_HALF_UP);double score = new BigDecimal(k).multiply(new BigDecimal(sa).subtract(ea)).doubleValue();//为正数变动积分向上取证int scoreI = (int) Math.ceil(score);if (score < 0d) { //为负数变动积分向下取证scoreI = (int) Math.floor(score);}EloResult elo = new EloResult();elo.setRa((ra + scoreI < 0 && limit) ? 0 : ra + scoreI);elo.setRb((rb - scoreI < 0 && limit) ? 0 : rb - scoreI);return elo;}
}class EloResult {/** 玩家A本轮比赛后得分*/private int ra;/** 玩家B本轮比赛后得分*/private int rb;public int getRa() {return ra;}public void setRa(int ra) {this.ra = ra;}public int getRb() {return rb;}public void setRb(int rb) {this.rb = rb;}
}

ELO(埃洛匹配分制度)Java篇相关推荐

  1. PHP-校花评选-埃洛等级分系统(Elo rating system)

    校花是怎么评出来的 转载自:https://www.shiyanlou.com/courses/document/990 源程序地址:http://download.csdn.net/detail/u ...

  2. 看完这篇你还敢说分不清 Java 类 对象 实例 变量间的区别?

    看完这篇你还敢说分不清 Java 类 对象 实例 变量间的区别? 什么是类? 什么是对象? 什么是变量? 对象和类的关系: Java中的类: Java中的对象 Java中的变量 Java 中调用 对象 ...

  3. 埃洛等级分系统【转自百度百科】

    ELO算法即埃洛等级分系统. 是指由匈牙利裔美国物理学家阿帕德·埃洛创建的一个衡量各类对弈活动水平的评价方法,是当今对弈水平评估的公认的权威方法.被广泛用于国际象棋.围棋.足球.篮球等运动. 1历史编 ...

  4. web自动化如何在不同浏览器运行_如何给树莓派搭建WEB开发运行环境之JAVA篇

    在上一篇,我们已经脱掉了她华丽的外衣,你不用再添加任何华而不实的装饰,一切都交给CLI来搞定.树莓派WEB开发运行环境之JAVA篇,只需5个步骤: 安装JAVA开发包 安装和运行maven 创建JAV ...

  5. 面试宝典Java篇(基础+高级+集合+线程+IO+JVM)

    一.Java篇 1.1 Java基础篇 1.请你讲讲&和&&的区别? &运算符有两种用法:(1)按位与:(2)逻辑与. &&运算符是短路与运算. 逻辑与 ...

  6. 如何给树莓派搭建WEB开发运行环境之JAVA篇

    在上一篇,我们已经脱掉了她华丽的外衣,你不用再添加任何华而不实的装饰,一切都交给CLI来搞定.树莓派WEB开发运行环境之JAVA篇,只需5个步骤: 安装JAVA开发包 安装和运行maven 创建JAV ...

  7. 利用动态二进制加密实现新型一句话木马之Java篇(转) 冰蝎

    概述 本系列文章重写了java..net.php三个版本的一句话木马,可以解析并执行客户端传递过来的加密二进制流,并实现了相应的客户端工具.从而一劳永逸的绕过WAF或者其他网络防火墙的检测. 本来是想 ...

  8. [业界] 关于诺基亚,上来吐槽两句埃洛普,顺便爆点料。

    关于诺记裁员一万人这个消息相信大家这两天已经看到了. 关于这一万的构成可能没有详细的说. 其中有一部分是原来Trolltech的大部分员工,可以说诺基亚打算剥离Qt这部分资产了. 诺基亚这几年一直都想 ...

  9. 明翰Java教学系列之认识Java篇V1.3(持续更新)

    文章目录 传送门 前言 什么是Java? Java之父 `Java的应用场景` Java部分特点 Java工作机制 JDK(Java Development Kit) JRE(Java Runtime ...

最新文章

  1. SpringBoot开发案例从0到1构建分布式秒杀系统
  2. 【内有网易黑猪肉券福利】网易MCTalk首秀——在线教育是一场马拉松
  3. 记录我对Padding Oracle攻击的分析和思考之抄写
  4. mysql 异地备份工具_异地备份简单实现(mysql)
  5. where里能用max吗_超市里四五元钱的速冻饺子能买吗?
  6. DM8168芯片级资源
  7. SHELL实战day12
  8. JS学习:第一周——NO.1预解释
  9. 修改notebook的默认路径_更改jupyter notebook默认存储路径
  10. C# 实体类序列化与反序列化一 (XmlSerializer)
  11. BPF 之巅:洞悉 Linux 系统和应用性能
  12. 《电子元器件的可靠性》——3.7节电子元器件失效率鉴定试验
  13. html批量处理图片尺寸,如何批量修改图片尺寸
  14. Gmail邮箱怎么获取授权码?熟悉一下
  15. 为什么祖传代码被称为「屎山」?这个回答简直太形象了
  16. 决策模型(二):风险决策法
  17. 即将告别--新纪元网站
  18. problem solving automation
  19. java 方法互斥_Java中的互斥方法执行
  20. 干货,实战滴滴开源Logi-KafkaManager

热门文章

  1. 基于java的药店管理系统
  2. 怎么看虚拟机服务器ip,虚拟主机的ip怎么看 查看主机ip的方法
  3. Nifi实时同步mysql_nifi实现数据库到数据库之间数据同步
  4. 如果你对自己有要求 | “回顾,再出发”——记2020软工提问回顾与个人总结
  5. 京东2018校招研发笔试题记录
  6. Python 深拷贝和浅拷贝深析
  7. 国产自研系统的用户突破4亿,打破美国企业的垄断,谷歌后悔不迭
  8. 2020年FRM考试有哪几门?占比是多少?
  9. hive查看一张表的分区字段_Hive常规操作(查看和操作分区,字段,注释)
  10. Google Earth Engine ——基于ENVISAT的中分辨率成像光谱仪全球土地覆盖300米分辨率数据集