來翻譯一下官方文檔,但是建議看英文原文,本文可能會出現一些錯誤,雖然不是為了方便自己查閱用的。
首先,對於人 \(i\),定義 \(r_i\) 是他的 rating,對於人 \(i,j\),定義 \(P_{i,j}\) 為在一場比賽中 \(i\) 比 \(j\) 強的概率。
Codeforces 想盡力讓這個柿子成立:
一場比賽開始前,定義 \(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 有一定相像之處。