我在去年賽季裡不斷量化《鬥陣特攻》數據的過程中,研發出了 Elo 系統來長時間追蹤各個聯賽隊伍的表現情況。不幸的是,系統實裝之後雖然能做出精美的圖表,但卻因為做得不夠精準而有缺陷。但我們不要拘泥於過去,一起來看看在我改良過後重生的系統:《鬥陣特攻》職業電競聯賽 Elo 2.0 吧。OLE 2.0 修正了過往所有的錯誤,並結合了 FiveThirtyEight 的 NBA EloNFL Elo 系統打造而成,再經過特殊改良來適應《鬥陣特攻》職業電競聯賽的環境。

Elo 是零和模型:在對戰結束之後,勝方所獲得的 Elo 分數會等同於敗方所失去的 Elo 分數。雙方增減的 Elo 量在整個 Elo 系統中都是由波動常數 K 以及按照雙方 Elo 分數差距所定之預期勝率計算而得:

Elo 增減量 = K(1-預期勝率)

FiveThirtyEight 的 Elo 系統加入了額外幾個簡單的計算過程來提升準確度。首先是他們的年度結轉(CT)功能,讓上個賽季中部份的 Elo 分數得以結轉至往後的賽季中。在傳統體育賽事中,這種做法可以在隊伍陣容經歷了休賽期期間的各種變化之後,協助調整系統判讀各隊伍強度的方式。

在 OLE 2.0 中,我測試了許多 K 與 CT 的組合,並選了一組可以最佳化布賴爾評分法、賽局預測以及對戰結果的組合。我選的 K 值是 47,而 CT 值則是 60%。在每一次新改版之後就會結轉 60% 的分數,而不是等到新的賽季才結轉,因為在聯賽裡除了選手陣容的變化以外我們還得考量遊戲本身玩法的不同。舉例來說,Vancouver Titans 在第一階段裡最終的 Elo 分數是 1183.6,也就是說他們在第二階段一開始的分數是(1183.6 * 0.6)+(1001 * 0.4) = 1110.6。

FiveThirtyEight 也把新進隊伍列入了考量,新進隊伍會獲得一個低於平均的初始 Elo 分數。聯賽今年剛加入了八支新隊伍,所以我也跟進了這種做法。在 OLE 2.0 裡,新進隊伍的起始 Elo 是 990 分──平均是 1000 分──以反映出他們剛來聯賽時隊伍強度的相對不確定性。這會使得系統平均數降低,但我也改良了 FiveThirtyEight 所採用的方法來使系統平均數趨於穩定:在每次更新改版後把各隊的 Elo 重置到比平均稍微高一點的地方(1001,詳見上方 CT 的計算過程)。

最後,我還把 FiveThirtyEight 系統中的勝利乘數邊際(MoV)改良到適合 OLE 2.0 使用。MoV 的目的在於獎勵那些華麗地輾壓對手的隊伍,因為比起以 5 比 4 成績坐收的賽局,1 比 0 更顯現得出雙方隊伍之間的實力差距。

OLE 2.0 採用雙層 MoV 乘數,用的是一段時間裡雙方打贏團戰次數的差距以及雙方死亡數的差距。贏得賽局的隊伍不見得有打贏比較多場團戰(平手的情況頗為常見),所以當打贏團戰的次數分不出高下時,雙方死亡數的差距就會派上用場。

MoV 的設定方式一定要能夠降低自相關函數──自相關函數發生在預期會贏的隊伍真的以相當大的比數差距獲勝時。預期會贏的隊伍之所以被預期會贏是有原因的,未經調整的 MoV 長時間下來容易過度膨脹獲勝隊伍的 Elo 分數。FiveThirtyEight 的系統透過在比分差距相同的情況下給不被看好的隊伍更大乘數的方式,來在計算 MoV 的過程中把自相關函數的問題給處理掉。在我的系統裡,每一局的比分差距(SD)大約介於 0.3 到 5 之間。這些勝利邊際會經由下列公式計算(從 FiveThirtyEight 的 NFL MoV 計算方式改良而來):

log(1 + SD)* 1/(elo 差 * 0.001 + 1)

在 OLE 2.0 裡,2.5 的比分差會給 Elo 100 的弱旅大約 1.4 的 MoV,換作是 Elo 100 的勁旅的話則是 1.15。現在 OLE 2.0 的特點都已經介紹完了,是時候來看看今年各隊伍的表現如何了:

第一階段中充滿著機會:八支新進隊伍帶著 990 的 Elo 分數來到了聯賽,恰恰適合從高分隊伍那邊把 Elo 分數偷過來。然而,只有一支新進隊伍的最終分數遠高於 990:Vancouver。Titans 一路打通第一階段決賽冠軍之路的故事眾所皆知,但如果在決賽裡遇上 NYXL 可能就不是這麼個回事了──偏偏 Seoul Dynasty 跑來攪局。注意看 NYXL 的 Elo 分數是如何一夕暴跌,而 Seoul 的分數又是如何瞬間衝高的:

Excelsior 在階段決賽輸給 Dynasty 看起來就像這個樣子。在雙方交手前,隨便一個觀眾和專家都認為 Dynasty 肯定會早早就被淘汰。這麼多人都預測錯了,但錯得有多離譜呢?

OLE 2.0 問世之後為分析這件事開啟了一道新的大門:預測。如果我有兩隊的 Elo 分數、大量以往對戰結果的資料以及一個可以拿來更新 Elo 分數的系統,我就可以用過去來預測未來。為了做到這件事,我採用了蒙地卡羅模擬法。*

* 原始的蒙地卡羅法非常有趣,它跟第一台電子數值積分計算機和曼哈頓計劃有關。如果你時間尚有餘裕,我建議你去瞭解一下

蒙地卡羅模擬法是被用來測量隨機輸入值在系統中所可能產生的個別輸出值的一種方法。假設你有一對六個面的骰子,而你想知道擲骰之後兩個骰子數字加總為 7 的可能性。你可以透過數學找到算得出答案的解法,你也可以真的擲骰子擲 10,000 次,然後統計數字加總為 7 的情況出現的次數。蒙地卡羅模擬法正是後者。

我的蒙地卡羅模擬器使用 OLE 2.0 的架構,並按照 Elo 分數差、賽局平手機率和勝利邊際來進行像上述那樣擲骰的過程:

  1. 從 OLE 2.0 系統中的兩個初始 Elo 分數出發。
  2. 進行模擬賽局:依據 Elo 分數差隨機決定哪方贏得賽局,隨機取樣已知的勝利邊際,並把平手的狀況也列入考量(如果地圖類型有可能發生平手局面的話)。
  3. 根據賽局結果更新 OLE 2.0 系統中雙方隊伍的 Elo 分數。
  4. 重複進行上述第 2 點及第 3 點,直到有一方贏得對戰(共進行 4 局,如果在第 4 局打成平手則總共會有 5 局 。)
  5. 將比賽結果保存為輸出值
  6. 重複第 1 點到第 5 點 10,000 次

重複進行此項模擬一萬次之後,我不只知道了各支隊伍贏得對戰的次數,我還能知道每場對戰結果是幾比幾的機率。我用這個方法替上週的對戰做了測試,結果好到不像話:預測會贏的隊伍在 16 場對戰中真的贏得了 13 場,而勝率 50.5% 的 Boston 則是以 2 比 3 的些微差距輸給了 Hangzhou。這個方法甚至還預測到了 Valiant 在與 Atlanta 的對戰中會拿下賽季第一勝這件事!不過也有預測失準的時候,勝率 60% 的 Chengdu 和勝率 56% 的 Toronto 分別輸給了 Shanghai 和 Philadelphia Fusion。

這項模型真正的準確度應該沒有像上週一樣那麼地樂觀。我進一步拿這個方法測試了去年賽季第四階段的比賽,發現那對 OLE 2.0 來說是波動幅度最大的一場階段賽事:碧姬問世、NYXL 開始失勢、Dallas Fuel 谷底反彈進入階段決賽,還有很多其他難以預期的結果。即便波動如此之大,這項模型還是準確地預測出了 60 場對戰當中 40 場的贏家。

回到當初之所以延伸到這個話題的問題:Seoul 在第一階段決賽中打敗 New York 這件事究竟有多出乎意料呢?在交手前,Seoul 的 Elo 分數為 1015.2,而 NYXL 的分數則是 1183.6,這在當時是聯賽最高。把這些數值拿來模擬(賽局進行方式依照決賽賽制有了調整)之後會出現這樣的結果:

NYXL 不光是有 81.86% 的勝率,在這其中有 40.73% 的部分還是以 3 比 0 橫掃 Dynasty。Dynasty 最後以 3 比 1 勝出的此一結果在模擬過程中發生的機率只有 6.82%。

NYXL 在決賽中表現不如預期這事跌破眾人眼鏡,不過這並沒有關係。如果預測對戰的演算法可以百分百正確的預測每場對戰結果,那麼何必還要真的進行對戰呢?

現在既然有了這個新玩具,我們就順道來看看第三週的狀況,並玩個名為「你有比模擬器聰明嗎?」的遊戲吧。下面是下週的三場精彩對戰,之所以精采有諸多原因。來看看演算法的計算結果和你的個人預測有什麼不同吧。

第一場對戰:Vancouver Titans(1132.9)對上Dallas Fuel(1054.5)

之所以精彩的原因:Dallas 在第二階段中首次面臨巨大挑戰。

模擬結果:

第二場對戰:Los Angeles Valiant(939.7)對上Washington Justice(903.7)

之所以精彩的原因:雙方都在搶奪今年賽季裡的第二勝。

模擬結果:

第三場對戰:Hangzhou Spark(998.3)對上Guangzhou Charge(882.3)

之所以精彩的原因:Guangzhou 避免創下賽局連敗數新紀錄的最後機會。

模擬結果:

Ben "CaptainPlanet" Trautman 是《鬥陣特攻》職業電競聯賽全球轉播的數據負責人。到推特上追蹤他吧!