ELO算法的JAVA实现

article/2025/11/9 15:38:24

近期接手一个游戏项目,由于项目涉及得分计算,故研究了下ELO算法。关于ELO算法的程序实现,是少之又少,好不容易看到了一篇,最终不得不关闭该页面,故决定自己实现。

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代码实现:

package com.wulizhou.util;import java.math.BigDecimal;import com.wulizhou.modules.ELOResult;public class ELOUtils {private final static BigDecimal DONE = new BigDecimal("1.0");private final static BigDecimal D400 = new BigDecimal("400.0");/*** 通过ELO算法计算竞技得分* @param ra		玩家A本轮竞技前得分* @param rb		玩家B本轮竞技前得分* @param sa		A vs B 结果:<PRE>胜利	1<br>平	0.5<br/>失败	0</PRE>* @param k			极限值,代表理论上最多可以赢一个玩家的得分和失分* @param 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;}}
以下是ELOResult类代码

package com.wulizhou.modules;public 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实现,关于ELO算法所解决的问题及算法详情,请自行百度。

好了,今天的分享就到这里了,由于是个人经验总结,难免会出错,欢迎大家批评指正,万般感谢。




http://chatgpt.dhexx.cn/article/iN1efxkX.shtml

相关文章

数值 ELO算法教程

ELO是什么&#xff1f; 是指由匈牙利裔美国物理学家阿帕德埃洛创建的一个衡量各类对弈活动水平的评价方法&#xff0c;是当今对弈水平评估的公认的权威方法。被广泛用于国际象棋、围棋、足球、篮球等运动。 埃洛排名系统是基于统计学的一个评估棋手水平的方法。美国国际象棋协…

使用WaveOut API播放WAV音频文件(解决卡顿)

虽然waveout已经过时&#xff0c;但是其api简单&#xff0c;有些时候也还是需要用到。 其实还是自己上msdn查阅相应api最靠谱&#xff0c;waveout也有提供暂停、设置音量等接口的&#xff0c;这里给个链接&#xff0c;需要的可以自己查找&#xff1a; https://msdn.microsoft.c…

使用WaveIn录制音频并且使用WaveOut播放音频

在Windows下开发音频的方式有多种&#xff0c;但是最简单&#xff0c;也是最灵活的就是Wave系列API&#xff0c;今天我们一起用WaveIn和WaveOut实现一个音频录制和音频播放器&#xff0c;具体界面如下&#xff1a; 录制步骤如下&#xff1a; void CcbdDlg::OnBnClickedButtonS…

WaveOut播放声音死锁问题原因

1.首先我们复习下造成死锁的几个充要条件&#xff1a; 1&#xff09;互斥&#xff1a;互斥资源&#xff0c;只能被一个进程使用 2&#xff09;不剥夺&#xff1a;非抢占式调度&#xff0c;不能强行抢用其他进程资源 3&#xff09;请求和保持&#xff1a;占有着资源不释放&am…

C++ 使用waveOut实现声音播放

文章目录 前言一、需要的对象及方法1.对象2.方法 二、整体流程三、关键实现1.声音格式2.对象池 四、封装成对象1.接口设计2.具体实现 五、使用示例总结 前言 在Windows上实现声音播放比较简单的方法是使用winmm&#xff0c;其中的waveOut模块就可以打开声音设备&#xff0c;播…

windows下使用waveOut播放音频pcm

目录 一、前言 二、waveOut主要API介绍 三、waveOut播放PCM音频框架 《Windows平台使用waveOut播放PCM数据代码实现》链接&#xff1a; https://edu.csdn.net/learn/38258/606147?spm1003.2001.3001.4157 一、前言 在<windows下directShow音视频采集>一篇文章中就介…

双缓冲方法实现waveOut的连续无卡顿播放以及即收即放

1. waveOut基本使用方法 waveOut是一套历史悠久的Windows音频API&#xff0c;虽然古老&#xff0c;但至今仍运行良好&#xff0c;且支持老旧系统&#xff08;原生支持Windows XP&#xff09;。 waveOut虽然不像DirectSound那样自带混音功能&#xff0c;但也可以通过同时开多个…

清华牛逼!

如果让你用尽可能多的词语形容一名女子的美貌&#xff0c;你会怎么说&#xff1f; “这女孩太美了&#xff0c;闭月羞花、沉鱼落雁不足以形容起美貌。那身段令貂婵蒙羞&#xff0c;那脸蛋令月亮失色。那眼睛&#xff0c;那鼻子&#xff0c;那小嘴&#xff0c;那胸脯&#xff0c…

博士申请 | 上海交通大学叶南阳老师招收计算机视觉/机器学习方向博士生

合适的工作难找&#xff1f;最新的招聘信息也不知道&#xff1f; AI 求职为大家精选人工智能领域最新鲜的招聘信息&#xff0c;助你先人一步投递&#xff0c;快人一步入职&#xff01; 上海交通大学 上海交通大学约翰霍普克罗夫特计算机科学中心于 2017 年 1 月正式成立&#x…

硬核实力!西安交大人工智能学科到底有多强?

人工智能 是时下最火的科技词汇之一 人工智能 作为引领未来的战略性技术 正默默改变着人类的生产生活 西安交大人工智能研究是国内高校的先驱 拥有强大的学术实力 科研成绩斐然 斩获国内外多项荣誉 今天 跟着小编一起走进交大人工智能 漫步科学殿堂 西安交通大学人工智能学科发…

清华大学交叉信息研究院姚班修改培养模式:姚班、智班、量信班全合并

机器之心报道 编辑&#xff1a;杜伟、泽南 拓宽优秀学生的选择方向。 清华大学交叉信息研究院宣布了优化本科培养模式的新计划&#xff1a; 为进一步拓宽学生基础学养&#xff0c;并优化专业方向选择&#xff0c;特调整本科生培养模式&#xff0c;具体要点如下&#xff1a; 1、…

我的2020推免之路:清叉、TBSI、贵系、中山、国防科大、自动化所

我的2020推免之路&#xff1a;清叉、TBSI、贵系、中山、国防科大、自动化所 一.前言二.个人情况三.夏令营清华大学交叉信息学院&#xff08;6.13~6.14&#xff09;清华-伯克利深圳学院&#xff08;7.2~7.9&#xff09;清华大学计算机系&#xff08;7.8~7.9&#xff09;中山大学…

清北浙交大比拼,南大强势上榜,AI到底哪家强?

作者 | 阿司匹林 编者注&#xff1a;近日&#xff0c;上海交通大学和武书连编制的两份比较有影响力的大学排行榜先后发布。这两份榜单的最终排名虽然存在一定的差异&#xff0c;但是都将清华大学、北京大学、浙江大学、上海交通大学、以及复旦大学排在了前五&#xff08;先后顺…

2022 ACM杰出会员揭榜:清华黄隆波、刘世霞,北大郝丹、刘譞哲等23位华人学者入选!...

来源&#xff1a;新智元 2022年度ACM杰出会员&#xff08;Distinguished Member&#xff09;名单公布&#xff01; 本次评选设有三个奖项&#xff0c;分别表彰在计算机领域做出的教育贡献、工程贡献和科学贡献。 今年共有67名会员入选。其中有23位是华人&#xff08;中国大陆6人…

科研实习 | 清华大学交叉信息研究院弋力老师课题组招收科研实习生

合适的工作难找&#xff1f;最新的招聘信息也不知道&#xff1f; AI 求职为大家精选人工智能领域最新鲜的招聘信息&#xff0c;助你先人一步投递&#xff0c;快人一步入职&#xff01; 清华大学 弋力博士于2021年7月加入清华大学交叉信息研究院任助理教授&#xff0c;博士生导师…

数说CS | 北大叉院推免生源大起底!

写在前面 北京大学前沿交叉学科研究院是怎样的一个存在&#xff1f;研究方向与其他学院有什么不同&#xff1f;学术氛围如何&#xff1f; 今天&#xff0c;岛主将会带领各位一同了解北大叉院&#xff0c;从学院介绍、培养特色、优营生源分析等板块为大家深入剖析&#xff01;…

北理工通报方岱宁院士处理结果

点击进入—>3D视觉工坊学习交流群 12月7日&#xff0c;北京理工大学发布《情况通报》&#xff0c;通报“教师方岱宁相关视频事件”处理结果。 据通报&#xff0c;经查核&#xff0c;视频内容是方岱宁今年7月初在线参加学术会议时发生的事情&#xff0c;因其行为失范&#xf…

2020cs线上保研之路 清华北大交大复旦自动化所计算所

2020计算机线上保研 清华北大交大复旦自动化所计算所 无聊在飞机上编辑的这几个月来的经历吧。我真的感觉好累&#xff0c;巨累。该死的疫情。 今年保研&#xff0c;往届的学长学姐的去路都没有什么参考性了&#xff0c;一个原因在于cs内卷更严重了&#xff0c;另一个因为疫情…

直播预告 | 清华叉院助理教授赵行、在读博士生孙桥:自动驾驶中的行为交互

本期为TechBeat人工智能社区第421期线上Talk&#xff0c;响应大家希望实时交流的需求&#xff0c;本次Talk是&#xff01;直&#xff01;播&#xff01; 北京时间7月13日(周三)20:00&#xff0c;我们很开心邀请到老朋友——清华叉院助理教授赵行老师和他的学生孙桥&#xff0c;…

清华大学交叉信息研究院招收计算机图形学、机器学习方向博士

来源&#xff1a;机器之心 课题组简介杜韬博士于 2022 年秋季加入清华大学交叉信息研究院担任助理教授&#xff0c;领导课题组开展计算机图形学和机器学习相关方向的研究。课题组常年招收博士生、科研助理、实习生、访问学生、助理研究员等&#xff0c;部分职位工作地点可选北京…