豐富多樣的遊戲關卡內容挑戰,新穎且充滿熱血的激情玩法體驗享受其中; 宏大的遊戲戰鬥場景描繪,多種二次元萌娘將拿起手中的武器來征服世界;每日上線都將有著豐厚的獎勵領取,挑戰強力的BOSS會爆出更多史詩裝備。
今天也給遊戲玩家帶來一些福利,就是原神修改版,不僅如此,還有2020熱門手游top100最新礼包码本下載地址:包括:傳奇、仙俠、卡牌、回合等眾多類型的遊戲,上線註冊就送無限量遊戲資源,滿級vip,神器神寵免費領,遊戲排行榜的熱門遊戲任你挑選。
進入正文:剛好最近板上有不少人 PvP 關心攻擊屬性該如何取捨的問題,
在此分享一下我個人的研究心得。
本文將採用拉格朗日乘數的數學方法,
分析在不同配額 (即可分配的攻擊屬性點數) 下
攻擊力、暴擊率及暴擊機率的最佳分配比例,
並輔以 Python 程式驗證之。
另外,本文會解釋「邊際成長率」的概念,
(即「為什麼大佬們常常說攻擊力稀釋效應很嚴重?」)
並示範如何藉此分析在已有屬性下最佳的屬性選擇。
因為使用的方法牽涉到微積分的基本概念,
為了讓更多人可以瞭解數學公式背後的意義,
我會盡量用簡單的文字說明,(「盡量」)
對數學推導沒有興趣的巴友則可以直接下拉到懶人包跟結論,
對於高品質聖遺物數量較多且套裝完整的玩家,
本篇心得分享可能不那麼有用;(警語)
畢竟對於畢業級的主 C 而言,
最佳的點數分配方法就是:
1. 優勢屬性傷害加成優先出
2. 想辦法出到攻擊力 212.1%、暴擊率 70.7%、暴擊傷害 141.4%
3. 剩下的多餘點數平均分配
相對於簡單直觀的主 C,
副 C、輔助要先考慮元素充能效率、元素精通等等;
如何在配額已經被限縮的情況下,
還能盡量提高自身的傷害效益,
反而會是本文比較著重的面向。
開始前容我再最後碎碎念一句:
玩遊戲是要讓自己開心的,
如果你高興,
想出 100% 暴擊率、50% 暴擊傷害也可以,
沒有必要因為這樣就彼此惡言相向。
但如果你覺得出裝還可以更好,
想追求更高的傷害效益,
希望本篇文章可以成為一點幫助。
本米只是一條鹹魚,對遊戲理解尚淺,
數學推導、遊戲環境考慮不周的地方,
歡迎各方好手批評指教。
懶人包
(這已經是我想得到在不失真的條件下最清楚的表達方式了,
如果還是太難,敬請見諒。我盡力了_(:3」∠)_)
最簡單 (但不精確的) 版本:
優勢屬傷杯有就出。
攻擊力先出到超過基礎值的兩倍。(綠字略大於白字)
如果有辦法雙暴超過 (40%, 80%) 才疊雙暴,不然全出攻擊力。
優勢屬性傷害加成優先出,但是不建議超過 +200% - (1/優勢傷害占總傷害的比例)。
舉例而言,對純元素傷害輸出而言不建議超過 +100%,
對 6 比 4 的元素、物理混傷輸出而言不建議超過 +200% - 1/0.6 = +33.3%。
(但是一件屬傷杯就會超過,這個時候出一件就夠了。)
剩下三項數值 (攻擊力、暴擊率、暴擊傷害) 的最佳分配方法,有以下兩種方法判斷。
設總攻擊力百分比 ((白字 + 綠字)/白字) 為 x
總暴擊率為 y
總暴擊傷害為 z
並令配額函數 g(x, y, z) = x/3 + y/2 + z/4 = c
(計算的時候請不要計較加成的來源是什麼、基礎值是多少。角色面板寫多少就是多少。
如果白字、綠字分別是 600 跟 800,那麼你的 x 就是 (600 + 800)/600 = 2.33... ≒ 233.3%)
一、 以邊際成長法計算最後一件聖遺物應該補充什麼屬性
在核心武器、聖遺物已經決定好了的情況下,
計算以下三項數值:
Gx = 3 / x (出攻擊力的邊際成長率)
Gy = 2 z / (1 + y z) (出暴擊率的邊際成長率)
Gz = 4 y / (1 + y z) (出暴擊傷害的邊際成長率)
哪個高就出哪個屬性。
例如 x = 200%,y = 30%、z = 100%,最後一件理之冠可選擇攻擊力、暴擊率或暴擊傷害
計算得:
Gx = 3 / 2.0 ≒ 1.5
Gy = 2 × 1.0 / (1 + 0.3 × 1.0) ≒ 1.538
Gz = 4 × 0.3 / (1 + 0.3 × 1.0) ≒ 0.923
最後一件選擇暴率頭最佳。
※此法不適用於連續的屬性選擇 (亦即有兩或三種以上的武器、聖遺物屬性加成可供選擇);
如需做多次選擇,請參考第二項。
二、以拉格朗日乘數計算各配額下的最佳調配
1. 若無法在 y > 51.6%、z > 103.3% 的情況下達到 x > 222.7%
假設暴擊率小於暴擊傷害的一半
(1) 在 x 達到 1.5 × (1/z + y) 之前一律疊高攻擊力。
(2) 前項達標後,按 3 : 2 的比例疊高攻擊力及暴擊率。
若暴擊傷害未達暴擊率的兩倍
(1) 在 x 達到 0.75 × (1/y + z) 之前一律疊高攻擊力。
(2) 前項達標後,按 3 : 4 的比例疊高攻擊力及暴擊傷害。
當 y 與 z 的比例接近 1 : 2,按 1 : 2 的比例疊高暴擊率及暴擊傷害並接上第 2 點。
2. 若第 1 點的條件可以滿足
(1) 在 y 達到 70.7% (或 z 達到 141.4%) 之前,
按 1 : 2 的比例疊高暴擊率及暴擊傷害到 70.7%、141.4%;
此階段可以犧牲部分攻擊力換取暴擊屬性 (但仍不應小於 212.1%)。
(2) 若 (x, y, z) 達到 (212.1%, 70.7%, 141.4%),
則平均分配三項屬性 (雙暴一樣是 1 : 2) 到 (225%, 100%, 200%)。
3. 若 y 達到 100% 還有剩餘配額,按 3 : 4 的比例繼續疊攻擊力跟暴擊傷害。(雖然應該不可能...)
(最佳化的三項數值對於配額的函數圖。)
如果你按照上述的建議去搭配,
最後有兩或三套以上的出裝 (指武器加聖遺物組合) 可以選擇,
那麼接著計算輸出分數:
DS = 面板攻擊力 × (1 + 暴擊率 × 暴擊傷害)
哪一套高就選哪一套。
前言
遊戲裡的傷害類型有很多種,普通攻擊、物理傷害、元素戰技、元素反應...
各種傷害類型都有各自的傷害計算公式,
然而除了超載、感電、超導跟擴散反應外,
其餘所有的傷害類型都會受到攻擊力、暴擊率以及暴擊傷害的加成。
(就連鍋巴、奧茲都會暴擊)
也因此如何將這三項數值做最有效的分配,
就成了傷害能否最佳化的重要議題。
對於這些傷害類型,可以寫出一般化的傷害公式:
傷害期望值 = [基礎攻擊力 × (1 + 百分比攻擊力) + 固定攻擊力]
× (1 + 暴擊率×暴擊傷害) × 傷害倍率
× [有的沒有的普攻傷害加成、屬性傷害加成、元素精通加成、技能增傷...]
若將基礎攻擊力跟傷害倍率提出來,用數學式表達為:
f(x, y, z, wi) = x (1 + y z) (1 + w1) (1 + w2) ...
其中 x 為 總攻擊力百分比 ((白字 + 綠字)/白字)
y 為總暴擊率
z 為總暴擊傷害
wi 為各種加成係數
若再簡化只取攻擊力、暴擊率以及暴擊傷害的項,我們定義傷害期望值函數 f:
f(x, y, z) = x (1 + y z)
這就是我們希望最大化的數值。
然而角色能夠分配到攻擊屬性的配額有限,
也沒有辦法完美控制聖遺物副詞條的數值,
故我們應該考慮在「限制條件」下最大化傷害函數的方法。
聖遺物主屬性所提供的攻擊力、暴擊率、暴擊傷害數值
是 3 : 2 : 4 (同樣的星數、強化等級下),
副詞條雖然變數較大,但也大致上依循這個比例。
假如你選了 45% 的攻擊頭、就會犧牲 30% 的暴擊率;
你得到了 20% 的暴擊傷害,就要失去 15% 的攻擊力。
(沒有辦法我全都要.jpg)
這就是邁向更高的傷害期望值時需要做的取捨。
我們可以定義配額函數 g:
g(x, y, z) = x/3 + y/2 + z/4 = c
在相同的聖遺物品質、數量之下,
你所能運用的配額 c 就是大致相等的。
另外,總攻擊力百分比不會低於 100% (即攻擊力不會低於基礎攻擊力),
暴擊率不會低於 5%,暴擊傷害不會低於 50%,
(如果你核心裝備有相關屬性的話下限值就會更高)
是參數組 (x, y, z) 的先決條件。
對於最佳化問題,微分為零求極值是最常見的方法,
而在限制條件下的版本就是拉格朗日乘數。
本文接下來就會從邊際收益的概念出發
解釋拉格朗日乘數的核心精神,
並以此計算出在各種限制條件之下傷害期望值的最佳解。
還有一種稱為 Karush-Kuhn-Tucker 條件的方法,
專門處理等式、不等式限制條件混和的最佳化問題,
但是此法通常沒有解析解,
就算有我也不會解_(:3」∠)_,
而且往往難以從結果瞭解它的數學意義,
所以本文會用它的一般版拉格朗日乘數,
搭配額外加入的不等式條件來作解析。
數學方法
首先我們來談談何謂「邊際收益」。
在經濟學的領域中,
邊際收益代表著在既定的生產組合之下,
每多生產 (銷售) 一單位的產品,所能得到的收益量。
當生產的產品越來越多,
所能收穫的利益就會越來越少,
同時所要付出的成本也會越來越高,
稱為「邊際收益遞減」與「邊際成本遞增」。
當邊際成本開始超過邊際收益,
繼續生產 (銷售) 產品的淨利反而會減少,
這時候的總銷售利潤就是最大值。
套到傷害計算公式上面來說,
每多分配一點配額到某個屬性上,
(如:3% 的攻擊力、2% 的暴擊率、4%的暴擊傷害或任意組合)
傷害期望值函數一樣會有對應的提升,
就是傷害期望值的邊際收益。
我們將 f(x, y, z) 對參數組 (x, y, z) 做全微分,可得:
df = (∂f/∂x) dx + (∂f/∂y) dy + (∂f/∂z) dz = fx dx + fy dy + fz dz
且因 1 點配額可以換得 3 點的攻擊力,或 2 點的暴擊率,或 4 點的暴擊傷害,
故我們可以得到疊三種屬性的邊際收益為:
Mx = df/dc (y, z 不變) = 3 fx = 3 (1 + y z) (出攻擊力的邊際收益)
My = df/dc (x, z 不變) = 2 fy = 2 x z (出暴擊率的邊際收益)
Mz = df/dc (x, y 不變) = 4 fz = 4 x y (出暴擊傷害的邊際收益)
舉例試算,假設 x = 200%、y = 5%、z = 50%:
Mx = 3 × (1 + 0.05 × 0.5) = 3.075
My = 2 × 2.0 × 0.5 = 2.0
Mz = 4 × 2.0 × 0.05 = 0.4
而當攻擊力來到 300%,其他兩項不變:
Mx = 3 × (1 + 0.05 × 0.5) = 3.075
My = 2 × 3.0 × 0.5 = 3.0
Mz = 4 × 3.0 × 0.05 = 0.6
我們可以看到,當我們只疊攻擊力,邊際收益並不會因此下降,
但是出其他屬性的邊際收益會漸漸超過出攻擊力的邊際收益,
此時出其他屬性的效益就會比只出攻擊力還要好。
至於大佬們常說的「攻擊力稀釋」又是怎麼回事?
如果我們把邊際收益除以傷害期望值函數,我們可以得到邊際成長率:
Gx = 3 / x (出攻擊力的邊際成長率)
Gy = 2 z / (1 + y z) (出暴擊率的邊際成長率)
Gz = 4 y / (1 + y z) (出暴擊傷害的邊際成長率)
這個數字代表著每多分配一點配額,
傷害期望值會成長為原本的多少比例。
當 x = 200%,Gx = 1.5;
當 x = 300%,Gx = 1.0。
從這裡我們就可以看出,在單一數值較低的時候,
同樣的點數可以帶來較大的比例成長,
但越往上疊,成長率就越低,
這個時候出其他數值的成長效果就會越好,
這就是「屬性稀釋效應」。
照著同樣的邏輯,不只是攻擊力,
任何屬性的成長率都會隨著該屬性的單調增加而減少;
(包括屬性傷害加成、普攻傷害加成、增傷效果...)
這也是為什麼大佬們都會建議你平均分配屬性的原因。
從這裡我們也可以看出為什麼建議暴擊率跟暴擊傷害要是 1 : 2。
如果參數組 (x, y, z) 是一個最佳組合,
那麼我們應該要得到 Gx = Gy = Gz。
(否則就會有出其中一種屬性優於另外兩種的狀況,
代表還沒有達成最佳解)
解 2 z / (1 + y z) = 4 y / (1 + y z)
得 z = 2 y
用白話文說就是,
雖然 y = z 是 y z 的最佳解,
但是 y 比 z 貴一倍,
所以 z = 2 y 才是在該問題限制條件下的最佳解。
在實務上,只要根據你當下的參數,
計算出各屬性的邊際成長率 G,
就可以找出當下最佳該出的屬性是什麼。
這就是懶人包裡提到的「邊際成長法」。
但是請注意,如果你有很多個武器效果、聖遺物可供選擇,
邊際成長法並不能保證連續選擇下的結果會是最佳的結果;
(也就是說,每一次根據邊際成長率來做的最佳選擇合在一起並不一定是最佳的)
如果要處理這種情況,就要參考接下來要介紹的拉格朗日乘數。
拉格朗日乘數告訴我們,
如果我想知道目標函數 f(x) 的最大值,
但是參數組 x 必須滿足某種限制條件 g(x) = 0,
(g(x) = c 的形式也可以,令 h(x) = g(x) - c = 0 就好,
不影響結果,以下不再贅述。)
那麼我可以創造一個新的拉格朗日函數 L:
L(x, λ) = f(x) - λ g(x)
這個新函數的極大值問題就會包含原函數的極大值問題;
換句話說就是設 L 對參數組 x 跟 λ 微分為零求極值。
「微分為零求極值」是我們在學習微積分時一定會碰到的例題,
基本的精神就是「如果一個函數的值在某點附近不再增減,
那麼該函數在該點有極大值或極小值」。
(更嚴格來說,該點還必須不是「反曲點」)
但是如果我的參數本身受到某種限制,該怎麼處理?
拉格朗日乘數的精神就是:
「如果一個函數在符合限制條件下的某一點附近不再增減,
那麼該函數在該點有極大值或極小值」。
這相當於我要求在 g(x, y, z) = 0 的條件下
df = (∂f/∂x) dx + (∂f/∂y) dy + (∂f/∂z) dz = 0
在 c 不變的限制條件下,
dg = (∂g/∂x) dx + (∂g/∂y) dy + (∂g/∂z) dz = dc = 0
顯然 fx : fy : fz = gx : gy : gz 是一個解,
( df = fx dx + fy dy + fz dz = λ gx dx + λ gy dy + λ gz dz
= λ (gx dx + gy dy + gz dz) = λ dc = 0 )
故我們得到:
(∂f/∂x) - λ (∂g/∂x) = 0
(∂f/∂y) - λ (∂g/∂y) = 0
(∂f/∂z) - λ (∂g/∂z) = 0
等價於:
∂L/∂x = (∂f/∂x) - λ (∂g/∂x) = 0
∂L/∂y = (∂f/∂y) - λ (∂g/∂y) = 0
∂L/∂z = (∂f/∂z) - λ (∂g/∂z) = 0
∂L/∂λ = g = 0
這就是拉格朗日乘數最簡單直觀的證明。
套用到我們關注的問題,
我們得到最佳化 (x, y, z) 的條件是
fx : fy : fz = 1/3 : 1/2 : 1/4
但這相當於
3 fx = 2 fy = 4 fz
也就是
Mx = My = Mz 或是 Gx = Gy = Gz
這可以與邊際成長法中求最佳解的條件互相印證。
然而在我們關注的問題中,
還有 x ≧ 100%、5% ≦ y ≦ 100%、z ≧ 50% 的不等式條件存在,
除了微分為零的地方,目標函數的極大值也可能發生在邊界上,
拉格朗日乘數無法處理這樣的問題。
所幸,邊界上的最大值問題一樣可以用拉格朗日乘數解決,
邊界有幾個就解幾次拉格朗日乘數,
最後再把所有發生極大值的地方放在一起比較,
得到所有極大值之中的最大值。
這並不是一個簡單的工程,
也有一些難以準確分析的區域,
但是借助程式的方法,
我們可以得到近乎準確的結論。
以下開始展示應用拉格朗日乘數的詳細分析。
數據分析
我們想要求目標函數 f(x, y, z) 在限制條件 g(x, y, z) = c 下的最大值。
這個問題的拉格朗日函數為:
L(x, y, z, λ) = x (1 + y z) - λ (x/3 + y/2 + z/4 - c)
接下來我們微分求極值:
∂L/∂x = (1 + y z) - λ/3 = 0
∂L/∂y = x z - λ/2 = 0
∂L/∂z = x y - λ/4 = 0
∂L/∂λ = -(x/3 + y/2 + z/4 - c) = 0 (這條就是限制條件 g(x, y, z) = 0,最後再處理它。)
經過消去法,我們可以得到 f(x, y, z) 達到極值時的條件:
x = 3 (1/y + 2 y) / 4
y = y
z = 2 y
套回 g(x, y, z) = c 可得:
y = c/3 ± √(4 c^2 - 6)/6
(x, z 用 y 的結果帶入)
可以得到在 √1.5 ≦ c < 1.75 及 √1.5 ≦ c < 1.375 兩個區間
分別有兩個內部解 (x, y, z)。
從這個結果來看,
不管你原本攻擊力、暴擊率或暴擊傷害是多少,加成效果來自哪裡,
只要你最後的暴擊率跟暴擊傷害是 1 比 2,
且百分比攻擊力跟暴擊率的關係如上所述,
你的傷害就會是極大化。
另外,由配額函數 g 計算出的配額 c 也一樣,
其絕對的數值在實務上並不重要,
只有當你想比較同角色拿不同武器,
或是不同角色之間最佳化屬性分配的差異時,
才需要特別去詳細計算。
然而這個推導有兩個缺陷;
其一為實際上我們無法隨心所欲調配各數值的比例,
其二為原問題的最大值可能發生在參數組的邊界上。
(另外,聖遺物副詞條數值加成的比例也未必總是 3 : 2 : 4。)
因此我們可以對每個可能的邊界做一次拉格朗日乘數,
然後分析在各配額下最佳化的參數組應該符合什麼關係式。
我們先考慮 x ≧ 100%、5% ≦ y ≦ 100%、z ≧ 50% 的邊界,
這個時候需要比較的邊界解就多達 9 種,
(還要加上剛剛用拉格朗日乘數算出來的兩個內部解)
不過不用擔心,本米已經幫大家整理好了,
以下以 Python 語言 matplotlib 模組包下的 pyplot 函數繪圖呈現。
(內部解與各邊界解在各配額下的比較關係。)
我們可以將此函數圖劃分成三個區域:
1. (0.15 + 1/3) ≦ c < 1.175,粉色函數勝出,
為 y = 5%、z = 50%,只疊攻擊力的邊界解 (x, 0.05, 0.5)。
2. 1.175 ≦ c < 1.25864,綠色函數勝出,
為 z = 50%,按 3 : 2 的比例疊攻擊力與暴擊率的邊界解 (3(1 + 0.5y), y, 0.5)。
3. 1.25864 ≦ c < 1.75,黑色函數勝出,
為上述拉格朗日乘數得到的內部最佳解 (3(1/y + 2 y)/4, y, 2 y)。
4. c > 1.75,看起來像綠色的黃色函數勝出,
為暴擊率已達 100%,按 3 : 4 的比例疊攻擊力與暴擊傷害的邊界解 (3(1 + z)/4, 1.0, z)。
什麼?你說看不到黑色函數比綠色函數低?
(大哥他沒有輸)
我們再放大一點看。
(配額在 1.2 到 1.3 之間粉、綠、黑三個邊界解的比較關係。)
進一步,我們可以繪製出最佳化參數組 (x, y, z) 對配額的關係圖,
並在各區段分析最佳的屬性分配:
(最佳化的三項數值對於配額的函數圖。)
1. 在攻擊力達到 307.5% 之前,只疊攻擊力會是最佳解。
2. 續第 1 項,在 307.5% ≦ x < 320.0% 這個區間,應按 3 : 2 的比例疊高攻擊力及暴擊率。
3. 續第 2 項,當 (x, y, z) 超過 (320.0%, 13.4%, 50%),
最佳解會瞬間跳到從 (222.7%, 51.6%, 103.3%) 開始的內部解。
這個時候我們會想按 1 : 2 的比例疊高暴擊率及暴擊傷害。
但同時我們也觀察到在 (x, y, z) 到達 (212.1%, 70.7%, 141.4%) 之前,
最佳化的攻擊力是往下掉的,
意思是不必強求攻擊力,甚至可以犧牲部分攻擊力來換取雙暴屬性。
4. 當 (x, y, z) 超過 (212.1%, 70.7%, 141.4%),
最佳化的攻擊力會慢慢增加,
此時應保持暴擊率與暴擊傷害 1 : 2 繼續疊高,
並適度分配點數到攻擊力直到 (225%, 100%, 200%)。
5. 這個區段暴擊率已經到達 100%,無法再提升了,
接下來按 3 : 4 的比例疊高攻擊力與暴擊傷害會是最佳解。
(我很好奇這是不是可能達到的領域?)
為驗證本最佳化分析的可信度,
我們使用 Python 語言 Scipy 模組包下的 SLSQP 方法,
計算出各配額下的最佳解,並同樣做圖。