《社交网络》里的Mark Zackburg被女朋友甩后,在舍友的启发下,充分发挥了技术宅男自娱自乐的恶搞天分,做出了Facemash网站,对学校女生的相貌进行排名打分,结果网站访问流量过大,直接把学校网络搞瘫痪了。Facemask大受欢迎的关键就在于Zackburg基友Eduardo写在窗户上的排名公式,看电影之时就对这个排名公式非常感兴趣,上网了解下,才发现这条公式就是大名鼎鼎的ELO等级分制度ELO的应用非常广泛,大部分棋类比赛,现在流行的Moba游戏,像11平台的DOTA天梯系统,都是采用ELO等级分。

  以后做竞技类的游戏排行榜可以用ELO来排名,更真实地反映玩家的实力。闲来无事,做了个flash的Facemask,挺有意思的。

ELO的实现代码

package
{ /**
* Elo排名算法
* @author ShuchangLiu
*/
public class EloRating
{
public static const ELO_RESULT_WIN:int = 1;
public static const ELO_RESULT_LOSS:int = -1;
public static const ELO_RESULT_TIE:int = 0; public static const ELO_RATING_DEFAULT:int = 1500; protected var rating1:int;
protected var rating2:int;
protected var score1:Number;
protected var score2:Number; public function EloRating(rating1:int = ELO_RATING_DEFAULT, rating2:int = ELO_RATING_DEFAULT):void
{
this.rating1 = rating1;
this.rating2 = rating2;
} /**
* @param result ELO_RESULT_WIN or ELO_RESULT_LOSS or ELO_RESULT_TIE
*/
public function setResult(result:int):void {
var cscore1:Number = computeScore(this.rating2, this.rating1);
var cscore2:Number = computeScore(this.rating1, this.rating2); if (result == ELO_RESULT_WIN) {
this.rating1 = this.rating1 + (computeK(this.rating1) * (1 - cscore1));
this.rating2 = this.rating2 + (computeK(this.rating2) * (0 - cscore2));
}else if(result == ELO_RESULT_LOSS) {
this.rating1 = this.rating1 + (computeK(this.rating1) * (0 - cscore1));
this.rating2 = this.rating2 + (computeK(this.rating2) * (1 - cscore2));
}else{
// Assume tie
this.rating1 = this.rating1 + (computeK(this.rating1) * (0.5 - cscore1));
this.rating2 = this.rating2 + (computeK(this.rating2) * (0.5 - cscore2));
}
} protected function computeScore($rating1:int, $rating2:int):Number {
return (1 / (1 + Math.pow(10, ($rating1 - $rating2) / 400)));
} protected function computeK(rating:int):int {
if(rating>=2400){
return 16;
}else if(rating >= 2100){
return 24;
}else{
return 36;
}
} /** A的获胜期望*/
public function getScore1():Number {
this.score1 = computeScore(this.rating2, this.rating1);
return this.score1;
} /** B的获胜期望*/
public function getScore2():Number {
this.score2 = computeScore(this.rating1, this.rating2);
return this.score2;
} /** A的排名等级*/
public function getRating1():int {
return this.rating1;
} /** B的排名等级*/
public function getRating2():int {
return this.rating2;
} }
}

ELO介绍

ELO等级分制度是指由匈牙利美国物理学家Elo创建的一个衡量各类对弈活动水平的评价方法,是当今对弈水平评估的公认的权威方法。被广泛用于国际象棋围棋足球篮球等运动。网络游戏英雄联盟魔兽世界内的竞技对战系统也采用此分级制度。

历史

ELO等级分制度是基于统计学的一个评估棋手水平的方法。美国国际象棋协会在1960年首先使用这种计分方法。由于它比先前的方法更公平客观,这种方法很快流行开来。1970年国际棋联正式开始使用等级分制度。

Elo模型原先采用正态分布。但是实践显明棋手的表现并非呈正态分布,所以现在的等级分计分系统通常使用的是Logistic distribution

计分方法

假设棋手A和B的当前等级分分别为,则按Logistic distribution A对B的胜率期望值当为

类似B对A的胜率为

假如一位棋手在比赛中的真实得分(胜=1分,和=0.5分,负=0分)和他的胜率期望值不同,则他的等级分要作相应的调整。具体的数学公式为

公式中分别为棋手调整前后的等级分。在大师级比赛中通常为16。

例如,棋手A等级分为1613,与等级分为1573的棋手B战平。若K取32,则A的胜率期望值为,约为0.5573,因而A的新等级分为1613 + 32 · (0.5 − 0.5573) = 1611.166

国际象棋中的等级分

国际象棋中,等级分和棋联称号的大致对应为

  • 2500分以上:国际特级大师
  • 2400-2499分:国际大师
  • 2300-2399分:棋联大师

其他参考:

ELO等级分计算公式详解

《社交网络》里的评分公式——ELO排名系统的更多相关文章

  1. [转]详细解读TrueSkill 排名系统

    概要 大多数竞技游戏都有一个评价玩家是否完成目标的度量指标,它是游戏的基础.对于包含两个或两个以上玩家(多玩家比赛)的比赛,常涉及到游戏玩家技能的排名方法.游戏鼓励玩家之间相互竞争,玩家不只要赢得单场 ...

  2. 【BZOJ】1862: [Zjoi2006]GameZ游戏排名系统 & 1056: [HAOI2008]排名系统(treap+非常小心)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1862 http://www.lydsy.com/JudgeOnline/problem.php?id ...

  3. Lucene TFIDFSimilarity评分公式详解

    版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/zteny/article/details/ ...

  4. BZOJ 1862: [Zjoi2006]GameZ游戏排名系统 [treap hash]

    1862: [Zjoi2006]GameZ游戏排名系统 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1318  Solved: 498[Submit][ ...

  5. [BZOJ1056][BZOJ1862][HAOI2008][Zjoi2006]排名系统

    [BZOJ1056][BZOJ1862][HAOI2008][Zjoi2006]排名系统 试题描述 排名系统通常要应付三种请求:上传一条新的得分记录.查询某个玩家的当前排名以及返回某个区段内的排名记录 ...

  6. 1056: [HAOI2008]排名系统 - BZOJ

    Description 排名系统通常要应付三种请求:上传一条新的得分记录.查询某个玩家的当前排名以及返回某个区段内的排名记录.当某个玩家上传自己最新的得分记录时,他原有的得分记录会被删除.为了减轻服务 ...

  7. HNOI2008 and ZJOI2006 排名系统

    1056: [HAOI2008]排名系统 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1311  Solved: 337[Submit][Statu ...

  8. 数据结构(Splay平衡树):HAOI2008 排名系统

    [HAOI2008] 排名系统 [题目描述] 排名系统通常要应付三种请求:上传一条新的得分记录.查询某个玩家的当前排名以及返回某个区段内的排名记录.当某个玩家上传自己最新的得分记录时,他原有的得分记录 ...

  9. bzoj 1056 [HAOI2008]排名系统(1862 [Zjoi2006]GameZ游戏排名系统)

    1056: [HAOI2008]排名系统 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1854  Solved: 502[Submit][Statu ...

随机推荐

  1. NodeJS 模块开发及发布详解

    NodeJS 是一门年轻的语言,扩展模块并不太全,经常我们想用某个模块但是却找不到合适的.比如前两天我需要使用hmac和sha1来做签名,就没有找到一个比较好用的模块,这时候就需要我们自己来实现相应的 ...

  2. java深入技术九 (注解)

    java注解 (Annotation) 一般起到说明,配置的作用,在java.lang.annotation 定义,本质上没有增强java的能力 1.常用注解:@Override,强制编译器检查标注的 ...

  3. 在linux 服务器上用.htaccess文件实现二级域名访问子目录

    实现子域名绑定网站子目录的方法有很多,比如可以用js跳转,可以用php实现,可以301跳转等,但最常用的应该是RewriteEngine方式了.   新建一个笔记本命名为.htaccess(在wind ...

  4. java方法强制传递引用参数(做为返回值),改变被传递参数值。

    Java传递参数分为2种: 值类型,Java里面也叫简单类型,这种参数类型的传递的是它的副本拷贝: 引用类型,传递的是对象引用地址,如果在方法内改变该参数对象属性即是对原引用对象的改变:如果不想这样传 ...

  5. wpf——三维学习1

    以下xmal是我从msdn上复制下来的.是用于在wpf中创建3d模型的实例链接https://msdn.microsoft.com/zh-cn/library/ms747437.aspx看它的使用方式 ...

  6. Flash: An Efficient and Portable Web Server

    Introduction This paper presents the design of a new Web server architecture called the asymmetric m ...

  7. 安装ganglia

    安装ganglia 1.默认已经配置好相关的主机名和Ip地址映射关系 2.默认已经安装好ssh密码登陆 3.默认已经配置好yum源和相关网络配置(如hosts 可在墙外) 4.服务器端安装(除了yum ...

  8. 域名解析与多域名绑定多个Tomcat项目

    第一步.域名解析 1.登录阿里云的服务器地址:https://www.aliyun.com/   新手礼包地址:https://s.click.taobao.com/as9o9Ox 2.点击控制台 3 ...

  9. 中国剩余定理(Chinese Remainder Theorem)

    我理解的中国剩余定理的含义是:给定一个数除以一系列互素的数${p_1}, \cdots ,{p_n}$的余数,那么这个数除以这组素数之积($N = {p_1} \times  \cdots  \tim ...

  10. Navicat备份远程Oracle数据库到本地

    公司的数据库是本地的,我只能在公司连,回家就不能跑项目了,一跑就报SQLException,所以希望可以把数据库复制到我的本地来. 因为一直在用Navicat操作数据库,这里就分享一下用Navicat ...