`
ttkktt
  • 浏览: 27314 次
  • 性别: 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)

    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-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-js:JS中的Elo算法实现

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

    ELO 触摸屏驱动

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

    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....

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

    埃洛Elo 排名系统的实现。 该库旨在促进创建和运行 Elo 排名的简单方法。 Elo 排名通常用于国际象棋等游戏中,以表示玩家的技能水平。

    ELO触屏驱动.zip

    ELO最新驱动程序,支持windows10 windows8.1 Windows7,即装即用

    ELO商户类别推荐 数据集

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

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

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

    国际象棋ELO等级分体系

    国际象棋ELO等级分体系 非常详细的说明文档

    kaggle elo-merchant-category-recommendation dataset

    kaggle 赛题 elo-merchant-category-recommendation 数据集

    ELO红外触摸驱动

    ELO红外触摸驱动,很难找到的,这里拿出来大家分享一下,以备急用!

    BayesianElo:贝叶斯Elo评分估算器

    Bayeselo是一个命令行工具。 本节介绍了典型的使用示例。 下面的示例显示了如何从PGN文件(位于程序执行目录中的wbec.pgn)中计算收视率。 ResultSet&gt;readpgn wbec.pgn37 game(s) loaded, 0 game(s) with unknown ...

    Multiplayer-ELO:多人ELO计算

    计算多人游戏ELO的简单方法。 当前的C,C#,C ++,Java,Objective-C,Python,PHP,Swift和Delphi版本。 慢慢做更多。 用法: $ match = new ELOMatch (); $ match -&gt; addPlayer ( "Joe" , 1 , 1600 ); $ ...

    ELO IntelliTouch 表面波触摸屏资料.PDF

    ELO IntelliTouch 表面波触摸屏资料PDF,ELO IntelliTouch 表面波触摸屏资料

Global site tag (gtag.js) - Google Analytics