ELO(埃洛匹配分制度)Java篇
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篇相关推荐
- PHP-校花评选-埃洛等级分系统(Elo rating system)
校花是怎么评出来的 转载自:https://www.shiyanlou.com/courses/document/990 源程序地址:http://download.csdn.net/detail/u ...
- 看完这篇你还敢说分不清 Java 类 对象 实例 变量间的区别?
看完这篇你还敢说分不清 Java 类 对象 实例 变量间的区别? 什么是类? 什么是对象? 什么是变量? 对象和类的关系: Java中的类: Java中的对象 Java中的变量 Java 中调用 对象 ...
- 埃洛等级分系统【转自百度百科】
ELO算法即埃洛等级分系统. 是指由匈牙利裔美国物理学家阿帕德·埃洛创建的一个衡量各类对弈活动水平的评价方法,是当今对弈水平评估的公认的权威方法.被广泛用于国际象棋.围棋.足球.篮球等运动. 1历史编 ...
- web自动化如何在不同浏览器运行_如何给树莓派搭建WEB开发运行环境之JAVA篇
在上一篇,我们已经脱掉了她华丽的外衣,你不用再添加任何华而不实的装饰,一切都交给CLI来搞定.树莓派WEB开发运行环境之JAVA篇,只需5个步骤: 安装JAVA开发包 安装和运行maven 创建JAV ...
- 面试宝典Java篇(基础+高级+集合+线程+IO+JVM)
一.Java篇 1.1 Java基础篇 1.请你讲讲&和&&的区别? &运算符有两种用法:(1)按位与:(2)逻辑与. &&运算符是短路与运算. 逻辑与 ...
- 如何给树莓派搭建WEB开发运行环境之JAVA篇
在上一篇,我们已经脱掉了她华丽的外衣,你不用再添加任何华而不实的装饰,一切都交给CLI来搞定.树莓派WEB开发运行环境之JAVA篇,只需5个步骤: 安装JAVA开发包 安装和运行maven 创建JAV ...
- 利用动态二进制加密实现新型一句话木马之Java篇(转) 冰蝎
概述 本系列文章重写了java..net.php三个版本的一句话木马,可以解析并执行客户端传递过来的加密二进制流,并实现了相应的客户端工具.从而一劳永逸的绕过WAF或者其他网络防火墙的检测. 本来是想 ...
- [业界] 关于诺基亚,上来吐槽两句埃洛普,顺便爆点料。
关于诺记裁员一万人这个消息相信大家这两天已经看到了. 关于这一万的构成可能没有详细的说. 其中有一部分是原来Trolltech的大部分员工,可以说诺基亚打算剥离Qt这部分资产了. 诺基亚这几年一直都想 ...
- 明翰Java教学系列之认识Java篇V1.3(持续更新)
文章目录 传送门 前言 什么是Java? Java之父 `Java的应用场景` Java部分特点 Java工作机制 JDK(Java Development Kit) JRE(Java Runtime ...
最新文章
- SpringBoot开发案例从0到1构建分布式秒杀系统
- 【内有网易黑猪肉券福利】网易MCTalk首秀——在线教育是一场马拉松
- 记录我对Padding Oracle攻击的分析和思考之抄写
- mysql 异地备份工具_异地备份简单实现(mysql)
- where里能用max吗_超市里四五元钱的速冻饺子能买吗?
- DM8168芯片级资源
- SHELL实战day12
- JS学习:第一周——NO.1预解释
- 修改notebook的默认路径_更改jupyter notebook默认存储路径
- C# 实体类序列化与反序列化一 (XmlSerializer)
- BPF 之巅:洞悉 Linux 系统和应用性能
- 《电子元器件的可靠性》——3.7节电子元器件失效率鉴定试验
- html批量处理图片尺寸,如何批量修改图片尺寸
- Gmail邮箱怎么获取授权码?熟悉一下
- 为什么祖传代码被称为「屎山」?这个回答简直太形象了
- 决策模型(二):风险决策法
- 即将告别--新纪元网站
- problem solving automation
- java 方法互斥_Java中的互斥方法执行
- 干货,实战滴滴开源Logi-KafkaManager
热门文章
- 基于java的药店管理系统
- 怎么看虚拟机服务器ip,虚拟主机的ip怎么看 查看主机ip的方法
- Nifi实时同步mysql_nifi实现数据库到数据库之间数据同步
- 如果你对自己有要求 | “回顾,再出发”——记2020软工提问回顾与个人总结
- 京东2018校招研发笔试题记录
- Python 深拷贝和浅拷贝深析
- 国产自研系统的用户突破4亿,打破美国企业的垄断,谷歌后悔不迭
- 2020年FRM考试有哪几门?占比是多少?
- hive查看一张表的分区字段_Hive常规操作(查看和操作分区,字段,注释)
- Google Earth Engine ——基于ENVISAT的中分辨率成像光谱仪全球土地覆盖300米分辨率数据集