隨想隨記2-常見屬性分配問題
簡單的問題
正式問題來之前,先來一個簡單的問題。
假設一個技能的傷害為a*(1+0.2b)*(2+0.5c).現(xiàn)在假設手里有30個技能點。那么我該如何分配技能點,才能讓技能傷害最大化。
這個問題首先可以明確是一個收益線性規(guī)劃問題。
第一種方式:拉格朗日乘數(shù)法。設參數(shù)為線性約束a+b+c=30。求解即可。不過使用這個方法有點舍近求遠。具體工作場景當中是可以用excel或者python等工具的,所以可以有更好的解決辦法。
第二種方式:均值不等式。比較顯然的解決辦法,三個因子相乘,且三個數(shù)都是正,經(jīng)過一定的運算變換,是可以整理成均值不等式方法的,把系數(shù)歸一化就可以。原式=a*(5+b)*(4+c)/10,然后只需要求a*(5+b)*(4+c)的最大值,且求解最大值點,就可以得到結(jié)果了,后面就不詳述了。
第三種方式:邊際遞減法。這里詳細介紹一下第三種方式。計算點三種類參數(shù)的每加點邊際收益,只要能夠使得,三種加點的邊際收益一致,那接下來就只需要再輪番加點每個屬性,就可以得到最優(yōu)解。

根據(jù)計算,當a,b,c,分別加點到11,6,7的時候,邊際收益相同。所以我們的加點策略只需要滿足。先把a,b,c加點到11,6,7.剩下再輪流加點就可以了。即,我們的30點數(shù),分配為13=11+2,8=6+2,9=7+2
第四種方式:excel自帶的規(guī)劃求解或者程序的暴力搜索。
excel自帶的規(guī)劃求解功能可以直接解決該問題:

輸入?yún)?shù)后,得到結(jié)果也與第三種方法的計算一致。
簡單的問題看完了,再來看一個復雜的問題。
復雜的問題
下圖,是我崩鐵中,希兒不穿任何遺物的練度情況和終結(jié)技技能倍率。


注:圖中希兒1210為白板攻擊力,無任何百分比攻擊詞條。
問題:假設一個攻擊力詞條為4.3%攻擊力加成,一個暴擊率詞條為3.2%,一個暴擊傷害詞條為6.4%。然后假設我的圣遺物一共可以獲得20/50/70個進攻詞條(包含攻雙暴)。如何分配詞條,能夠讓我的希兒大招打出最高輸出。
求解前提
在解決問題之前。要先確定一些“正確的廢話”
1.技能倍率和初始攻擊力和該問題的解答無關(guān)。因為輸出公式可以寫為:技能倍率*攻擊力基數(shù)*(1+攻擊力%)*(1+暴擊率*暴擊傷害)。很明顯,技能倍率和攻擊力基數(shù)是可以不考慮的,可以把這兩個因子拿出去。并且在考慮該問題的時候,并不需要關(guān)注額外攻擊力是固定詞條還是百分比詞條,只要關(guān)注”額外的/基本的“比值,換算出來的攻擊力百分比對應的詞條數(shù)量即可。
2.暴擊率*暴擊傷害一定是1:2最優(yōu),原因是,游戲中的暴擊率和暴擊傷害均是成雙倍投放的。因此:設暴擊率單詞條為單位1,暴擊傷害即為2.假設暴擊率和暴擊傷害共有z個詞條。z=x+y,x為暴擊率詞條數(shù)量,y為暴擊傷害詞條數(shù)量。那么暴擊率*暴擊傷害=2xy。能取到最大值,當且僅當x=y。即暴擊率和暴擊傷害等價詞條數(shù)量一致。即數(shù)值為1:2.
3.詞條數(shù)量更多的“最優(yōu)解”要大于詞條數(shù)量更少的“最優(yōu)解”。
另外:
這個問題用拉格朗日乘數(shù)法并沒有求出合適的解(已經(jīng)嘗試過了)
直接套用上文的方法三,也不可以。(一會兒會說到為什么不可以)
求解過程
第一步:設定暴擊乘區(qū)收益價值,方便計算。根據(jù)前提2.我們可以提前知道,暴擊和暴傷應該是同步提升的。所以設定一詞條”暴擊收益“為0.5詞條暴擊和0.5詞條暴傷。
第二步:依舊采用詞條的邊際收益概念,求解一下攻擊力和"暴擊收益”,每一個詞條的邊際收益。
(邊際收益=提升后/提升前-1,攻擊力邊際收益=(1+(n+1)*0.043)/(1+n*0.043),
暴擊收益邊際收益=(1+(n+1)*(0.5*0.032)*(n+1)*(0.5*0.064))/(1+n*(0.5*0.032)*n*(0.5*0.064))
得到如下規(guī)律

利用攻擊力和暴擊收益繪圖

橙色線條為攻擊力邊際收益,藍色線條為暴擊收益的邊際收益。(這也解釋了,為什么直接使用方法三是不奏效的,因為這兩個屬性,并不如同前面問題一樣,兩個屬性的邊際效益都保持全局邊際遞減,而是一個分段函數(shù))
根據(jù)讀表,交點大概是在橫坐標27-28處。我們可以大致按照28處理,28詞條的暴擊收益也就是對應暴擊率和暴擊傷害為(44.8%,89.6%)在這點之前,我們可以粗暴地看作攻擊力收益高于雙暴,這點之后,雙暴收益高于攻擊力。該點正是兩種狀態(tài)的切換點。
暫時將這部分結(jié)果保留,后面還會用到。
第三步:求解動態(tài)最優(yōu)解點。詞條總數(shù)不同的時候,最優(yōu)解點也不同,但無論詞條總數(shù)有多少,最優(yōu)解點(穩(wěn)態(tài)點)即使變化,也應該是具備一個性質(zhì)即:下一次詞條無論點在哪里,收益相同。所以根據(jù)這個結(jié)果,列方程。以暴擊率為錨點。設暴擊率為y,攻擊力為x
可以得到:x=(43+86y2-64y)/64y。根據(jù)該方程。帶入每詞條暴擊率提升,得到如下表格數(shù)據(jù)。

對表格數(shù)據(jù)進行繪圖:可以得到:

最優(yōu)解的暴擊收益拐點位于暴擊率,攻擊力(70.4%,90.04%)。
關(guān)于這個拐點,還可以從之前的暴擊收益的邊際效益圖里觀察到。?


暴擊收益值45.利用44計算即可。也就是暴擊率=22*3.2%=70.4%,暴擊傷害=140.8%。
即為上面得到的拐點,在該拐點前暴擊屬性稀釋逐漸減小,之后又慢慢增大,滿暴擊率以后再變成線性變化收益遞減(滿暴部分圖里未體現(xiàn)。)
第四步:重點局部點
上面那個圖中,有四個很重要的點。
第一個,狀態(tài)8:狀態(tài)8的暴擊收益等價于我的希兒目前初始狀態(tài)的暴擊收益。我的希兒的暴擊收益可以通過,計算SQRT(暴擊*爆傷/2)計算。最終可以得到,只看暴擊收益我的希兒目前位于狀態(tài)8
第二個,狀態(tài)14:即為攻擊力和暴擊收益的邊際收益切換點。理論上,最優(yōu)解只要不完全恰好等于該點,就會跳躍該點,所以該點也是一個理想點。不會發(fā)生的點。
第三個:狀態(tài)15:即為攻擊力和暴擊收益交替后的點,當詞條數(shù)量能夠滿足狀態(tài)15的暴擊收益最優(yōu)解點的時候,就會立刻跳過14狀態(tài),如果詞條數(shù)量不能滿足,則不會跳過14狀態(tài)(表現(xiàn)為一直堆攻擊力的收益總要大于雙暴)
第四個:狀態(tài)22:即為暴擊收益的拐點,該點是游戲里角色的長期理想點的起點。游戲內(nèi)的詞條配置策略,完全可以先追求到該點,然后同步提升暴擊和爆傷,然后暴擊滿了以后,只追求爆傷,爆傷過高的時候(幾乎不可能),再反過去追求攻擊。
第五個:狀態(tài)31:暴擊達到100%,暴擊收益逐步降低,后續(xù)暴擊收益曲線越發(fā)和攻擊授收益曲線逐漸貼合,直至相交。
第五步:結(jié)論
最優(yōu)解的變化會根據(jù),詞條約束數(shù)量,在上面的最優(yōu)解表格當中向其中一個結(jié)果靠近,其中最特殊的為狀態(tài)15和22。作為兩個變化點,詞條約束是否能夠達到15和22所要求的水平,哪怕只差一個,獲得最優(yōu)解的策略都是不同的。
第六步:帶入情況,得到結(jié)果。
把問題回到現(xiàn)實問題當中來。上面說的結(jié)論可能還是讓人有些云里霧里,那么帶入一下實際數(shù)據(jù),再詳細結(jié)算一下會清晰的多。上面已經(jīng)說過。我的希兒目前位于狀態(tài)8的水平。而看到屬性里面,攻擊力還遠遠沒有達到要求 。
那么問題描述的三種情況:
情況1:20個詞條:首先分析一下20個詞條能帶來的收益,如果全點攻擊力,可以讓攻擊力達到20*4.3%=86%。此時,即使把詞條全部分配給攻擊力,也無法達到狀態(tài)15的攻擊力要求。也就意味著,攻擊和暴擊收益的邊際效應,目前還是攻擊力作為主要。(即僅僅20個詞條,無法跳躍到攻擊力收益和暴擊收益切換的點。所以只堆攻擊即可)
所以當20個詞條的時候,20個詞條全點攻擊就可以了。
情況2:50個詞條:分析一下50個人詞條帶來的收益,如果全點攻擊力,可以獲得50*4.3%=215%。目前看來是遠遠超出了狀態(tài)15要求的104.47%。那么現(xiàn)在只把攻擊力給到104.47%,即24個攻擊詞條。剩余詞條數(shù)量為26個。然后基于原本就具有的屬性23%暴擊率和55.3%的暴擊傷害,即暴擊率原本具有23%/3.2%≈7個詞條。暴擊傷害約等于8-9個詞條。看作8個。我們把26個詞條分配14個給暴擊率12個給暴擊傷害。得到:暴擊率=67.8%。
其實算到這里,情況2,就可以暫時停手了。因為我們把24個詞條分配給攻擊,這一步,這個嘗試是錯誤的。暴擊率能夠被分配至67.8%即,50個詞條已經(jīng)具備可以讓狀態(tài)達到狀態(tài)22的可能性了。少分配一些攻擊力,轉(zhuǎn)而給暴擊率。就可以達到狀態(tài)22.接下來重新計算。
攻擊力=90.4%/4.3%≈21個詞條,此時暴擊收益還有29個待分配。此時分配給暴擊率15個,暴擊傷害14個。
可以得到暴擊率=23%+3.2%*15=71%,暴擊傷害=55.3%+6.4%*14=144.9%
最后的詞條分配為:(21,15,14)屬性值為(90.4%,71%,144.9%)
情況3:其實基于情況2的前提,繼續(xù)思考即可。依舊從最優(yōu)解集合入手,此時的詞條有70條。
由于已經(jīng)通過了拐點,暴擊收益和攻擊的邊際收益都在下降,此時有點類似“上一個簡單問題里的解法3”了,因為此時滿足了所有屬性都是同走向的變化。所以原則上來說,經(jīng)過拐點狀態(tài)22以后,依舊邊際收益遞減速度分配即可。當邊際收益遞減速度一致,輪番分配即可。
說回正題,對于情況3,可以向最優(yōu)解狀態(tài)31去靠近,這里就不詳述了,過程還是和上面大差不大,最終擬合的最優(yōu)結(jié)果為攻擊力分配24條,暴擊率分配24條,暴擊傷害分配22條。
求解驗證
下面寫了一段程序,用來暴力搜索最優(yōu)結(jié)果(excel的規(guī)劃求解也可以,但偶爾精度選的不準會出錯,所以就寫了一段程序來保證正確)。來驗證上面得到的每一組結(jié)果。
得到:詞條數(shù)為20:

詞條數(shù)為50:

詞條數(shù)為70:

列表中第一個元素為計算出的最大局部傷害。驗證得到,我們上面的結(jié)果均正確。
備注
這里可以基于這個程序,更直觀看一下上面說的“狀態(tài)跳躍”的情況。
計算一下,我的希兒想要達到狀態(tài)15,所需要的最少詞條為多少:首先攻擊力為約為24個詞條即103.2%最靠近狀態(tài)里的104.47%。暴擊率達到48%,至少需要48%-23%=25%/3.2%=8個詞條,暴擊傷害大約要7個詞條。共計24+8+7=39個詞條。也就是說如果達不到39個詞條,就無法跳躍狀態(tài)14,全堆攻擊收益最高。
驗證:
38詞條:

39詞條:

達成跳躍。
到這里,問題應該算是解決了。