Rating_System
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
[[TracNav(TOC)]]
= 来源 =
之前一直在YY一个rating system来作为暑假集训的成绩衡量法。比较有名的自然是TC的rating系统,不过比较复杂,我能力有限,实现不了……
前几天逛TC论坛看到某人发的一个研究rating system的帖子(好像是那个人的毕业设计-_-),下了来看了下,里面提到了一个名叫Elo的简单的rating system,模型很简单,于是就打算拿来做个试验。
PS,这么模型是用来作为国际象棋的rating系统的。
= 原理 =
这个rating system原理还是差不多的,分三步。
1. 根据当前各自的rating,计算出每两个人之间的胜负概率;
1. 根据胜负概率,计算每个人的期望排名;
1. 由期望排名和实际排名,来生成新的rating。
于是只有两个公式,第一个公式,用来求两个人之间的胜负概率:
P = 1 / (1 + pow(10, (r2 - r1) / 400))
其中,r2,r1为两个人当前各自的rating,P求出的是r1 win r2的概率(也就是r1名次高于r2的概率)。
第二个公式,用来求新rating:
r' = r + K(E - S)
E是期望的名次,S是实际的名次,K是一个可以设定比例系数,K controls how much recent information should be weighed。原来这个公式中的E和S分别是期望得分和实际得分,我这里改成名次了。
其实还有另外一个公式,就是由每两个人的胜负概率来求每个人的期望名次,这个原文没有给,随便YY了一个,应该没什么问题。
= 一些设定 =
1. 这个方案里面,每个人有一个初始的rating,现在设定为200,不过这个对具体的排名不会有任何影响,因为计算胜负关系只和rating差有关,所以保证大家都在同一个起点开始就可以了。
1. 关于K的设定,原文如下:K = 16 is typical for experts in chess, and K = 32 is recommended for beginners in chess. From experimentation, K = 2 was the best fit for the TopCoder data, and best K = 16 worked best for the Halo data. 上面说过了,我把得分改成了名次,而国际象棋里面的得分取值为0, 0.5, 1,而我们这里名次的取值则要大得多,所以K应该取得小为好,现在取值为2(测试过,确实K取2的时候的结果比K去16时候的结果要好不少)。
1. 到时候是分组赛,每场比赛的参加人员是不一样的。这里假定一共有4组。为了消除比赛先后的影响,我把4场比赛作为一轮,显然每个人每轮参加3场比赛。然后模拟这4场比赛的所有可能的先后顺序,一共可能有4! = 24种顺序,然后去取这24种情况的最终rating的平均值。我觉得这样可以消除一些rating系统的不确定因素,因为不能保证rating系统是否会偏袒先参加的,或者是后参加的。比较过,这样取一下平均和不取平均会有一些略微的差别,也就是说,取或者不取,其实结果都是还不错的。欢迎大家来测试+讨论。
1. 应该参加比赛,而没有参加比赛的,则设定其解题数为0,依然参与排名;而某场比赛的所有无关的参赛人员都会从ranklist中去除。
1. 一场比赛种的排名方式与ranklist方式一致,首先按照解题数排名,相同的按照罚时排,依然相同的名次并列,都取中间名次(比如Fire rank为1,后面有三只并列第二的,则他们的名次都应该是3,而不是2;如果是四只并列的话则应该都是3.5)。往年计算最终成绩只是考虑解题数的,所以这点是一个比较大的改变,解题速度也考虑到了最后的成绩计算中。
1. 如教练s所说,这个最后得到的ranklist仅仅作为校队录取的参考。
1. 想起来再说。
= 附录 =
== 附录1: TC rating system介绍 ==
http://www.topcoder.com/wiki/display/tc/Algorithm+Competition+Rating+System
以下是mathematica版本,可从附件下载
{{{
#!html
<img src="/pia/trac/raw-attachment/wiki/Rating_System/TC_Rating.jpg"></img>
}}}
== 附录2: 上面提到的那个PDF文档 ==
http://forums.topcoder.com/?module=Thread&threadID=575003&start=0&mc=5#801637
== 附录3: 源程序 ==
写得很烂-_-还很慢-_-
{{{
#!cpp
#include <iostream>
#include <string>
#include <sstream>
#include <set>
#include <map>
#include <cmath>
#include <vector>
#include <algorithm>
#include <cstdio>
using namespace std;
vector<vector<string> > vs;
const double K = 2.0;
const double INITRATE = 200;
const int MAXGROUP = 4;
const int MAXROUND = 10;
int roundsize[MAXROUND];
map<string, double> rating;
map<string, double>::iterator mi;
void tolower(char* str)
{
for (int i = 0; str[i]; ++i) {
if (str[i] >= 'A' && str[i] <= 'Z') {
str[i] += 32;
}
}
}
string tolower(string str)
{
for (int i = 0; i < str.size(); ++i) {
if (str[i] >= 'A' && str[i] <= 'Z') {
str[i] += 32;
}
}
return str;
}
struct Person
{
string name;
int solved;
int t;
Person(string str) //For 2.0
{
while (str[str.size() - 1] == ' ') {
str = str.substr(0, str.size() - 1);
}
stringstream Stream(str);
int num;
Stream >> num >> name >> solved;
string tt;
while (Stream >> tt);
stringstream S2(tt);
S2 >> t;
name = tolower(name);
}
/*Person(string str) //For 1.0
{
while (str[str.size() - 1] == ' ') {
str = str.substr(0, str.size() - 1);
}
stringstream Stream(str);
int num;
Stream >> num >> name >> solved;
name = tolower(name);
str[str.size() - 3] = str[str.size() - 6] = ' ';
stringstream Stream2(str.substr(str.size() - 8));
t = 0;
for (int i = 0; i < 3; ++i) {
Stream2 >> num;
t *= 60;
t += num;
}
}*/
Person(string str, int i, int j) : name(str), solved(i), t(j){}
};
double calp(double r2, double r1)
{
return 1.0 / (1.0 + pow(10.0, (r2 - r1) / 400.0));
}
bool cmp(const Person &a, const Person &b)
{
if (a.solved == b.solved) {
return a.t < b.t;
}
return a.solved > b.solved;
}
void go(vector<string> v)
{
int ind = v[0][0] - 'A';
set<string> names, names2;
set<string>::iterator si, si2;
for (int i = 0; i < vs.size(); ++i) {
if (i == ind) {
continue;
}
for (int j = 0; j < vs[i].size(); ++j) {
names.insert(vs[i][j]);
}
}
names2 = names;
string str;
vector<Person> vp;
for (int i = 1; i < v.size(); ++i) {
str = v[i];
vp.push_back(Person(str));
if (names.find(vp.back().name) == names.end()) {
vp.pop_back();
}
else {
names.erase(vp.back().name);
}
}
for (si = names.begin(); si != names.end(); ++si) {
vp.push_back(Person(*si, 0, 0));
}
sort(vp.begin(), vp.end(), cmp);
map<string, double> rank;
/*for (int i = 0; i < vp.size(); ) { //算罚时
int j;
for (j = i + 1; j < vp.size(); ++j) {
if (vp[j].solved != vp[i].solved || vp[j].t != vp[i].t) {
break;
}
}
--j;
double mid = double(i + j) / 2;
for (; i <= j; ++i) {
rank[vp[i].name] += mid;
}
}*/
for (int i = 0; i < vp.size(); ) { //不算罚时
int j;
for (j = i + 1; j < vp.size(); ++j) {
if (vp[j].solved != vp[i].solved) {
break;
}
}
--j;
double mid = double(i + j) / 2;
for (; i <= j; ++i) {
rank[vp[i].name] += mid;
}
}
map<string, double> shouldberank;
for (si = names2.begin(); si != names2.end(); ++si) {
double sum = 0;
for (si2 = names2.begin(); si2 != names2.end(); ++si2) {
if (si == si2) {
continue;
}
sum += calp(rating[*si], rating[*si2]);
}
shouldberank[*si] = sum;
}
for (si = names2.begin(); si != names2.end(); ++si) {
rating[*si] += K * (shouldberank[*si] - rank[*si]);
}
}
void outputrank(int ind)
{
printf("Ranklist After Round %d\n", ind);
puts("Rank ID Rating");
puts("--------------------------------");
vector<pair<double, string> > vvp;
for (mi = rating.begin(); mi != rating.end(); ++mi) {
vvp.push_back(make_pair(mi->second, mi->first));
}
sort(vvp.begin(), vvp.end());
for (int i = vvp.size() - 1; i >= 0; --i) {
printf("%-2d %-16s %10lf\n", vvp.size() - i, vvp[i].second.c_str(), vvp[i].first);
}
puts("");
}
double fact(int n)
{
if (n <= 1) return 1.0;
else return n * fact(n - 1);
}
int main()
{
//freopen("1.txt", "w", stdout);
int gpNum;
scanf("%d", &gpNum);
char str[1024];
gets(str);
for (int i = 0; i < gpNum; ++i) {
vector<string> v;
gets(str);
stringstream Stream(str);
while (Stream >> str) {
tolower(str);
v.push_back(str);
rating[str] = INITRATE;
}
vs.push_back(v);
}
map<string, double> init = rating;
char g[1024];
int ind = 0;
vector<string> vs[MAXROUND][MAXGROUP];
int round = 0;
while (scanf("%d", roundsize + round) != EOF) {
for (int i = 0; i < roundsize[round]; ++i) {
scanf("%s", g);
vs[round][i].push_back(g);
gets(g);
while (gets(g) && g[0]) {
vs[round][i].push_back(g);
}
}
++round;
}
vector<map<string, double> > ratings;
rating = init;
for (int ri = 0; ri < round; ++ri) {
map<string, double> newr, temp = rating;
int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
do {
rating = temp;
for (int i = 0; i < roundsize[ri]; ++i) {
go(vs[ri][arr[i]]);
}
for (mi = rating.begin(); mi != rating.end(); ++mi) {
newr[mi->first] += mi->second / fact(roundsize[ri]);
}
}
while (next_permutation(arr, arr + roundsize[ri]));
rating = newr;
//outputrank(++ind);
}
ratings.push_back(rating);
rating = map<string, double>();
for (int i = 0; i < ratings.size(); ++i) {
for (mi = ratings[i].begin(); mi != ratings[i].end(); ++mi) {
rating[mi->first] += mi->second;
}
}
outputrank(round);
return 0;
}
}}}
== 附录4: 样例,2008新手上路ranklists ==
输入数据第一部分是分组情况。先输入组数,然后每行是组员名单。
第二部分是所有的ranklist,每个ranklist的第一行是出题组的组号(A/B/C/D),也就是说该组的人不参加该次比赛,如果所有人都参加(比如新手上路的比赛),那么直接填Z就可以了。
{{{
1
winsty ljzhao classT aaahexing Ouyang_Jialin firing EZdestroyer vivyli Jiangch navj moondy yuzhirenzhe gaohaidong asmn retadykay liu3063031168 ll861112 shl hazy wyest dd_engi wanwei pkwgl owen200402 relive jay23jack aaron35203432 pp85365640 rpggpr hsys milki hzqtc
Z
1 ll861112 3 37(1) 0 18(1) 170(4) 0 11 285
2 navj 3 28(8) 0 67(2) 3 147(11) 0 602
3 Ouyang_Jialin 2 33(1) 0 46(1) 1 10 0 79
4 hazy 2 98(1) 2 111(1) 0 0 1 209
5 yuzhirenzhe 2 77(1) 145(1) 1 2 0 0 222
6 Jiangch 2 99(3) 0 108(5) 0 0 0 327
7 dd_engi 2 136(6) 0 84(4) 0 0 0 380
8 EZdestroyer 2 12 0 107(5) 1 159(8) 0 486
9 ljzhao 1 30(2) 0 8 0 0 0 50
10 owen200402 1 0 0 77(1) 0 0 0 77
11 retadykay 1 58(2) 0 4 0 0 0 78
12 rpggpr 1 5 0 2 0 52(5) 0 132
13 milki 1 4 117(2) 4 0 0 0 137
14 hsys 1 97(11) 0 6 0 0 0 297
15 classT 1 117(10) 0 4 0 0 0 297
16 moondy 1 99(11) 0 0 0 6 0 299
17 pkwgl 1 140(9) 0 4 0 0 0 300
18 jay23jack 1 176(12) 0 6 0 0 0 396
19 wanwei 0 9 0 2 0 0 0 0
19 relive 0 2 0 7 0 0 0 0
19 gaohaidong 0 5 0 2 0 0 0 0
19 vivyli 0 11 0 0 0 8 0 0
19 liu3063031168 0 11 0 0 0 5 0 0
19 wyest 0 1 0 3 0 0 0 0
19 pp85365640 0 3 0 0 0 1 0 0
19 aaahexing 0 20 0 0 0 0 0 0
19 aaron35203432 0 7 0 1 0 0 0 0
Z
1 moondy 6 8(1) 39(1) 28(2) 57(2) 118(2) 90(1) 400
2 asmn 6 12(1) 36(1) 25(1) 47(1) 160(7) 81(2) 501
3 dd_engi 6 23(1) 61(1) 71(3) 33(1) 113(4) 81(3) 522
4 EZdestroyer 6 16(1) 33(1) 51(2) 60(1) 154(1) 126(6) 560
5 Ouyang_Jialin 5 5(1) 30(1) 20(1) 39(1) 8 56(1) 150
6 navj 5 3(1) 18(1) 41(1) 71(1) 11 105(2) 258
7 liu3063031168 5 13(2) 27(1) 50(1) 84(3) 0 172(1) 406
8 rpggpr 5 18(1) 32(1) 47(2) 171(1) 2 140(2) 448
9 relive 4 7(1) 44(1) 28(1) 68(1) 0 2 147
10 hazy 4 12(1) 49(1) 33(1) 72(2) 0 3 186
11 classT 4 4(1) 29(1) 20(3) 72(4) 0 8 225
12 jay23jack 4 48(1) 47(1) 48(1) 69(2) 2 1 232
13 yuzhirenzhe 4 21(3) 34(1) 46(1) 70(3) 4 8 251
14 aaahexing 4 27(1) 60(1) 39(1) 103(5) 0 4 309
15 winsty 4 19(1) 45(4) 64(2) 87(2) 0 4 315
16 vivyli 4 10(2) 46(1) 89(1) 154(15) 0 3 599
17 milki 3 13(1) 28(1) 62(1) 11 2 2 103
18 owen200402 3 19(1) 43(1) 90(3) 0 0 2 192
19 hsys 3 26(1) 19(1) 4 155(1) 0 3 200
20 aaron35203432 3 8(1) 7 41(3) 117(2) 0 0 226
21 wanwei 3 11(1) 100(7) 2 32(2) 0 0 283
22 gaohaidong 3 20(2) 52(1) 4 147(6) 0 0 339
23 pp85365640 3 136(5) 71(1) 122(4) 2 0 0 469
24 retadykay 2 14(2) 39(2) 2 0 0 3 93
25 pkwgl 2 36(3) 53(1) 1 7 0 0 129
26 wyest 2 13(1) 144(3) 0 5 0 2 197
27 ljzhao 1 17(2) 2 2 0 0 0 37
Z
1 Ouyang_Jialin 3 0 62(1) 0 0 176(5) 16(1) 334
2 dd_engi 3 0 31(1) 0 0 166(6) 39(1) 336
3 yuzhirenzhe 3 0 172(9) 0 0 136(5) 38(1) 586
4 asmn 2 1 90(1) 0 0 0 24(1) 114
5 aaron35203432 2 0 78(2) 0 0 2 34(2) 152
6 winsty 2 0 120(2) 0 0 0 25(1) 165
7 ll861112 2 0 0 0 0 101(4) 22(1) 183
8 relive 2 0 0 0 0 125(6) 30(2) 275
9 gaohaidong 2 0 165(4) 0 0 0 97(2) 342
10 EZdestroyer 2 0 176(12) 0 0 0 76(4) 532
11 ljzhao 2 0 168(14) 0 0 0 114(4) 602
12 vivyli 2 0 133(18) 0 0 9 44(8) 657
13 hazy 1 0 23 0 0 0 17(1) 17
14 classT 1 0 5 0 0 7 21(1) 21
15 moondy 1 0 0 0 0 9 21(1) 21
16 wanwei 1 0 5 0 0 0 36(1) 36
17 owen200402 1 0 2 0 0 0 43(1) 43
18 navj 1 1 0 0 0 11 44(1) 44
19 jay23jack 1 2 3 0 0 2 55(1) 55
20 pkwgl 1 0 3 0 0 5 46(2) 66
21 retadykay 1 0 14 0 0 0 29(3) 69
22 liu3063031168 1 0 19 0 0 1 43(5) 123
23 hzqtc 1 0 140(3) 0 0 0 8 180
24 aaahexing 1 0 3 0 0 0 142(8) 282
25 wyest 1 0 1 0 0 3 150(10) 330
26 hsys 0 0 7 4 0 0 2 0
27 milki 0 0 0 0 0 0 2 0
Z
1 dd_engi 4 34(1) 8 60(5) 0 119(1) 13(1) 306
2 hsys 4 80(1) 0 85(4) 0 162(4) 21(1) 468
3 hazy 3 42(1) 0 0 0 117(1) 20(1) 179
4 Ouyang_Jialin 3 35(1) 8 121(3) 0 0 17(1) 213
5 asmn 3 17(2) 100(4) 1 0 1 35(1) 232
6 ljzhao 3 62(1) 0 0 0 164(3) 23(1) 289
7 yuzhirenzhe 3 59(4) 0 13 0 178(4) 24(1) 381
8 classT 3 117(1) 0 159(7) 0 0 24(2) 440
9 vivyli 3 70(3) 0 163(12) 0 1 21(1) 514
10 navj 2 30(2) 6 3 0 0 10(1) 60
11 moondy 2 32(1) 4 0 0 0 42(1) 74
12 relive 2 59(1) 0 1 0 0 26(1) 85
13 milki 2 58(1) 0 0 0 2 29(1) 87
14 retadykay 2 49(1) 0 0 0 3 70(1) 119
15 wanwei 2 115(1) 0 0 0 1 71(5) 266
16 owen200402 2 154(5) 0 0 0 0 116(3) 390
17 aaahexing 1 0 0 0 0 0 15(1) 15
18 EZdestroyer 1 0 4 4 0 3 19(1) 19
19 liu3063031168 1 0 0 0 0 3 20(1) 20
20 rpggpr 1 5 1 0 0 0 20(1) 20
21 wyest 1 1 0 0 0 0 40(1) 40
22 pkwgl 1 1 2 0 0 8 63(1) 63
23 hzqtc 1 1 0 0 0 3 53(2) 73
24 gaohaidong 1 0 1 0 0 0 88(1) 88
25 jay23jack 1 8 1 1 0 0 35(4) 95
26 winsty 1 2 0 0 0 0 84(7) 204
Z
1 moondy 3 174(5) 0 0 0 157(2) 0 431
2 Ouyang_Jialin 2 44(1) 0 0 0 2 3 44
3 classT 2 49(2) 0 0 0 0 0 69
4 ll861112 2 58(2) 0 0 0 0 19 78
5 jay23jack 2 85(2) 0 0 0 13 0 105
6 wanwei 2 0 0 0 0 94(3) 0 134
7 rpggpr 2 0 0 0 0 0 156(3) 196
8 hzqtc 2 86(9) 9 0 0 0 0 246
9 aaahexing 2 151(8) 0 0 0 4 0 291
10 hsys 2 158(8) 0 0 0 0 0 298
11 hazy 1 56(1) 0 0 0 0 0 56
12 wyest 1 93(3) 1 0 0 1 0 133
13 winsty 1 74(4) 0 0 0 0 0 134
14 pkwgl 1 164(4) 0 0 0 0 0 224
15 retadykay 0 12 0 0 0 0 0 0
16 relive 0 5 0 0 0 0 0 0
17 milki 0 13 0 0 0 0 15 0
18 gaohaidong 0 8 0 0 0 0 0 0
19 vivyli 0 28 0 0 0 0 0 0
20 liu3063031168 0 11 0 0 0 0 0 0
21 owen200402 0 6 0 0 0 0 0 0
22 ljzhao 0 32 0 0 0 0 0 0
23 pp85365640 0 7 0 0 0 0 0 0
24 navj 0 50 2 0 0 0 0 0
Z
1 winsty 5 55(1) 68(1) 0 164(1) 117(5) 29(1) 513
2 ll861112 5 83(3) 14(1) 0 171(1) 49(2) 148(7) 645
3 moondy 4 22(1) 52(1) 0 155(3) 0 83(2) 372
4 EZdestroyer 4 52(1) 63(3) 0 6 179(1) 34(2) 388
5 owen200402 4 38(1) 78(3) 0 0 157(1) 123(1) 436
6 rpggpr 3 85(1) 101(1) 0 0 65(2) 4 271
7 classT 3 63(2) 113(3) 0 0 1 40(2) 296
8 asmn 3 71(1) 56(3) 0 6 168(1) 8 335
9 Ouyang_Jialin 3 49(2) 87(1) 0 0 149(3) 8 345
10 relive 3 91(1) 53(6) 0 0 0 178(4) 482
11 vivyli 3 79(1) 31(4) 0 0 0 172(8) 482
12 aaahexing 3 36(1) 165(3) 0 0 0 148(6) 489
13 ljzhao 3 115(1) 143(4) 0 0 1 86(12) 624
14 retadykay 3 23(1) 121(13) 0 0 0 167(5) 631
15 wyest 2 26(2) 60(3) 0 0 0 5 146
16 hazy 2 68(2) 87(1) 0 0 0 7 175
17 hzqtc 2 29(1) 1 0 0 0 91(5) 200
18 gaohaidong 2 172(2) 38(1) 0 0 0 5 230
19 jay23jack 2 67(1) 113(5) 0 0 0 9 260
20 hsys 2 94(2) 163(1) 0 0 0 1 277
21 pkwgl 2 52(1) 172(9) 0 0 0 10 384
22 aaron35203432 2 56(7) 110(6) 0 0 1 5 386
23 milki 2 87(2) 141(8) 0 0 0 5 388
24 wanwei 1 30(1) 4 0 0 0 3 30
25 navj 1 0 0 0 0 0 160(5) 240
26 pp85365640 0 5 2 0 0 0 1 0
Z
1 rpggpr 5 167(1) 87(1) 59(4) 124(3) 177(2) 0 734
2 moondy 4 111(4) 22(1) 54(1) 0 0 154(6) 501
3 wanwei 4 0 32(2) 105(4) 142(3) 176(5) 0 655
4 relive 3 0 47(1) 67(1) 5 90(1) 0 204
5 classT 3 43(4) 55(1) 78(1) 0 15 0 236
6 aaron35203432 3 0 92(3) 44(1) 5 125(3) 0 341
7 pkwgl 3 0 79(1) 133(4) 0 166(1) 5 438
8 aaahexing 3 129(5) 98(1) 118(2) 0 0 0 445
9 liu3063031168 3 174(7) 86(1) 123(2) 0 0 0 523
10 hsys 3 163(12) 29(1) 102(6) 0 0 0 614
11 ljzhao 2 101(8) 35(1) 0 0 0 0 276
12 milki 2 0 68(1) 2 0 175(3) 0 283
13 jay23jack 2 0 148(1) 4 3 148(1) 0 296
14 vivyli 2 0 60(3) 168(15) 0 0 0 548
15 hazy 1 3 23(1) 6 0 0 0 23
16 owen200402 1 0 43(1) 3 0 0 0 43
17 wyest 1 0 76(3) 0 0 0 0 116
18 gaohaidong 1 1 163(1) 0 0 0 0 163
19 retadykay 1 0 107(6) 2 0 0 0 207
20 winsty 0 0 3 3 0 0 0 0
21 hzqtc 0 9 0 0 0 0 0 0
}}}
output:
{{{
Ranklist After Round 1
Rank ID Rating
-------------------------------
1 ll861112 231.000000
2 navj 229.000000
3 ouyang_jialin 227.000000
4 hazy 225.000000
5 yuzhirenzhe 223.000000
6 jiangch 221.000000
7 dd_engi 219.000000
8 ezdestroyer 217.000000
9 ljzhao 215.000000
10 owen200402 213.000000
11 retadykay 211.000000
12 rpggpr 209.000000
13 milki 207.000000
14 hsys 205.000000
15 classt 205.000000
16 moondy 201.000000
17 pkwgl 199.000000
18 jay23jack 197.000000
19 wyest 183.000000
20 winsty 183.000000
21 wanwei 183.000000
22 vivyli 183.000000
23 shl 183.000000
24 relive 183.000000
25 pp85365640 183.000000
26 liu3063031168 183.000000
27 hzqtc 183.000000
28 gaohaidong 183.000000
29 firing 183.000000
30 asmn 183.000000
31 aaron35203432 183.000000
32 aaahexing 183.000000
Ranklist After Round 2
Rank ID Rating
-------------------------------
1 ouyang_jialin 247.569566
2 navj 247.386952
3 dd_engi 244.301494
4 ezdestroyer 240.484785
5 hazy 235.752339
6 moondy 231.953683
7 yuzhirenzhe 227.935259
8 rpggpr 225.218823
9 classt 215.586198
10 asmn 213.606124
11 owen200402 208.851653
12 jay23jack 206.321180
13 milki 205.402491
14 liu3063031168 203.606124
15 ll861112 201.204508
16 relive 199.606124
17 hsys 199.586198
18 retadykay 195.035206
19 ljzhao 192.668175
20 jiangch 192.118315
21 aaahexing 189.606124
22 winsty 187.606124
23 vivyli 185.606124
24 pkwgl 182.137436
25 aaron35203432 177.606124
26 wanwei 175.606124
27 gaohaidong 173.606124
28 pp85365640 171.606124
29 wyest 165.606124
30 shl 157.606124
31 hzqtc 157.606124
32 firing 157.606124
Ranklist After Round 3
Rank ID Rating
-------------------------------
1 ouyang_jialin 274.284298
2 dd_engi 269.310502
3 yuzhirenzhe 252.427273
4 ezdestroyer 249.838334
5 navj 240.118108
6 hazy 239.534272
7 asmn 237.405695
8 moondy 234.080321
9 ll861112 220.139144
10 classt 219.204746
11 relive 216.687125
12 winsty 209.785449
13 owen200402 207.086178
14 ljzhao 204.384373
15 aaron35203432 202.698725
16 jay23jack 200.787326
17 rpggpr 197.958206
18 vivyli 195.968305
19 liu3063031168 192.320849
20 gaohaidong 191.063169
21 retadykay 186.534730
22 milki 179.952742
23 wanwei 178.881020
24 pkwgl 176.816535
25 aaahexing 175.602517
26 hsys 174.669023
27 jiangch 167.884838
28 wyest 151.790056
29 pp85365640 149.245158
30 hzqtc 148.513661
31 shl 136.513661
32 firing 136.513661
Ranklist After Round 4
Rank ID Rating
-------------------------------
1 dd_engi 294.123185
2 ouyang_jialin 292.661790
3 yuzhirenzhe 266.733907
4 hazy 262.996260
5 asmn 257.059404
6 navj 249.527555
7 ezdestroyer 242.376074
8 moondy 242.034024
9 classt 234.506252
10 ljzhao 225.034674
11 relive 224.217466
12 vivyli 211.385409
13 owen200402 207.490356
14 hsys 206.022668
15 ll861112 193.355761
16 rpggpr 193.194016
17 retadykay 192.810745
18 winsty 189.943806
19 milki 188.827034
20 liu3063031168 188.070184
21 wanwei 183.852616
22 jay23jack 183.765362
23 aaron35203432 177.502604
24 gaohaidong 176.927027
25 aaahexing 176.871543
26 pkwgl 167.975466
27 wyest 147.204587
28 jiangch 145.852397
29 hzqtc 140.220733
30 pp85365640 128.886983
31 firing 117.285055
32 shl 117.285055
Ranklist After Round 5
Rank ID Rating
-------------------------------
1 ouyang_jialin 313.526455
2 dd_engi 272.864161
3 moondy 269.316996
4 hazy 268.422310
5 classt 258.462904
6 yuzhirenzhe 247.832453
7 asmn 239.008078
8 navj 232.143165
9 ezdestroyer 225.628509
10 ll861112 219.027057
11 hsys 218.547806
12 rpggpr 212.879942
13 ljzhao 209.842719
14 relive 209.099131
15 jay23jack 208.303487
16 wanwei 206.382862
17 winsty 197.923666
18 vivyli 197.425503
19 aaahexing 194.031477
20 owen200402 193.882716
21 retadykay 180.531339
22 milki 176.907855
23 liu3063031168 176.219415
24 pkwgl 175.935380
25 aaron35203432 166.605677
26 gaohaidong 166.081962
27 hzqtc 162.648774
28 wyest 161.016497
29 jiangch 137.783895
30 pp85365640 122.306124
31 firing 111.705842
32 shl 111.705842
Ranklist After Round 6
Rank ID Rating
-------------------------------
1 ouyang_jialin 318.699617
2 moondy 290.240985
3 classt 272.339213
4 hazy 263.424408
5 asmn 252.613395
6 ezdestroyer 248.435112
7 ll861112 246.428849
8 dd_engi 241.479208
9 rpggpr 232.836954
10 winsty 229.233504
11 relive 221.397964
12 yuzhirenzhe 218.650448
13 owen200402 217.558082
14 ljzhao 216.074310
15 navj 212.363873
16 vivyli 210.780409
17 hsys 209.992855
18 aaahexing 203.693389
19 jay23jack 202.674277
20 wanwei 190.927375
21 retadykay 187.412687
22 pkwgl 169.230824
23 wyest 167.650224
24 gaohaidong 166.262475
25 milki 166.115737
26 hzqtc 165.136608
27 aaron35203432 158.739257
28 liu3063031168 153.489287
29 jiangch 118.475115
30 pp85365640 104.343118
31 shl 94.650220
32 firing 94.650220
Ranklist After Round 7
Rank ID Rating
-------------------------------
1 moondy 311.412455
2 ouyang_jialin 289.509266
3 classt 289.045219
4 rpggpr 261.024967
5 hazy 260.906201
6 relive 244.610384
7 asmn 229.044727
8 ljzhao 225.764826
9 ezdestroyer 225.235677
10 ll861112 223.407107
11 hsys 222.230199
12 aaahexing 220.497607
13 dd_engi 218.896882
14 wanwei 218.880337
15 owen200402 217.115281
16 vivyli 214.946908
17 jay23jack 209.570222
18 winsty 207.743711
19 yuzhirenzhe 198.109528
20 navj 192.387954
21 pkwgl 191.128966
22 retadykay 183.681608
23 aaron35203432 183.571300
24 milki 178.291752
25 liu3063031168 172.786317
26 wyest 169.689417
27 gaohaidong 166.425412
28 hzqtc 149.399868
29 jiangch 106.818227
30 pp85365640 93.880925
31 shl 84.993376
32 firing 84.993376
}}}
来源
之前一直在YY一个rating system来作为暑假集训的成绩衡量法。比较有名的自然是TC的rating系统,不过比较复杂,我能力有限,实现不了……
前几天逛TC论坛看到某人发的一个研究rating system的帖子(好像是那个人的毕业设计-_-),下了来看了下,里面提到了一个名叫Elo的简单的rating system,模型很简单,于是就打算拿来做个试验。
PS,这么模型是用来作为国际象棋的rating系统的。
原理
这个rating system原理还是差不多的,分三步。
1. 根据当前各自的rating,计算出每两个人之间的胜负概率;
1. 根据胜负概率,计算每个人的期望排名;
1. 由期望排名和实际排名,来生成新的rating。
于是只有两个公式,第一个公式,用来求两个人之间的胜负概率:
P = 1 / (1 + pow(10, (r2 - r1) / 400))
其中,r2,r1为两个人当前各自的rating,P求出的是r1 win r2的概率(也就是r1名次高于r2的概率)。
第二个公式,用来求新rating:
r' = r + K(E - S)
E是期望的名次,S是实际的名次,K是一个可以设定比例系数,K controls how much recent information should be weighed。原来这个公式中的E和S分别是期望得分和实际得分,我这里改成名次了。
其实还有另外一个公式,就是由每两个人的胜负概率来求每个人的期望名次,这个原文没有给,随便YY了一个,应该没什么问题。
一些设定
1. 这个方案里面,每个人有一个初始的rating,现在设定为200,不过这个对具体的排名不会有任何影响,因为计算胜负关系只和rating差有关,所以保证大家都在同一个起点开始就可以了。
1. 关于K的设定,原文如下:K = 16 is typical for experts in chess, and K = 32 is recommended for beginners in chess. From experimentation, K = 2 was the best fit for the TopCoder data, and best K = 16 worked best for the Halo data. 上面说过了,我把得分改成了名次,而国际象棋里面的得分取值为0, 0.5, 1,而我们这里名次的取值则要大得多,所以K应该取得小为好,现在取值为2(测试过,确实K取2的时候的结果比K去16时候的结果要好不少)。
1. 到时候是分组赛,每场比赛的参加人员是不一样的。这里假定一共有4组。为了消除比赛先后的影响,我把4场比赛作为一轮,显然每个人每轮参加3场比赛。然后模拟这4场比赛的所有可能的先后顺序,一共可能有4! = 24种顺序,然后去取这24种情况的最终rating的平均值。我觉得这样可以消除一些rating系统的不确定因素,因为不能保证rating系统是否会偏袒先参加的,或者是后参加的。比较过,这样取一下平均和不取平均会有一些略微的差别,也就是说,取或者不取,其实结果都是还不错的。欢迎大家来测试+讨论。
1. 应该参加比赛,而没有参加比赛的,则设定其解题数为0,依然参与排名;而某场比赛的所有无关的参赛人员都会从ranklist中去除。
1. 一场比赛种的排名方式与ranklist方式一致,首先按照解题数排名,相同的按照罚时排,依然相同的名次并列,都取中间名次(比如Fire rank为1,后面有三只并列第二的,则他们的名次都应该是3,而不是2;如果是四只并列的话则应该都是3.5)。往年计算最终成绩只是考虑解题数的,所以这点是一个比较大的改变,解题速度也考虑到了最后的成绩计算中。
1. 如教练s所说,这个最后得到的ranklist仅仅作为校队录取的参考。
1. 想起来再说。
附录
附录1: TC rating system介绍
http://www.topcoder.com/wiki/display/tc/Algorithm+Competition+Rating+System
以下是mathematica版本,可从附件下载

附录2: 上面提到的那个PDF文档
http://forums.topcoder.com/?module=Thread&threadID=575003&start=0&mc=5#801637
附录3: 源程序
写得很烂-_-还很慢-_-
#include <iostream>
#include <string>
#include <sstream>
#include <set>
#include <map>
#include <cmath>
#include <vector>
#include <algorithm>
#include <cstdio>
using namespace std;
vector<vector<string> > vs;
const double K = 2.0;
const double INITRATE = 200;
const int MAXGROUP = 4;
const int MAXROUND = 10;
int roundsize[MAXROUND];
map<string, double> rating;
map<string, double>::iterator mi;
void tolower(char* str)
{
for (int i = 0; str[i]; ++i) {
if (str[i] >= 'A' && str[i] <= 'Z') {
str[i] += 32;
}
}
}
string tolower(string str)
{
for (int i = 0; i < str.size(); ++i) {
if (str[i] >= 'A' && str[i] <= 'Z') {
str[i] += 32;
}
}
return str;
}
struct Person
{
string name;
int solved;
int t;
Person(string str) //For 2.0
{
while (str[str.size() - 1] == ' ') {
str = str.substr(0, str.size() - 1);
}
stringstream Stream(str);
int num;
Stream >> num >> name >> solved;
string tt;
while (Stream >> tt);
stringstream S2(tt);
S2 >> t;
name = tolower(name);
}
/*Person(string str) //For 1.0
{
while (str[str.size() - 1] == ' ') {
str = str.substr(0, str.size() - 1);
}
stringstream Stream(str);
int num;
Stream >> num >> name >> solved;
name = tolower(name);
str[str.size() - 3] = str[str.size() - 6] = ' ';
stringstream Stream2(str.substr(str.size() - 8));
t = 0;
for (int i = 0; i < 3; ++i) {
Stream2 >> num;
t *= 60;
t += num;
}
}*/
Person(string str, int i, int j) : name(str), solved(i), t(j){}
};
double calp(double r2, double r1)
{
return 1.0 / (1.0 + pow(10.0, (r2 - r1) / 400.0));
}
bool cmp(const Person &a, const Person &b)
{
if (a.solved == b.solved) {
return a.t < b.t;
}
return a.solved > b.solved;
}
void go(vector<string> v)
{
int ind = v[0][0] - 'A';
set<string> names, names2;
set<string>::iterator si, si2;
for (int i = 0; i < vs.size(); ++i) {
if (i == ind) {
continue;
}
for (int j = 0; j < vs[i].size(); ++j) {
names.insert(vs[i][j]);
}
}
names2 = names;
string str;
vector<Person> vp;
for (int i = 1; i < v.size(); ++i) {
str = v[i];
vp.push_back(Person(str));
if (names.find(vp.back().name) == names.end()) {
vp.pop_back();
}
else {
names.erase(vp.back().name);
}
}
for (si = names.begin(); si != names.end(); ++si) {
vp.push_back(Person(*si, 0, 0));
}
sort(vp.begin(), vp.end(), cmp);
map<string, double> rank;
/*for (int i = 0; i < vp.size(); ) { //算罚时
int j;
for (j = i + 1; j < vp.size(); ++j) {
if (vp[j].solved != vp[i].solved || vp[j].t != vp[i].t) {
break;
}
}
--j;
double mid = double(i + j) / 2;
for (; i <= j; ++i) {
rank[vp[i].name] += mid;
}
}*/
for (int i = 0; i < vp.size(); ) { //不算罚时
int j;
for (j = i + 1; j < vp.size(); ++j) {
if (vp[j].solved != vp[i].solved) {
break;
}
}
--j;
double mid = double(i + j) / 2;
for (; i <= j; ++i) {
rank[vp[i].name] += mid;
}
}
map<string, double> shouldberank;
for (si = names2.begin(); si != names2.end(); ++si) {
double sum = 0;
for (si2 = names2.begin(); si2 != names2.end(); ++si2) {
if (si == si2) {
continue;
}
sum += calp(rating[*si], rating[*si2]);
}
shouldberank[*si] = sum;
}
for (si = names2.begin(); si != names2.end(); ++si) {
rating[*si] += K * (shouldberank[*si] - rank[*si]);
}
}
void outputrank(int ind)
{
printf("Ranklist After Round %d\n", ind);
puts("Rank ID Rating");
puts("--------------------------------");
vector<pair<double, string> > vvp;
for (mi = rating.begin(); mi != rating.end(); ++mi) {
vvp.push_back(make_pair(mi->second, mi->first));
}
sort(vvp.begin(), vvp.end());
for (int i = vvp.size() - 1; i >= 0; --i) {
printf("%-2d %-16s %10lf\n", vvp.size() - i, vvp[i].second.c_str(), vvp[i].first);
}
puts("");
}
double fact(int n)
{
if (n <= 1) return 1.0;
else return n * fact(n - 1);
}
int main()
{
//freopen("1.txt", "w", stdout);
int gpNum;
scanf("%d", &gpNum);
char str[1024];
gets(str);
for (int i = 0; i < gpNum; ++i) {
vector<string> v;
gets(str);
stringstream Stream(str);
while (Stream >> str) {
tolower(str);
v.push_back(str);
rating[str] = INITRATE;
}
vs.push_back(v);
}
map<string, double> init = rating;
char g[1024];
int ind = 0;
vector<string> vs[MAXROUND][MAXGROUP];
int round = 0;
while (scanf("%d", roundsize + round) != EOF) {
for (int i = 0; i < roundsize[round]; ++i) {
scanf("%s", g);
vs[round][i].push_back(g);
gets(g);
while (gets(g) && g[0]) {
vs[round][i].push_back(g);
}
}
++round;
}
vector<map<string, double> > ratings;
rating = init;
for (int ri = 0; ri < round; ++ri) {
map<string, double> newr, temp = rating;
int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
do {
rating = temp;
for (int i = 0; i < roundsize[ri]; ++i) {
go(vs[ri][arr[i]]);
}
for (mi = rating.begin(); mi != rating.end(); ++mi) {
newr[mi->first] += mi->second / fact(roundsize[ri]);
}
}
while (next_permutation(arr, arr + roundsize[ri]));
rating = newr;
//outputrank(++ind);
}
ratings.push_back(rating);
rating = map<string, double>();
for (int i = 0; i < ratings.size(); ++i) {
for (mi = ratings[i].begin(); mi != ratings[i].end(); ++mi) {
rating[mi->first] += mi->second;
}
}
outputrank(round);
return 0;
}
附录4: 样例,2008新手上路ranklists
输入数据第一部分是分组情况。先输入组数,然后每行是组员名单。
第二部分是所有的ranklist,每个ranklist的第一行是出题组的组号(A/B/C/D),也就是说该组的人不参加该次比赛,如果所有人都参加(比如新手上路的比赛),那么直接填Z就可以了。
1
winsty ljzhao classT aaahexing Ouyang_Jialin firing EZdestroyer vivyli Jiangch navj moondy yuzhirenzhe gaohaidong asmn retadykay liu3063031168 ll861112 shl hazy wyest dd_engi wanwei pkwgl owen200402 relive jay23jack aaron35203432 pp85365640 rpggpr hsys milki hzqtc
Z
1 ll861112 3 37(1) 0 18(1) 170(4) 0 11 285
2 navj 3 28(8) 0 67(2) 3 147(11) 0 602
3 Ouyang_Jialin 2 33(1) 0 46(1) 1 10 0 79
4 hazy 2 98(1) 2 111(1) 0 0 1 209
5 yuzhirenzhe 2 77(1) 145(1) 1 2 0 0 222
6 Jiangch 2 99(3) 0 108(5) 0 0 0 327
7 dd_engi 2 136(6) 0 84(4) 0 0 0 380
8 EZdestroyer 2 12 0 107(5) 1 159(8) 0 486
9 ljzhao 1 30(2) 0 8 0 0 0 50
10 owen200402 1 0 0 77(1) 0 0 0 77
11 retadykay 1 58(2) 0 4 0 0 0 78
12 rpggpr 1 5 0 2 0 52(5) 0 132
13 milki 1 4 117(2) 4 0 0 0 137
14 hsys 1 97(11) 0 6 0 0 0 297
15 classT 1 117(10) 0 4 0 0 0 297
16 moondy 1 99(11) 0 0 0 6 0 299
17 pkwgl 1 140(9) 0 4 0 0 0 300
18 jay23jack 1 176(12) 0 6 0 0 0 396
19 wanwei 0 9 0 2 0 0 0 0
19 relive 0 2 0 7 0 0 0 0
19 gaohaidong 0 5 0 2 0 0 0 0
19 vivyli 0 11 0 0 0 8 0 0
19 liu3063031168 0 11 0 0 0 5 0 0
19 wyest 0 1 0 3 0 0 0 0
19 pp85365640 0 3 0 0 0 1 0 0
19 aaahexing 0 20 0 0 0 0 0 0
19 aaron35203432 0 7 0 1 0 0 0 0
Z
1 moondy 6 8(1) 39(1) 28(2) 57(2) 118(2) 90(1) 400
2 asmn 6 12(1) 36(1) 25(1) 47(1) 160(7) 81(2) 501
3 dd_engi 6 23(1) 61(1) 71(3) 33(1) 113(4) 81(3) 522
4 EZdestroyer 6 16(1) 33(1) 51(2) 60(1) 154(1) 126(6) 560
5 Ouyang_Jialin 5 5(1) 30(1) 20(1) 39(1) 8 56(1) 150
6 navj 5 3(1) 18(1) 41(1) 71(1) 11 105(2) 258
7 liu3063031168 5 13(2) 27(1) 50(1) 84(3) 0 172(1) 406
8 rpggpr 5 18(1) 32(1) 47(2) 171(1) 2 140(2) 448
9 relive 4 7(1) 44(1) 28(1) 68(1) 0 2 147
10 hazy 4 12(1) 49(1) 33(1) 72(2) 0 3 186
11 classT 4 4(1) 29(1) 20(3) 72(4) 0 8 225
12 jay23jack 4 48(1) 47(1) 48(1) 69(2) 2 1 232
13 yuzhirenzhe 4 21(3) 34(1) 46(1) 70(3) 4 8 251
14 aaahexing 4 27(1) 60(1) 39(1) 103(5) 0 4 309
15 winsty 4 19(1) 45(4) 64(2) 87(2) 0 4 315
16 vivyli 4 10(2) 46(1) 89(1) 154(15) 0 3 599
17 milki 3 13(1) 28(1) 62(1) 11 2 2 103
18 owen200402 3 19(1) 43(1) 90(3) 0 0 2 192
19 hsys 3 26(1) 19(1) 4 155(1) 0 3 200
20 aaron35203432 3 8(1) 7 41(3) 117(2) 0 0 226
21 wanwei 3 11(1) 100(7) 2 32(2) 0 0 283
22 gaohaidong 3 20(2) 52(1) 4 147(6) 0 0 339
23 pp85365640 3 136(5) 71(1) 122(4) 2 0 0 469
24 retadykay 2 14(2) 39(2) 2 0 0 3 93
25 pkwgl 2 36(3) 53(1) 1 7 0 0 129
26 wyest 2 13(1) 144(3) 0 5 0 2 197
27 ljzhao 1 17(2) 2 2 0 0 0 37
Z
1 Ouyang_Jialin 3 0 62(1) 0 0 176(5) 16(1) 334
2 dd_engi 3 0 31(1) 0 0 166(6) 39(1) 336
3 yuzhirenzhe 3 0 172(9) 0 0 136(5) 38(1) 586
4 asmn 2 1 90(1) 0 0 0 24(1) 114
5 aaron35203432 2 0 78(2) 0 0 2 34(2) 152
6 winsty 2 0 120(2) 0 0 0 25(1) 165
7 ll861112 2 0 0 0 0 101(4) 22(1) 183
8 relive 2 0 0 0 0 125(6) 30(2) 275
9 gaohaidong 2 0 165(4) 0 0 0 97(2) 342
10 EZdestroyer 2 0 176(12) 0 0 0 76(4) 532
11 ljzhao 2 0 168(14) 0 0 0 114(4) 602
12 vivyli 2 0 133(18) 0 0 9 44(8) 657
13 hazy 1 0 23 0 0 0 17(1) 17
14 classT 1 0 5 0 0 7 21(1) 21
15 moondy 1 0 0 0 0 9 21(1) 21
16 wanwei 1 0 5 0 0 0 36(1) 36
17 owen200402 1 0 2 0 0 0 43(1) 43
18 navj 1 1 0 0 0 11 44(1) 44
19 jay23jack 1 2 3 0 0 2 55(1) 55
20 pkwgl 1 0 3 0 0 5 46(2) 66
21 retadykay 1 0 14 0 0 0 29(3) 69
22 liu3063031168 1 0 19 0 0 1 43(5) 123
23 hzqtc 1 0 140(3) 0 0 0 8 180
24 aaahexing 1 0 3 0 0 0 142(8) 282
25 wyest 1 0 1 0 0 3 150(10) 330
26 hsys 0 0 7 4 0 0 2 0
27 milki 0 0 0 0 0 0 2 0
Z
1 dd_engi 4 34(1) 8 60(5) 0 119(1) 13(1) 306
2 hsys 4 80(1) 0 85(4) 0 162(4) 21(1) 468
3 hazy 3 42(1) 0 0 0 117(1) 20(1) 179
4 Ouyang_Jialin 3 35(1) 8 121(3) 0 0 17(1) 213
5 asmn 3 17(2) 100(4) 1 0 1 35(1) 232
6 ljzhao 3 62(1) 0 0 0 164(3) 23(1) 289
7 yuzhirenzhe 3 59(4) 0 13 0 178(4) 24(1) 381
8 classT 3 117(1) 0 159(7) 0 0 24(2) 440
9 vivyli 3 70(3) 0 163(12) 0 1 21(1) 514
10 navj 2 30(2) 6 3 0 0 10(1) 60
11 moondy 2 32(1) 4 0 0 0 42(1) 74
12 relive 2 59(1) 0 1 0 0 26(1) 85
13 milki 2 58(1) 0 0 0 2 29(1) 87
14 retadykay 2 49(1) 0 0 0 3 70(1) 119
15 wanwei 2 115(1) 0 0 0 1 71(5) 266
16 owen200402 2 154(5) 0 0 0 0 116(3) 390
17 aaahexing 1 0 0 0 0 0 15(1) 15
18 EZdestroyer 1 0 4 4 0 3 19(1) 19
19 liu3063031168 1 0 0 0 0 3 20(1) 20
20 rpggpr 1 5 1 0 0 0 20(1) 20
21 wyest 1 1 0 0 0 0 40(1) 40
22 pkwgl 1 1 2 0 0 8 63(1) 63
23 hzqtc 1 1 0 0 0 3 53(2) 73
24 gaohaidong 1 0 1 0 0 0 88(1) 88
25 jay23jack 1 8 1 1 0 0 35(4) 95
26 winsty 1 2 0 0 0 0 84(7) 204
Z
1 moondy 3 174(5) 0 0 0 157(2) 0 431
2 Ouyang_Jialin 2 44(1) 0 0 0 2 3 44
3 classT 2 49(2) 0 0 0 0 0 69
4 ll861112 2 58(2) 0 0 0 0 19 78
5 jay23jack 2 85(2) 0 0 0 13 0 105
6 wanwei 2 0 0 0 0 94(3) 0 134
7 rpggpr 2 0 0 0 0 0 156(3) 196
8 hzqtc 2 86(9) 9 0 0 0 0 246
9 aaahexing 2 151(8) 0 0 0 4 0 291
10 hsys 2 158(8) 0 0 0 0 0 298
11 hazy 1 56(1) 0 0 0 0 0 56
12 wyest 1 93(3) 1 0 0 1 0 133
13 winsty 1 74(4) 0 0 0 0 0 134
14 pkwgl 1 164(4) 0 0 0 0 0 224
15 retadykay 0 12 0 0 0 0 0 0
16 relive 0 5 0 0 0 0 0 0
17 milki 0 13 0 0 0 0 15 0
18 gaohaidong 0 8 0 0 0 0 0 0
19 vivyli 0 28 0 0 0 0 0 0
20 liu3063031168 0 11 0 0 0 0 0 0
21 owen200402 0 6 0 0 0 0 0 0
22 ljzhao 0 32 0 0 0 0 0 0
23 pp85365640 0 7 0 0 0 0 0 0
24 navj 0 50 2 0 0 0 0 0
Z
1 winsty 5 55(1) 68(1) 0 164(1) 117(5) 29(1) 513
2 ll861112 5 83(3) 14(1) 0 171(1) 49(2) 148(7) 645
3 moondy 4 22(1) 52(1) 0 155(3) 0 83(2) 372
4 EZdestroyer 4 52(1) 63(3) 0 6 179(1) 34(2) 388
5 owen200402 4 38(1) 78(3) 0 0 157(1) 123(1) 436
6 rpggpr 3 85(1) 101(1) 0 0 65(2) 4 271
7 classT 3 63(2) 113(3) 0 0 1 40(2) 296
8 asmn 3 71(1) 56(3) 0 6 168(1) 8 335
9 Ouyang_Jialin 3 49(2) 87(1) 0 0 149(3) 8 345
10 relive 3 91(1) 53(6) 0 0 0 178(4) 482
11 vivyli 3 79(1) 31(4) 0 0 0 172(8) 482
12 aaahexing 3 36(1) 165(3) 0 0 0 148(6) 489
13 ljzhao 3 115(1) 143(4) 0 0 1 86(12) 624
14 retadykay 3 23(1) 121(13) 0 0 0 167(5) 631
15 wyest 2 26(2) 60(3) 0 0 0 5 146
16 hazy 2 68(2) 87(1) 0 0 0 7 175
17 hzqtc 2 29(1) 1 0 0 0 91(5) 200
18 gaohaidong 2 172(2) 38(1) 0 0 0 5 230
19 jay23jack 2 67(1) 113(5) 0 0 0 9 260
20 hsys 2 94(2) 163(1) 0 0 0 1 277
21 pkwgl 2 52(1) 172(9) 0 0 0 10 384
22 aaron35203432 2 56(7) 110(6) 0 0 1 5 386
23 milki 2 87(2) 141(8) 0 0 0 5 388
24 wanwei 1 30(1) 4 0 0 0 3 30
25 navj 1 0 0 0 0 0 160(5) 240
26 pp85365640 0 5 2 0 0 0 1 0
Z
1 rpggpr 5 167(1) 87(1) 59(4) 124(3) 177(2) 0 734
2 moondy 4 111(4) 22(1) 54(1) 0 0 154(6) 501
3 wanwei 4 0 32(2) 105(4) 142(3) 176(5) 0 655
4 relive 3 0 47(1) 67(1) 5 90(1) 0 204
5 classT 3 43(4) 55(1) 78(1) 0 15 0 236
6 aaron35203432 3 0 92(3) 44(1) 5 125(3) 0 341
7 pkwgl 3 0 79(1) 133(4) 0 166(1) 5 438
8 aaahexing 3 129(5) 98(1) 118(2) 0 0 0 445
9 liu3063031168 3 174(7) 86(1) 123(2) 0 0 0 523
10 hsys 3 163(12) 29(1) 102(6) 0 0 0 614
11 ljzhao 2 101(8) 35(1) 0 0 0 0 276
12 milki 2 0 68(1) 2 0 175(3) 0 283
13 jay23jack 2 0 148(1) 4 3 148(1) 0 296
14 vivyli 2 0 60(3) 168(15) 0 0 0 548
15 hazy 1 3 23(1) 6 0 0 0 23
16 owen200402 1 0 43(1) 3 0 0 0 43
17 wyest 1 0 76(3) 0 0 0 0 116
18 gaohaidong 1 1 163(1) 0 0 0 0 163
19 retadykay 1 0 107(6) 2 0 0 0 207
20 winsty 0 0 3 3 0 0 0 0
21 hzqtc 0 9 0 0 0 0 0 0
output:
Ranklist After Round 1
Rank ID Rating
-------------------------------
1 ll861112 231.000000
2 navj 229.000000
3 ouyang_jialin 227.000000
4 hazy 225.000000
5 yuzhirenzhe 223.000000
6 jiangch 221.000000
7 dd_engi 219.000000
8 ezdestroyer 217.000000
9 ljzhao 215.000000
10 owen200402 213.000000
11 retadykay 211.000000
12 rpggpr 209.000000
13 milki 207.000000
14 hsys 205.000000
15 classt 205.000000
16 moondy 201.000000
17 pkwgl 199.000000
18 jay23jack 197.000000
19 wyest 183.000000
20 winsty 183.000000
21 wanwei 183.000000
22 vivyli 183.000000
23 shl 183.000000
24 relive 183.000000
25 pp85365640 183.000000
26 liu3063031168 183.000000
27 hzqtc 183.000000
28 gaohaidong 183.000000
29 firing 183.000000
30 asmn 183.000000
31 aaron35203432 183.000000
32 aaahexing 183.000000
Ranklist After Round 2
Rank ID Rating
-------------------------------
1 ouyang_jialin 247.569566
2 navj 247.386952
3 dd_engi 244.301494
4 ezdestroyer 240.484785
5 hazy 235.752339
6 moondy 231.953683
7 yuzhirenzhe 227.935259
8 rpggpr 225.218823
9 classt 215.586198
10 asmn 213.606124
11 owen200402 208.851653
12 jay23jack 206.321180
13 milki 205.402491
14 liu3063031168 203.606124
15 ll861112 201.204508
16 relive 199.606124
17 hsys 199.586198
18 retadykay 195.035206
19 ljzhao 192.668175
20 jiangch 192.118315
21 aaahexing 189.606124
22 winsty 187.606124
23 vivyli 185.606124
24 pkwgl 182.137436
25 aaron35203432 177.606124
26 wanwei 175.606124
27 gaohaidong 173.606124
28 pp85365640 171.606124
29 wyest 165.606124
30 shl 157.606124
31 hzqtc 157.606124
32 firing 157.606124
Ranklist After Round 3
Rank ID Rating
-------------------------------
1 ouyang_jialin 274.284298
2 dd_engi 269.310502
3 yuzhirenzhe 252.427273
4 ezdestroyer 249.838334
5 navj 240.118108
6 hazy 239.534272
7 asmn 237.405695
8 moondy 234.080321
9 ll861112 220.139144
10 classt 219.204746
11 relive 216.687125
12 winsty 209.785449
13 owen200402 207.086178
14 ljzhao 204.384373
15 aaron35203432 202.698725
16 jay23jack 200.787326
17 rpggpr 197.958206
18 vivyli 195.968305
19 liu3063031168 192.320849
20 gaohaidong 191.063169
21 retadykay 186.534730
22 milki 179.952742
23 wanwei 178.881020
24 pkwgl 176.816535
25 aaahexing 175.602517
26 hsys 174.669023
27 jiangch 167.884838
28 wyest 151.790056
29 pp85365640 149.245158
30 hzqtc 148.513661
31 shl 136.513661
32 firing 136.513661
Ranklist After Round 4
Rank ID Rating
-------------------------------
1 dd_engi 294.123185
2 ouyang_jialin 292.661790
3 yuzhirenzhe 266.733907
4 hazy 262.996260
5 asmn 257.059404
6 navj 249.527555
7 ezdestroyer 242.376074
8 moondy 242.034024
9 classt 234.506252
10 ljzhao 225.034674
11 relive 224.217466
12 vivyli 211.385409
13 owen200402 207.490356
14 hsys 206.022668
15 ll861112 193.355761
16 rpggpr 193.194016
17 retadykay 192.810745
18 winsty 189.943806
19 milki 188.827034
20 liu3063031168 188.070184
21 wanwei 183.852616
22 jay23jack 183.765362
23 aaron35203432 177.502604
24 gaohaidong 176.927027
25 aaahexing 176.871543
26 pkwgl 167.975466
27 wyest 147.204587
28 jiangch 145.852397
29 hzqtc 140.220733
30 pp85365640 128.886983
31 firing 117.285055
32 shl 117.285055
Ranklist After Round 5
Rank ID Rating
-------------------------------
1 ouyang_jialin 313.526455
2 dd_engi 272.864161
3 moondy 269.316996
4 hazy 268.422310
5 classt 258.462904
6 yuzhirenzhe 247.832453
7 asmn 239.008078
8 navj 232.143165
9 ezdestroyer 225.628509
10 ll861112 219.027057
11 hsys 218.547806
12 rpggpr 212.879942
13 ljzhao 209.842719
14 relive 209.099131
15 jay23jack 208.303487
16 wanwei 206.382862
17 winsty 197.923666
18 vivyli 197.425503
19 aaahexing 194.031477
20 owen200402 193.882716
21 retadykay 180.531339
22 milki 176.907855
23 liu3063031168 176.219415
24 pkwgl 175.935380
25 aaron35203432 166.605677
26 gaohaidong 166.081962
27 hzqtc 162.648774
28 wyest 161.016497
29 jiangch 137.783895
30 pp85365640 122.306124
31 firing 111.705842
32 shl 111.705842
Ranklist After Round 6
Rank ID Rating
-------------------------------
1 ouyang_jialin 318.699617
2 moondy 290.240985
3 classt 272.339213
4 hazy 263.424408
5 asmn 252.613395
6 ezdestroyer 248.435112
7 ll861112 246.428849
8 dd_engi 241.479208
9 rpggpr 232.836954
10 winsty 229.233504
11 relive 221.397964
12 yuzhirenzhe 218.650448
13 owen200402 217.558082
14 ljzhao 216.074310
15 navj 212.363873
16 vivyli 210.780409
17 hsys 209.992855
18 aaahexing 203.693389
19 jay23jack 202.674277
20 wanwei 190.927375
21 retadykay 187.412687
22 pkwgl 169.230824
23 wyest 167.650224
24 gaohaidong 166.262475
25 milki 166.115737
26 hzqtc 165.136608
27 aaron35203432 158.739257
28 liu3063031168 153.489287
29 jiangch 118.475115
30 pp85365640 104.343118
31 shl 94.650220
32 firing 94.650220
Ranklist After Round 7
Rank ID Rating
-------------------------------
1 moondy 311.412455
2 ouyang_jialin 289.509266
3 classt 289.045219
4 rpggpr 261.024967
5 hazy 260.906201
6 relive 244.610384
7 asmn 229.044727
8 ljzhao 225.764826
9 ezdestroyer 225.235677
10 ll861112 223.407107
11 hsys 222.230199
12 aaahexing 220.497607
13 dd_engi 218.896882
14 wanwei 218.880337
15 owen200402 217.115281
16 vivyli 214.946908
17 jay23jack 209.570222
18 winsty 207.743711
19 yuzhirenzhe 198.109528
20 navj 192.387954
21 pkwgl 191.128966
22 retadykay 183.681608
23 aaron35203432 183.571300
24 milki 178.291752
25 liu3063031168 172.786317
26 wyest 169.689417
27 gaohaidong 166.425412
28 hzqtc 149.399868
29 jiangch 106.818227
30 pp85365640 93.880925
31 shl 84.993376
32 firing 84.993376
附加文件
- TC_Rating.jpg by asmn
- TC_Rating.nb by asmn