Acgo 竞赛积分系统
2025-11-25 16:16:06
发布于:浙江
概述
新版 \tt{Acgo}Acgo 竞赛分系统参考了 \tt{AtCoder}AtCoder 平台的 \tt{AtCoder\ Rating\ System\ ver. 1.00}AtCoder Rating System ver.1.00[1]。
该积分系统基于 \tt{Logistic\ Distribution}Logistic Distribution(或 \tt{Sigmoid\ Function}Sigmoid Function),类似于 \tt{Elo}Elo 评分系统,但进行了许多修改。
新版竞赛分系统上线后,用户参加 \tt{Acgo}Acgo 的所有比赛将会有 \tt{Rated}Rated 和 \tt{Unrated}Unrated(即「评分」与「不评分」)两种状态。
正常情况下参加比赛的选手状态为 \tt{Rated}Rated,状态被评为 \tt{Unrated}Unrated 包含但不仅限于以下情况:
参加本场比赛前竞赛分超过本场比赛的 \tt{Rated}Rated 分数线限制(RATEDBOUNDRATEDBOUND);
比赛中作弊,被取消比赛成绩;
本场比赛因不可抗力因素导致无法正常进行的将参与本场比赛的所有用户设置为 \tt{Unrated}Unrated。
对于 \tt{Rated}Rated 的选手,在每场比赛中,会获得一个「表现分」。这个值代表了你在比赛中的表现如何。
粗略地说,你的每场比赛后的竞赛分为「表现分」的加权平均值(最近的比赛权重更高)减去 f(x)f(x)(xx 为 \tt{Rated}Rated 比赛的参与次数),其中 f(1) = 1200f(1)=1200,且 ff 随参加的 \tt{Rated}Rated 比赛的次数增加而逐渐减小并趋于零。
这意味着如果你持续获得 XX 的表现分,你的竞赛分将从 X−1200X−1200 开始,并逐渐趋近于 XX。
请不要担心在第一场比赛中获得很低的竞赛分,如果你参加更多比赛,分数很可能会迅速上升。当参加 1010 场比赛后,你的竞赛分将会非常接近于你的真实实力。
计算表现分
在系统内部有两种类型的「表现分」:PerfPerf 和 RPerfRPerf(修正后的 PerfPerf) 。
首先,对于每个参赛选手,我们计算出他们的 APerfAPerf(平均表现分)。
令 Perf_1, Perf_2, \cdots, Perf_kPerf
1
,Perf
2
,⋯,Perf
k
为一位参赛选手的历史 PerfPerf。其中 Perf_1Perf
1
是最近参加的一场比赛,Perf_kPerf
k
是最早参加的一场比赛,这位选手的 APerfAPerf 被定义为:
\begin{equation} APerf = \frac{\sum_{i=1}^{k}Perf_i \times 0.9i}{\sum_{i=1}{k}0.9^i} \end{equation}
APerf=
∑
i=1
k
0.9
i
∑
i=1
k
Perf
i
×0.9
i
所有第一次参与 \tt{Acgo}Acgo 的 \tt{Rated}Rated 比赛的选手的 APerfAPerf 将会被设置为 CenterCenter。
CenterCenter 和每一场 \tt{Rated}Rated 比赛的 RATEDBOUNDRATEDBOUND(即 \tt{Rated}Rated 上限)有关。
Center = RATEDBOUND \times 0.4Center=RATEDBOUND×0.4。
令 nn 为一场比赛中所有的 \tt{Rated}Rated 的参赛选手的数量,令 APerf_iAPerf
i
为第 ii 个选手的 APerfAPerf。那么比赛的 \tt{Rated}Rated 榜单中,排行第 rr 名选手的 PerfPerf 被定义为满足以下公式的唯一的 XX:
\begin{equation} \sum\frac{1}{1 + 6.0^{(X - APerf_i) / 400.0}} = r - 0.5 \end{equation}
∑
1+6.0
(X−APerf
i
)/400.0
1
=r−0.5
这个 XX 可以使用二分来计算得出。
请注意,以上的排名是所有并列名次的平均值。例如,如果有四个人并列第 33 名至第 66 名,那么这些人的排名为 4.54.5。
除此之外,为了避免在第一场比赛中的「表现分」方差过小,\tt{Acgo}Acgo 使用新竞赛分系统的第一场比赛(这里指 排位赛#4)的表现值会被放大处理,具体如下:
\begin{equation} Perf = (Perf - Center) \times 1.5 + Center \end{equation}
Perf=(Perf−Center)×1.5+Center
最终,对于每个用户其 RPerfRPerf 使用以下方式计算:
\begin{equation} RPerf = \min{{Perf, RATEDBOUND + 100}} \end{equation}
RPerf=min{Perf,RATEDBOUND+100}
其中 RATEDBOUNDRATEDBOUND 对于不同的比赛是不一样的,每场比赛的 RATEDBOUNDRATEDBOUND 会在竞赛说明中给出。
计算竞赛分
定义 FF 为:
\begin{equation} F(n) = \frac{\sqrt{\sum_{i=1}^{n} 0.81i}}{\sum_{i=1}n 0.9^i} \end{equation}
F(n)=
∑
i=1
n
0.9
i
∑
i=1
n
0.81
i
定义 ff 为:
\begin{equation} f(n) = \frac{F(n) - F(\infin)}{F(1) - F(\infin)} \times 1200 \end{equation}
f(n)=
F(1)−F(∞)
F(n)−F(∞)
×1200
定义 gg 为:
\begin{equation} g(X) = 2.0^{\frac{X}{800}} \end{equation}
g(X)=2.0
800
X
该函数可以给更好的表现赋予更多的权重。因此,极好表现与较好表现之间的差异会非常大,而重大失误与一般失误之间的差异则不会那么大。
这样可以使得当参赛者在比赛中打出了超出水平的发挥时,会增加更多的竞赛分;当参赛者在比赛中打出了远低于自己水平的表现分时,不会减少太多的竞赛分;
令 RPerf_1, RPerf_2, \cdots, RPerf_kRPerf
1
,RPerf
2
,⋯,RPerf
k
为一位参赛选手的历史 RPerfRPerf,其中 RPerf_1RPerf
1
为当场比赛的 RPerfRPerf。那么本场比赛结束后,其竞赛分为:
\begin{equation} Rating = g{-1}(\frac{\sum_1k g(RPerf_i) \times 0.9i}{\sum_1k 0.9^i}) \end{equation}
Rating=g
−1
(
∑
1
k
0.9
i
∑
1
k
g(RPerf
i
)×0.9
i
)
然后考虑公式 (6)(6) 的 ff 函数对竞赛分的影响,定义以下函数[2]:
\begin{equation} mapRating(r) = \begin{cases} \frac{400}{\exp{(\frac{400 - r}{400})}} &{r \le 400}\ r & {r \gt 400}\ \end{cases} \end{equation}
mapRating(r)={
exp(
400
400−r
)
400
r
r≤400
r>400
最终 RatingRating 计算出来为:
\begin{equation} TrueRating = mapRaing(Rating - f(n)) \end{equation}
TrueRating=mapRaing(Rating−f(n))
其中 nn 为已经参加的 \tt{Rated}Rated 的比赛场次(包括本场)。
本文档的版本记录
10/29/2024 Ver. 1.00: 第一版。
这里空空如也











有帮助,赞一个