`
ttkktt
  • 浏览: 27835 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

一个ELO Rating的简单Java实现

阅读更多

近期兼职做了个小游戏,有感于暴雪的WOW竞技场排名系统,于是用简单实现了一个ELO Rating来记分。

WOW的排名系统暴雪自称是“ELO Like”,是对ELO Rating做了一些改进的。我们这里先介绍一下标准的ELO Rating。ELO等级分系统是用来计算一个人在双人对决性比赛里的相对的技能等级的一个系统,最早应用于国际象棋和围棋。简单的说,就是把“实力”这种比较“虚”的东西数字化的一种办法。这个系统是由一个物理学教授Arpad Elo创立的,他同时也是一位国际象棋的大师。众所周知,“实力”这个东西是很难判断的,但是实力也是一个客观存在的东西。Elo教授作出了一个假定:一个人的实力在短期内是一定的,并且遵从某一个正态分布函数;长期来看,一个人的实力是缓慢的变化的。并由于国际象棋中很难判别每一步甚至每一局的价值,Elo教授引入了统计学,用统计一段时期内棋手的输赢的办法来衡量该棋手的实力,同时作出第二个假定:某一特定实力范畴里,相互之间的差别一般可预期,不会出现太大意外。比如强手未必每盘都赢另一个比他弱的选手,但是总体来说胜率要高。具体的数学公式这里就不列出来了,有兴趣的朋友去Google搜索下就找到。

 

下面是Java实现的一些片段:

public class SimpleEloRatingSystem {
	
	public static double DEFAULT_ELO_K_FACTOR = 24.0;
	public static String K_FACTOR_STRING="0-2099=32,2100-2399=24,2490-3000=16";

	public final static double WIN = 1.0;
	public final static double DRAW = 0.5;
	public final static double LOSS = 0.0;

	public KFactor [] kFactors = {};

	private SimpleEloRatingSystem () {
				
		if (K_FACTOR_STRING != null) {
			
			StringTokenizer st1 = new StringTokenizer (K_FACTOR_STRING, ",");
			kFactors = new KFactor [st1.countTokens()];
			
			int index = 0;
			while (st1.hasMoreTokens()) {
				String kfr = st1.nextToken();
								
				StringTokenizer st2 = new StringTokenizer (kfr, "=");
				String range = st2.nextToken();
								
				double value = Double.parseDouble (st2.nextToken());
								
				st2 = new StringTokenizer (range, "-");
				int startIndex = Integer.parseInt(st2.nextToken());
				int endIndex   = Integer.parseInt(st2.nextToken());
								
				kFactors [index++] = new KFactor (startIndex, endIndex, value);
			}
		}			
	}
		

	public int getNewRating (int rating, int opponentRating, int resultType) {
		switch (resultType) {
			case Constants.WIN:
				return getNewRating (rating, opponentRating, WIN);
			case Constants.LOSE:
				return getNewRating (rating, opponentRating, LOSS);
			case Constants.DRAW:
				return getNewRating (rating, opponentRating, DRAW);				
		}
		return -1;		
	}
	

	public int getNewRating(int rating, int opponentRating, double score) {
		double kFactor       = getKFactor(rating);
		double expectedScore = getExpectedScore(rating, opponentRating);
		int    newRating     = calculateNewRating(rating, score, expectedScore, kFactor);
		
		return newRating;
	}	
	

	private int calculateNewRating(int oldRating, double score, double expectedScore, double kFactor) {
		return oldRating + (int) (kFactor * (score - expectedScore));
	}
	

	private double getKFactor (int rating) {
		// Return the correct k factor.
		for (int i = 0; i < kFactors.length; i++) 
			if (rating >= kFactors[i].getStartIndex() &&
				rating <= kFactors[i].getEndIndex()) 
			{
				return kFactors[i].value;
			}		
		return DEFAULT_ELO_K_FACTOR;
	}
	

	private double getExpectedScore (int rating, int opponentRating) {
		return 1.0 / (1.0 + Math.pow(10.0, ((double) (opponentRating - rating) / 400.0)));
	}
	

	public class KFactor {
		
		private int startIndex, endIndex;
		private double value;
		
		public KFactor (int startIndex, int endIndex, double value) {
			this.startIndex = startIndex;
			this.endIndex   = endIndex;
			this.value      = value;
		}
		public int getStartIndex () { return startIndex; }
		public int getEndIndex ()   { return endIndex; }
		public double getValue ()      { return value; }
		
		public String toString () { 
			return "kfactor: " + startIndex + " " + endIndex + " " + value;
		}
	}
}
 

 

0
0
分享到:
评论
1 楼 elmnd123 2012-06-13  
UP!

相关推荐

    ELO Rating System实例

    A simple implementation for the famous ELO Rating System. This resource contains a document(Chinese) that specifies the algorithm of ELO Rating and give some examples that shows to users how to ...

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

    在“PHP-校花评选-埃洛等级分系统(Elo rating system)”项目中,开发者使用了PHP这一流行的服务器端脚本语言来搭建一个基于Elo评分机制的投票系统。Elo等级分系统最初被应用于棋类比赛,以衡量选手的实力水平,但其...

    katago权重Elo评分1915

    要运行Katago,你需要一个支持C++14的编译器,以及OpenMP库。首先,从官方GitHub仓库()下载源代码,然后将提供的权重文件(即"菜刀")放入正确的位置。接着,按照项目文档的指示进行编译和配置。一旦设置完成,你...

    Python中的 Elo算法实现_python_代码_下载

    已经开发了一个 python 包,用于根据先前的技能排名计算预期的胜利概率,并在结果之后更新排名。 from elosports.elo import Elo eloLeague = Elo(k = 20) eloLeague.addPlayer("Daniel", rating = 1600) eloLeague...

    Elo:简单的Elo评分计算器

    一个简单的Elo评分计算器 依存关系: python3 安装和使用: git clone https://github.com/Doekeb/Elo cd Elo ./elo test.csv 用包含匹配结果的CSV文件替换test.csv 。 CSV文件应具有两列。 每行代表一场比赛,...

    ELO触屏驱动.zip

    ELO触屏驱动.zip是一个包含ELO品牌的触控屏幕驱动程序的压缩文件,适用于Windows操作系统,包括Windows 10、Windows 8.1以及Windows 7。ELO是一家知名的触控技术制造商,其产品广泛应用于各种行业,如零售、医疗、...

    基于elo算法实现的战力随机分组系统V2

    【标题】"基于elo算法实现的战力随机分组系统V2"是一个旨在优化竞技对战游戏或活动中玩家分组的软件系统。该系统利用elo算法来评估玩家的实力,并以此为基础进行公平的随机分组,确保每个组内的玩家战力相对均衡。 ...

    elo-algorithm-java

    elo-algorithm-java

    elo-rating-d:D编程语言中的ELO评分系统

    这个项目是一个 用法: 将elo-rating-d程序包添加到您的配音依存关系中,并运行如下所示的评级: import elo.rating; int MyRating = 1000; int OpponentRating = 1000; auto MyNewRating = RatingSystem....

    ELO 触摸屏驱动

    Elo TouchSystems是全球触摸技术的领导者,开发、生产和销售全套触摸屏和触摸显示器产品。Elo可提供最完整的触摸屏技术,...从那时起,人们使用Elo触摸屏的一个共同、有力的结果就是,为所有用户简化了高级计算机技术。

    elo-js:JS中的Elo算法实现

    这是一个小实现。 基于维基百科的信息。 尝试使用 ES6 特性,例如 class 是花哨的。 安装 npm install elo-js 用法 浏览器 requireJS 和 browserify 兼容。 &lt; script src =" elo-js/index.js " &gt; &lt;/ ...

    国际象棋ELO等级分体系

    在 ELO 体系中,有一个概念叫“标准分类间隔”,简单说就是某一个等级里最高与最低之间的差别。在国际象棋里,FIDE 采用每 200 分为一个间隔的分类法,并且给每一个间隔取一个名字或排名以更好分辨。 ELO 等级分...

    rust-elo:Elo排名系统的实现

    Elo系统的核心思想是,每个玩家都有一个Elo评分,这个评分反映了他们相对于其他球员的平均表现。 **Rust编程语言** Rust是一种系统级编程语言,注重安全、速度和并发性。由Mozilla开发,Rust通过强制执行所有权和...

    elo:一个简单的ELO系统库:open_book:

    一个简单的ELO系统库。 安装 要安装最新版本: # NPM npm i simplelo 文献资料 该库仅具有三个功能。 预期(玩家等级:数字,竞争对手等级:数字):数字 计算预期的比赛结果。 import { expected } from 'elo.js'...

    elo-rating:基于Elo评分算法管理用户排名的应用程序

    核心方面的属性可以在文件elo-rating/src/main/resources/application.properties 。 属性 描述 logging.level.org.springframework.data.mongodb.core.MongoTemplate MongoDB查询的日志记录级别 spring.data....

    elo-rating:发烧的Ttempalate

    【elo-rating:发烧的Ttemplate】是一个专注于JavaScript技术的知识点,尤其在开发工具和框架方面。这个项目可能是一个模板或者框架,用于构建口才展示或训练应用,它可以帮助开发者快速搭建具有特定功能的Web应用...

    ELO红外触摸驱动

    2. 解压:将压缩包解压,通常会得到一个.exe或者.inf格式的文件,这是安装驱动的执行程序。 3. 安装:运行安装程序,按照提示进行操作,包括选择设备类型、接受许可协议、指定安装路径等。 4. 配置:安装完成后,...

    kaggle elo-merchant-category-recommendation dataset

    总的来说,"elo-merchant-category-recommendation"数据集提供了一个全面了解用户消费行为和商户特性的真实场景,对于提升个性化推荐系统的设计和实现具有极高的价值。通过对这些数据的深入挖掘和分析,我们可以更好...

    NLP民工的乐园: 几乎最全的中文NLP资源库

    Chatbot Arena 实际场景用Elo rating对 LLM 进行基准测试 - 介绍了 Chatbot Arena,一种针对大型语言模型 (LLM) 的基准平台,采用匿名、随机的方式进行对抗评测,评测方式基于国际象棋等竞技游戏中广泛使用的 Elo ...

    ELO商户类别推荐 数据集

    ELO商户类别推荐是一个注明的数据分析比赛网站kaggle上的一个项目的数据集,由于文件较大,我把文件的链接放到了文本文档中,下载的小伙伴需要打开TXT文件,然后通过里面的百度云链接下载数据

Global site tag (gtag.js) - Google Analytics