※ 本文轉寄自 ptt.cc, 文章原始頁面
看板PokemonGO
標題

Re: [討論] 對戰聯盟第一賽季積分討論

時間
最新2020-05-23 02:10:00
留言101則留言,58人參與討論
推噓67 ( 67034 )
讀到原 PO 的計算, 讓我一鼓作氣把堆積許久遲遲未分析的 PVP 紀錄拿出來研究了 XD 以下我想先花點篇幅,用盡可能淺顯的方式解釋一下 Elo 計分系統的原理, 然後用我自己的對戰紀錄推估 pokemon go 天梯採用的參數。 看到數學會感到不適的人可以跳過前半篇。 ------------------------------------------------ 【Elo 計分簡介】 Elo 系統是一套在一對一競賽中,評估玩家實力的數學公式 每次實戰後,雙方的積分會因比賽結果而調整, 贏的上升,輸的扣分,但調分額度並不固定。 Elo 的思維是: 強者打敗弱者並不稀奇,因此高分玩家獲勝時,雙方都只調整少量分數。 反之,當低分玩家打贏高分玩家時,作為獎勵/懲罰, 前者的分數會大幅上升,而後者會大幅下降。 同理,雙方平手時,原先高分者降分,原低分者反之,因為前者本被期待獲勝。 那麼,這套原則要怎麼量化落實呢? 設想現在有兩名玩家 A、B,他們的賽前積分是 a 與 b。 Elo 把評分過程切成三個步驟。 第一步:用 a 與 b 的差值,估計兩人勝負的機率。 第二步:實戰。 第三步:依據實戰結果,調整兩人的積分,變為 a' 與 b'。 其中最複雜的是第一步。 下面我會詳細解釋。 ------------------------------------------------ 【賽前估計勝負機率】 如上所述,A、B 兩人的賽前積分是 a 與 b。 我們可以定義 10^(a-b) 為「A 打贏 B 的『不意外度』」。 什麼意思? 如果 A 比 B 強,那麼 a-b > 0, 也就是說 A 若獲勝那也不令人意外,所以「不意外度」就大於 1。 如果 A 比 B 強非常多,那麼「不意外度」就遠遠大於 1。 反之,如果 A 比 B 弱,那麼「不意外度」就在 0~1 之間 A 越弱,他要獲勝的「不意外度」就越接近零。 意思是如果他贏,那真是太令人意外了。 如果 A、B 兩人實力相仿,即 a=b, 則兩人獲勝誰都不奇怪,「不意外度」就等於 1。 為什麼要這樣定? 首先,這符合經驗。 強弱雙方的實力差距變為兩倍時, 弱者要打贏的機會並不是變成二分之一,而是更加艱難。 其次,它符合數學上的「遞移律」。 倘若有三個玩家 A、B、C,無論實力排序為何, 我們都可以發現「A 打贏 C 的不意外度」等於 「A 打贏 B 的不意外度」乘以「B 打贏 C 的不意外度」 這是基於指數函數的基本特性, 大家中學數學都學過,檢查一下即可知道這個特性確實存在。 同樣基於指數函數的基本特性, 「A 打贏 B 的不意外度」與「B 打贏 A 的不意外度」 兩者互為倒數,也就是相乘為 1。 這讓上述定義對 A、B 具有對稱性。 總之,這個定義在數學上蠻好的,該有的性質都有。 「不意外度」是一個從零到無限大之間的數字,而機率必然是個 0~1 之間的數字。 所以「不意外度」本身並不是機率, 幸好,它可以直接推算出 A、B 雙方獲勝的賽前預估機率: A 獲勝的機率 = (A勝的不意外度) / (A勝的不意外度+B勝的不意外度) B 獲勝的機率 = (B勝的不意外度) / (A勝的不意外度+B勝的不意外度) 我們把前面關於不意外度定義的式子放進來,就得到 A 獲勝的機率 = 10^(a-b) / ( 10^(a-b) + 10^(b-a) ) B 獲勝的機率 = 10^(b-a) / ( 10^(a-b) + 10^(b-a) ) 整理一下,得到 A 獲勝的機率 = 10^(2*(a-b)) / ( 1 + 10^(2*(a-b)) ) B 獲勝的機率 = 10^(2*(b-a)) / ( 1 + 10^(2*(b-a)) ) 其中數字 a 表示玩家 A 的實力(或賽前積分),數字 b 表示玩家 B 的積分。 如果我們把「A 的獲勝機率」對「實力差距 a-b」畫成圖,大概就長這樣: https://imgur.com/w0w14dU
Re: [討論] 對戰聯盟第一賽季積分討論
可以觀察到幾個現象: 一、這個圖形是旋轉對稱的,所以對玩家沒有偏袒 二、當雙方實力相同時(a=b),勝負機率各半(縱座標=0.5) 三、實力懸殊到一定程度時,強者幾乎確定獲勝 比方說 a-b=0.5 時,A 贏的機率就是 10/11 ,已經突破九成 這種形狀的函數長得像個左右拉長的字母 S, 所以俗稱 "S-shaped function"。 看到這詞大家就可以知道數學家取名字的創意大概到什麼程度。 在機率的課題中,S-shaped function 十分常見 有好幾種函數可以產生類似形狀 而 Elo 積分制度採用的這種「指數除以『指數加 1』」 正式的名稱叫做 "hyperbolic-tangent",通常寫作 tanh() 如果你有學過比高中數學再多一點的數學課,對這個函數應該不會太陌生。 好了,不管怎樣,我們現在可以掌握 A、B 兩人的賽前預估勝率了。 再寫一次: A 獲勝的機率 = 10^(2*(a-b)) / ( 1 + 10^(2*(a-b)) ) B 獲勝的機率 = 10^(2*(b-a)) / ( 1 + 10^(2*(b-a)) ) 廣義來說,其實我們未必要用 10 當指數的底。 你也可以用 2,或者用自然對數的底 e=2.7182818...., 或其他大於 1 的數字。隨你高興。 通常為了方便,我們希望競賽積分是整數,而且最好成千上萬, 這樣看起來才爽。畢竟大家都喜歡幻想自己很富有。 所以 a - b 動輒就是幾十幾百。 那為了讓指數函數不要爆炸大, 我們可以把上面的 10^(2*(a-b)) 通通修改成 10^( (a-b)/s ) 其中 s 是一個幾十幾百的數字,它定義了積分的跨幅, 讓 (a-b)/s 落在零點多的範圍裡,不要動輒跳到上百。 或著可以用這句話概括: 「積分相差不大於 s 的兩名玩家,可以說他們實力差不多」 好了,不管怎樣,我們現在「真的」可以掌握 A、B 兩人的賽前預估勝率了。 再寫一次: A 獲勝的機率 = 10^((a-b)/s) / ( 1 + 10^((a-b)/s) ) B 獲勝的機率 = 10^((b-a)/s) / ( 1 + 10^((b-a)/s) ) ------------------------------------------------ 【賽後調整積分】 前面說過,Elo 把評分過程切成三個步驟。 第一步:用 a 與 b 的差值,估計兩人勝負的機率。 第二步:實戰。 第三步:依據實戰結果,調整兩人的積分,變為 a' 與 b'。 我剛才用很長的篇幅完成了第一步。 第二步沒什麼好說的,就是對戰。 而對戰的結果,搭配上第一步的估算,現在要拿來第三步使用:積分調整。 以玩家 A 的視角來說吧。 比賽後,他的積分會從 a 調整為 a'。 如果 A 獲勝了,那麼 a' = a + k * ( 1 - 賽前估算A獲勝機率 ) 如果 A 打輸了,那麼 a' = a + k * ( 0 - 賽前估算A獲勝機率 ) 如果 A、B 雙方平手,那麼 a' = a + k * ( 0.5 - 賽前估算A獲勝機率 ) 避免囉哩八唆,把三行合併成一行: a' = a + k * ( A的輸贏結果 - 賽前估算A獲勝機率 ) 可以看得出來,這套調分規則確實符合 Elo 希冀的原則: 如果你打贏比自己強的對手(a<b,即,賽前估算A獲勝機率 < 0.5) 那你應該加很多分。 如果你打贏比自己強的對手(a>b,即,賽前估算A獲勝機率 > 0.5) 那沒什麼,你本來就應該贏,所以你只會增加一點點分數。 此外,式子裡面有個參數 k,它代表調分的幅度。 如果 k 很大,玩家的積分就會隨著賽事歷程而顯著改動。 反之如果 k 很小,那麼爬分(或失分)就會很緩慢,或者說分數分布很穩定。 k 越大,這套評分系統就越刺激。 ------------------------------------------------ 一套 Elo 系統可以完全由三個參數描述:s, k,以及起始分數。 讀到這邊你應該可以注意到,我們剛才所有的運算都只跟 a-b 有關, 並不涉及 a 或 b 本身絕對的大小。 如果把所有玩家的積分同時提高 2000 分(或其他數字), 絲毫不影響評分的運作。 通常系統會給所有玩家一個很大的的起始分數, 目的是避免那些一直輸一直輸一直輸的玩家掉到負分, 因為掉到負分會讓玩家傷心挫折, 傷心挫折的玩家就會退坑, 太多人退坑遊戲公司就會減少營收。 畢竟就是因為現實世界令人傷心挫折我們才沈迷遊戲 如果遊戲也令人傷心那我們去玩其他比較溫馨的遊戲就好了。 總之讓人掉到負分,就營運上來講是絕對要避免的。 但就數學上來講,起始分數就只是個可有可無的平移常數而已。 那麼,pokemon go 天梯採用的 s 和 k 是多少? 這就是我後面要用實戰紀錄來回答的問題。 ------------------------------------------------ 【我的實戰紀錄】 我在第一賽季總共打了 277 輪,合計 1402 場。 1402 除以 277 稍微超過 5,因為技不如人,有時候連輸五場, 在 lose until you win 政策下要再打幾場才算完成一輪的關係。 下圖是我的積分歷史。 https://imgur.com/Xva9BSe
Re: [討論] 對戰聯盟第一賽季積分討論
橫坐標是累計對戰場數,縱座標是積分(出水前不計) 我打了 89 輪(445 場)後登上 Rank 9,此後大部分時間都在 25XX 分浮沉掙扎 不過,我們要研究的不是積分本身,而是前後兩輪間的積分差。 把前後兩輪的積分相減,再刪去升上 R7 積分出水之前的資料後, 把「積分差」的分佈畫成直方圖: https://imgur.com/eJklK5k
Re: [討論] 對戰聯盟第一賽季積分討論
非常明顯地,這兩百多組「積分差」依照勝負場次數匯聚成六個叢集, 外加兩筆孤單的資料點——那是因為遇上了「雙方同時陣亡」的平手結果。 在每輪對戰結束、領獎勵的時候,平手跟打輸都一樣領不到。 但計算積分的時候,可以發現平手和打輸是有在區分的。 (參見上面關於 Elo 如何調分的算式) 複習一下 Elo 賽制調整積分的算式: a' = a + k * ( A的輸贏結果 - 賽前估算A獲勝機率 ) 理論上來說,叢集中軸與隔壁叢集中軸的間距,應該就等於 k, 從圖上看起來,k 大約在 18 左右。 但是用肉眼觀察實在不是很有說服力。 有沒有更可靠、更權威的驗證方式呢? 有。就是把「調分的理論值」與「調分的實際紀錄」畫成 X-Y 散布圖。 比方說吧,我在第 147 輪結束後,積分變為 2615。 在第 148 輪的第一場,我遇到積分 2578 的對手,我輸了。 在第 148 輪的第二場,我遇到積分 2609 的對手,我贏了。 在第 148 輪的第三場,我遇到積分 2625 的對手,我贏了。 在第 148 輪的第四場,我遇到積分 2626 的對手,我贏了。 在第 148 輪的第五場,我遇到積分 2630 的對手,我贏了。 在第 148 輪結束後,因為四勝一敗,我的積分上升為 2642。 實際調分 = 2642 - 2615 = 27 我可以去計算 a=2615, b=2578 等等的應調分數, 把這五個數字加起來,這就是「調分的理論值」。 當然,s 與 k 的數值是姑且先胡亂猜的。 怎麼樣才算猜得準呢? 就是要弄出一組(s,k)讓理論值接近 27,也就是實際值。 而且不只對這個數字準,對其於兩百多組都要準。 我可以把兩百多組數字畫在座標平面上,變成兩百多個點。 橫坐標(x)是「假定一組 s, k 之下的調分理論值」 縱坐標(y)是「調分實際值」 透過更改 s 與 k,我希望這些點全部乖乖躺在 y=x 的斜直線上。 我選了參數相近的九組(s = 300, 400, 500)x (k = 16, 18, 20) 作圖如下: https://imgur.com/QjpywXL
Re: [討論] 對戰聯盟第一賽季積分討論
稍微比較一下即可看出: 片面改變 s 時,這些點會以「叢集」為單位水平移動 s=300 太靠近,s=500 拉太遠,s=400 剛剛好 片面改變 k 時,這些點會在叢集內部小範圍水平移動,排成一列列短斜虛線 k=16 斜虛線太平緩,k=20 斜虛線太傾斜,k=18 剛剛好 把 s=400,k=18 那張放大: https://imgur.com/yz4Eqsu
Re: [討論] 對戰聯盟第一賽季積分討論
看起來沒有什麼系統性的誤差。 雖然有若干點稍微偏離 x=y 線,但大多只差 1,最多差到 2,平均偏離 0.6318。 我猜這些誤差是取整數的過程造成的。 因為積分會設計成整數,實質計算過程中有有很多不同的作法: 採用四捨五入?無條件捨去?無條件進位?絕對值四捨五入? 絕對值無條件捨去?絕對值無條件進位?五場結果加起來再取整數? 先個別取完五場整數再加起來? 我有點懶得一一嘗試上述做法了,反正抓到 s 跟 k 的參數就好,就沒再細細探究。 事實上 s=400,k=18 應該是最理想的整數結果了。 k=18.2 稍微比 k=18 更 fit 一點點,但 N 社應該不會用這種奇怪的參數。 所以我想,天梯用的 Elo 規則應該就這兩句話了: 面對積分比你低 x 的對手時, 你的預估獲勝機率 = 10^(x/400) / ( 1 + 10^(x/400) ) 打完一輪後,你的分數調整額度等於 18 * ( 勝場數 + 0.5*平手場數 - 該輪每場「預估獲勝機率」的總和 ) ------------------------------------------------ 【補充】 我考慮過 N 社可能有兩種調分政策: 一、每打完一場就調整積分,但打完一整輪才顯示給玩家看 或 二、每打完一場先把調整額度賒起來,打完一整輪才實施 實際算出來的結果是(二)的可能性高得多。 檢驗過程蠻無聊的,這邊就不放細節了。 此外,我也做了 season 0 的分析。 當時要走很多路才能打 PVP,所以樣本不是很多 不過以分析來說足夠了。 當時的 s=600,而 k=9 只有 season 1 的一半 所以當時要靠致勝努力爬分是很沒效率的 而且配對系統在 2/16~2/17 時做了一次大調整。 在那之前你很容易配到跟你積分差距 150 分以上的對手 總之,從 season 0 到 season 1, Niantic 對 PVP 的規則終究是有點改善啦。 不過,我私心很希望 N 社取消 lose until you win 政策 這讓我整理資料的時候多了很多麻煩。 還有在那之前,拜託,先把連線 bug 和三盾 bug 修好,可以嗎。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 101.12.63.114 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/PokemonGO/M.1589936144.A.E5A.html

101 則留言

success0409, 1F
可是嗯射並沒有給玩家夠高的積分去扣吧 出水分數始

success0409, 2F
終是個謎

q510724, 3F

q510724, 4F
不過 是battle until you win吧
是的,正確名稱是叫 battle until you win。 我稱作 lose until you win 有點戲謔的意思, 因為一直打輸還不能乾脆了斷,感覺很恥辱......

eveway, 5F
只能推

yendindin, 6F
跪著推

Barolo, 7F
其實是sigmoidal S-shaped是後來演化出來的叫法

Barolo, 8F
因此無關創意 單純就是好懂 多數人一看就知道什麼型罷了
啊對,你說的沒錯,正式名稱是 sigmoidal curve......

j022015, 9F
果然第一步是存在的 那表示要幹掉比自己高分的人才會升的

j022015, 10F
多 長遠看還要重質重量 這樣設計實在很吃運氣

s111100001, 11F
你寫的好清楚XD 把我後來才想到忘記寫的東西也寫進去

s111100001, 12F
了哈哈

reswantur, 13F
跟Sliphroad推估的數值相同,初始分數設定公式未明。

dakkk, 14F
還以為來到數學板

aling1205, 15F
這不推不行,雖然我看不懂數學

Davidgood, 16F
推推

chrisboy, 17F
文組先推再說QQ

KeMBaWallKer, 18F

Davidgood, 19F
假設5場對手都跟你同分,5連勝就加45分,平均多贏一場

Davidgood, 20F
就加9分,跟我觀察自己的結果一樣

Davidgood, 21F
更簡化的說法就是贏一場加9分,輸一場扣9分(因為N社會

Davidgood, 22F
盡量幫玩家配同分的對手)

R0918, 23F
超認真的!我都迷迷糊糊的玩orz

StarofAqr, 24F
好文,有數據驗證

eon4, 25F
靠北,跪惹

aaronfish, 26F
數學系的啊

mimchu, 27F

iwanttosleep, 28F
我懷疑你是數學系的XD
真的不是啦

eveway, 29F
等等 A獲勝的機率應該是10^(a-b)/(10^(a-b)+10^(b-a))吧?

eveway, 30F
照你不意外度定義的話XD
呃,對,我跳了一步通分,結果指數的部分漏寫了。 獲勝機率應該是 10^(a-b) / ( 10^(a-b) + 10^(b-a) ) 整理之後變成 10^(2*(a-b)) / ( 1 + 10^(2*(a-b)) ) 之後再用任意參數 s 把那個 2 吸收掉 感謝提醒,趕快來修改內文 XD

JustWinslow, 31F
https://i.imgur.com/iRcFYJM.jpg 挺合理的 如果遇
Re: [討論] 對戰聯盟第一賽季積分討論

JustWinslow, 32F
到五場都是低你100分的 你贏三場也會被扣4分 XD

JustWinslow, 33F
爬分技巧:逆風場遇到積分高你很多的 順風場遇到積分

JustWinslow, 34F
高你很多的 這樣說起來都是遇到越高分越好 也難怪要

JustWinslow, 35F
跨Rank 很難 因為常常配到同級但積分比你低 系統認

JustWinslow, 36F
為你贏是理所當然

wjack, 37F
配對時系統會考慮屬性相剋嗎?
照理說不應該考慮玩家陣容,否則就不是公平的配對系統。 雖然大家都時常感覺被系統坑、被配到剋星 但可能糟糕的記憶本來就比快樂的記憶深刻吧 否則自己逆風,對手同時就順風,沒道理所有人都運氣不好。

eveway, 38F
感覺從不意外度推到勝利機率中間有點微妙XD

earnformoney, 39F
快推 不然別人會發現我們看不懂!!

j73596, 96F
你看不懂不代表N社覺得這很複雜 不要用自己的程度看世界

alan810310, 97F
感覺有可能是每打完一場就調積分,因為我第一季最後一

alan810310, 98F
輪只打四場,2勝2敗,季末結算時積分還增加了3分

alan810310, 99F
雖然也沒法證實就是了

aaronfish, 100F
積分算法應該要把打的場次當加權,讓打約多場的人,加

aaronfish, 101F
分比重更高,減分變低,否則大家根本不想多打

qoopichu, 102F
真的,那個41場上R10根本撕髮不公

WDXuan2000, 103F
推數學

faradayslaw 作者的近期文章

[討論] 十公里蛋是否可視為社群日預備軍?
在前篇文章 [閒聊] 10月社群日疑似是搬運小將? #1b3jgXkg (PokemonGO) https://www.ptt.cc/bbs/PokemonGO/M.1695472289.A.BAA.html 下方的推文裡,見到了這樣的對話
更多 faradayslaw 作者的文章...