Codeforces Rating System


來翻譯一下官方文檔,但是建議看英文原文,本文可能會出現一些錯誤,雖然不是為了方便自己查閱用的。


首先,對於人 \(i\),定義 \(r_i\) 是他的 rating,對於人 \(i,j\),定義 \(P_{i,j}\) 為在一場比賽中 \(i\)\(j\) 強的概率。

Codeforces 想盡力讓這個柿子成立:

\[P_{i,j}=\frac{1}{1+10^{\frac{r_j-r_i}{400}}} \]

一場比賽開始前,定義 \(seed_i\) 為第 \(i\) 個人的期望排名。明顯有 \(seed_i=1+\sum\limits_{j\ne i}P_{j,i}\)

比賽結束后(如果此時還是 rated 的話),取 \(m_i\)\(seed_i\) 和實際排名 \(rank_i\) 的幾何平均數(\(m_i=\sqrt{seed_irank_i}\))。把 \(m_i\) 當作排名計算出這個人在這場比賽中的表現 rating \(R_i\),然后這個人的 rating 變化是 \(d_i=\frac{R_i-r_i}{2}\)

不過這還沒完。為了讓 rating 平均變化更接近 0,還要進行微調。

再定義一個數 \(inc\),讓所有 \(d_i+=inc\)

計算方法,先進行第一次微調,這次讓 \(inc=\frac{-1-\sum d_i}{n}\)\(n\) 是參賽人數)。這保證了所有人的平均變化靠近 0 又在 0 以下。

然后進行第二次微調,取比賽前 rating 前 \(s=\min(n,4\sqrt{n})\) 高的人,合理設置 \(inc\) 使得前 \(s\) 個人的平均變化為 0。但是這個 \(inc\) 也不能太大,所以 \(inc=\min(\max(inc,-10),0)\)。用這個 \(inc\) 進行第二次微調。這同時讓所有人的平均變化在 0 的更下面。(smg 啊……)


upd 2020.5.26:

看到 rating 系統有點小變化,來更新了。

首先注意到新注冊的號初始 rating 是 0 而不是 1500。但是對於比較新的號 rating 也會有不同的計算方式。

在第一場比賽中,把他的 rating 看作 \(1400\) 來計算變化 \(d_1\)。然后他的 rating 會變成 \(500+d_1\)

在第二場比賽中,把他的 rating 看作 \(1400+d_1\) 來計算變化 \(d_2\)。然后他的 rating 會變成 \(500+d_1+350+d_2\)

在第三場比賽中,把他的 rating 看作 \(1400+d_1+d_2\) 來計算變化 \(d_3\)。然后他的 rating 會變成 \(500+d_1+350+d_2+250+d_3\)

前六場都這么做,每次后面加的數是 \(500,350,250,150,100,50\)。注意到這些數的和恰好是 \(1400\)

以后的場按正常方式計算。

這樣的好處:

  • 實質上把每個賬號的初始 rating 變成了 1400 左右而不是 1500,可緩解通貨膨脹。
  • 目前大多數用戶一開始都會不停掉,現在這樣也能有鼓勵作用了。

現在這個與 AtCoder 有一定相像之處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM