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
附加文件