標籤:
在電子競技遊戲中,特別是當有多名選手參加比賽的時候需要平衡隊伍間的水平,讓遊戲比賽更加有意思。這樣的一個參賽選手能力平衡系統通常包含以下三個模組:
- 一個包含跟蹤所有玩家比賽結果,記錄玩家能力的模組。
- 一個對比賽成員進行配對的模組。
- 一個公布比賽中各成員能力的模組。
事實上目前已經有的遊戲評分系統是Elo評分,但是Elo評分僅只是兩名選手參加的遊戲。TrueSkill系統是基於貝葉斯推斷的評分系統,由微軟研究院開發以代替傳統Elo評分,並成功應用於Xbox Live自動匹配系統。TrueSkill評分系統是Glicko評分系統的衍伸,主要用於多人遊戲中。TrueSkill評分系統考慮到了你水平的不確定性,綜合考慮了玩家的勝率和可能的水平漲落。當玩家進行了更多的遊戲後,即使你的勝率不變,系統也會因為對你的水平更加瞭解而改變對你的評分。
怎樣進行能力計算
TrueSkill排名系統是針對玩家能力進行設計的,以克服現有排名系統的局限性,確保比賽雙方的公平性,可以在聯賽中作為排名系統使用。它為玩家排名使用的為 貝葉斯定理。 系統的特點是假設每一個玩家的能力不是固定的,其能力水平的表現為一個鐘型曲線(常態分佈或高斯分布)。
綠色地區15~20代表了Ranking System對的評分。可以看出系統的評分是比較保守的。σ越小則越靠近μ ,相應的玩家的能力水平就較高。總的來說玩家的水平受“平均得分”和“玩家穩定性”綜合影響。
由於TrueSkill排名系統使用高斯信仰分布來描述一個玩家的能力,也就意味著玩家的能力始終落在4倍的σ內(機率為99.993666%)。從微軟追蹤的65萬玩家資料顯示,有99.99%都落在了3倍的σ內。 有趣的是,TrueSkill排名系統可以使用1作為最初的不確定性做所有的計算,將相乘μ和σ可以縮放到任何其他的範圍。假設所有的計算都以初始值μ=3和σ=1,如果一個玩家有50級,幾乎所有的μ的發生是在±3倍的初始σ,σ可得50/6 = 8.3。 兩個玩家最大的區別在於μ值得大小。假設σ相當,那麼μ高的玩家贏得機會就越大,這一原則也適用在TrueSkill排名系統。但並不表示μ高的就一定會贏。在單個的配對比賽中,玩家的個人表現與玩家的能力是相當的,遊戲結果也是有個人表現決定的。因此,可以認為能力的一個玩家在TrueSkill的排名是在大量遊戲中的平均表現。個人表現的變化原則是能力表現的一個參數。
怎樣更新能力值
TrueSkill排名系統只會根據比賽結果更新μ和σ,它假設的情況為一個玩家的表現圍繞著他的能力水品進行變化,如果一個玩家玩一個基於點數的遊戲,他戰勝了所有的其他10個對手和他和戰勝了另外一場比賽只有一個對手的積分是一樣的,但是這樣兩場比賽確實反映了不同選手的能力情況。通常會使σ下降。在計算一場新的比賽結果之前,TrueSkill排名系統會計算比賽的排名與選手在比賽前的排名的變化情況。排名的變化最終影響了玩家技能的不確定性σ。這個參數可以被TrueSkill用來記錄玩家的技能的變化。並且σ永遠不可能為0。
下面這張表格來自微軟研究院,此表格給出了8個新手在參與一個8人遊戲後μ和σ的變化。
這裡有個很有意思的現象:注意第四名Darren和第五名Eve,他們的σ是最小的,換句話說系統認為他們能力的可能起伏是最小的。這是因為通過這場遊戲我們對他們瞭解得最多:他們贏了3/4個人,也輸給了4/3個人。而對於第一名Alice,我們只知道她贏了7個人。 如果想知道更詳細的定量分析可以先考慮最簡單的兩人遊戲情況
在上述的方程式中,唯一未知的就是選手的表現。另外還有就是遊戲的模式。係數β2代表的是所有玩家的平均方差。 v(.,.) 和w(.,.) 是兩個函數,比較複雜。ε是個與遊戲模式有關的參數。 簡而言之,你贏了 就增加,輸了 減小;但不論輸贏,都是在減小,所以有可能出現輸了漲分的情況。
怎樣進行選手匹配
勢均力敵的對手能帶來最精彩的比賽,所以當自動匹配對手時,系統會儘可能的為你安排可能與水平最為接近的玩家。TrueSkill評分系統採用了一個範圍為(0,1)的函數來描述兩個人是否勢均力敵:結果越接近0代表差距越大,越接近1代表水平越接近。 假設有兩個玩家A和B,他們的參數為(μA,σA) 和 (μB,σB),則函數對這兩個玩家的傳回值為
c的值由如下公式給出
如果兩人有較大幾率被匹配在一起,光是平均值接近還不行(e指數上那一項),還得方差也比較接近才行(d)。
怎樣建立能力熱門排行榜
TrueSkill假設玩家的水平可以用一個常態分佈來表示,而常態分佈可以用兩個參數:平均值和方差來完全描述。設Rank值為R,代表玩家水平的常態分佈的兩個參數平均值和方差分別為μ and σ,則系統對玩家的評分即Rank值為 R=μ-k*σ k值越大則系統的評分越保守。在Xbox Live上,系統為每個玩家賦予的初值是μ = 25 以及 σ = 25 / 3,k=3。所以玩家的起始Rank值為R=25-3*25/3=0。
代碼參考:
Python版:http://packages.python.org/trueskill/
C# 版:https://github.com/moserware/Skills
參考連結:
http://research.microsoft.com/en-us/projects/trueskill/default.aspx
http://research.microsoft.com/en-us/projects/trueskill/details.aspx
http://research.microsoft.com/en-us/projects/trueskill/calculators.aspx
http://research.microsoft.com/en-us/projects/trueskill/faq.aspx
http://www.moserware.com/2010/03/computing-your-skill.html
TrueSkill 原理及實現