微分方程在遊戲經濟建模中的應用

穆穆與言的貓發表於2023-05-15
一個神秘且不可思議的事實是,我們的宇宙遵循的自然律最終總能用微積分的語言和微分方程的形式表達出來

——《微積分的力量》

遊戲數學建模的實際工作大約分為兩塊,一塊是依據系統規則投放戰鬥屬性與經濟產出的具體值,另一塊是設定成長或遊玩節奏,即玩家如何隨時間獲取這些戰鬥屬性與經濟產出。前者是個簡單問題,本文不關心,後者可以用微分方程建模。

比喻性的說,遊戲的整個資料如同我們做了一大塊蛋糕,蛋糕本身提供激勵與快感(戰鬥屬性與經濟產出的具體值、遊戲巧妙的玩法設計與劇情),同時我們會因玩家吃下蛋糕而給予獎勵(消耗掉經濟產出獲得戰鬥成長或外觀顏值)。我們不能讓蛋糕太快被吃完,因此需控制玩家在時間軸上如何吃這塊蛋糕,這次吃多少下次又吃多少(設定成長與遊玩節奏)。顯然這就是微分方程可以刻畫的:

dy=f(y,t)  dt

也就是說某時間點吃掉的蛋糕是這整塊蛋糕的一個變化值。我決定在之後使用蛋糕的比喻,這可以省下因為不統一而冗長的數值用語。此外,本文沿襲《遊戲數學建模工程手冊》裡的風格,儘可能使用工程數學的闡述方式,從而免去那些無謂的非專業爭論。

首先我們必須對遊戲系統做一些定性理解,然後試著用定量模型描述它們。玩家初始接觸遊戲並不能得到蛋糕被吃下給予的獎勵,即:

y^' (t=0)=0

y(t=0)=0

這稱微分方程的初始條件。對於戰鬥屬性,角色不可能初始為0,它屬於微分方程一個解的常數C>0。接著,遊戲內容在絕大多數情況下是有限的,比如角色最高階打最高階的怪,這個怪的掉落是恆定的,因此在每天的24小時裡擊殺怪物產生的掉落是一個恆定值;再如主線關卡只設計了20章節,玩的足夠久的玩家再怎麼打也只能每天重複獲得20章節的產出,於是:

y^' (t→∞)=M

換言之,遊玩時間足夠長,由於遊戲內容設計的有限性每日產出是一個常數M,這稱微分方程的邊界條件。我們需要一個微分方程模型,能夠容納這2個描述了遊戲系統規律的條件。我給出的模型是:

dy/dt=a⋅tanh⁡(⁡b⋅t)

微分方程在遊戲經濟建模中的應用

即假設蛋糕每天被吃的情況與雙曲正切函式成正比,雙曲正切有如下影像:

微分方程在遊戲經濟建模中的應用

其中a和b是待解引數,t為時間,t=0時為0,t趨於無窮大時=1,整個方程趨於引數a。這意味著a和b不是2個單純的引數而是具備了現實意義,引數a表示一個遊戲系統設計內容有限,b控制t的最終值表示該系統的損耗速率,b越大越快趨近於a,將更快到達該遊戲系統的有限內容。另一種建模方案是:

dy/dt=a⋅(1+e^(-b⋅t) )^(-α),   α>0

這是廣義logistic模型,一個恰當的α值在0點附近讓蛋糕每天被吃的情況是緩慢增加而非雙曲正切那樣近乎線性增加。這個微分方程無法用初等函式寫出解析解,擬合引數a、b、α需用差分法逼近導數值,計算時要在excel裡手寫龍格庫塔演算法,因此簡便起見先於雙曲正切模型下討論。

我們得到如下解析解:

y(t)=a/b⋅ln⁡[cosh(⁡b⋅t)] +C

微分方程在遊戲經濟建模中的應用

若計算的是角色的戰鬥屬性成長,則C等於角色初始屬性,對於本文討論的經濟建模而言不需要C,但是C如果有賦值,說明是一個開局就因付費或其他原因得到些許蛋糕的玩家,如WOW裡的傳家寶、老玩家邀請新玩家給予新玩家的獎勵。y、y的一階導和t我們是知道的,用以擬合出未知引數a與b,準確的說是我們去規劃玩家每天吃掉蛋糕的具體量。以下是一個實際例子:

微分方程在遊戲經濟建模中的應用

這個遊戲系統的規則是每波戰鬥有不同型別與數量的怪物,每個怪物被擊殺令角色獲得升級經驗、金幣或其他經濟道具,不同型別的怪物有著不同的經濟產出值。圖裡僅考察前20波,領導或我們是不可能細膩規劃這個角色的1級至28級具體在哪一波(如果這個系統要玩365天,角色有100級,這隻會累死)。因此實際工作中只能規劃關鍵節點,即圖裡的第1、2、10、15波期望的角色等級是多少。圖中第1列是面對第n波怪,即戰鬥尚未開始,前波戰鬥已結束,第3列是統計前一波被擊殺的怪物合起來的產出值,即y的一階導具體值,第4列是前n波被擊殺怪物合起來的產出值,即y的一個具體值。將該設定以{0, 0},{1, 17}…{4, 149},{19, 5265.3}的矩陣形式輸入給matlab、mathematica等數學軟體,擬合解析解表示式可求出a=0.83104,b=0.038109。現在,我們比對微分方程建模到底比其他方法有多好:

上圖左邊區域表示升到這個等級需要的經驗值,分別是微分方程、三次樣條插值和分段線性插值的估計結果,三次樣條插值是用分段三次多項式逼近蛋糕隨時間被吃掉的情況,分段線性插值是大多數數值策劃會很自然想到的方法。右邊區域使用殘差平方和衡量模型的好壞,具體計算是用3個模型得到的累積值與關鍵節點的累積值相減後平方。可以看到微分方程模型與我們想要的節奏規劃誤差最小,其次分段線性,最後是三次樣條。然而分段線性計算具體等級需要多少經驗的結果是極其詭異的,實際工作中還要對結果各種修修補補。從理論分析角度,分段線性插值是一個步長很大的尤拉數值積分,而尤拉法在數值解微分方程時是精度最差的,誤差隨步長擴大加劇,因此分段線性是一個很差的模型,三次樣條相對好些,可以看到圖中左邊區域與微分方程的每個結果接近程度較高。

注意引數a的值,前面的建模分析裡我們可以知道a應當擬合出恰好是這個遊戲系統在t趨於∞時的值才對,為什麼是一個小於1的數?原因在於我們的遊戲系統不管是戰鬥還是經濟數量級往往較大,可在前期時數量級又特別小,則b必須是一個特別小的值才可能和a相乘後得到數量級小的值,一個特別小的值對於計算機是不友好的,截斷誤差會不可避免的累積造成錯誤結果,這影響了計算穩定性,需將關鍵節點矩陣的值適度縮小再求擬合,使用時乘回縮小系數即可。

現在,讓我們仔細考察吃蛋糕的微分方程建模。注意看,我們的領導要求第4波能夠從3級升到5級,然而關卡策劃投放的怪物滿打滿算下來才提供44點角色經驗,怎麼可能分給4級和5級,卻仍比3級的25.5高呢?我們應該讓關卡策劃增減這個地方的怪物數量、型別嗎?顯然不合實際。我們應該去修改這個關卡的具體怪物給多少角色經驗、金幣和其他經濟道具嗎?同樣不合實際,因為那些怪物不是隻有本關才用到,在前面的波次、後面的一些波次可能有被用到。即只要某日的產出與前面幾日的產出“共享”一部分產出源頭,就意味著吃蛋糕的規劃細節,不管是誰來規劃,都暗含了主觀、一廂情願,這種一廂情願體現在與客觀的怪物數量、產出規則有矛盾。於是,我們使用的建模方法,其實質意義在於折中、妥協,用更合理的模型去儘可能接近吃蛋糕的規劃細節,真實的吃蛋糕規劃必然存在一些節點是“異常值”,規劃的節點越多“異常值”就越多,這也是為什麼密集規劃主要在前期,結果前期更容易出現不合理的原因。換言之,那些規劃節點不總是合乎邏輯、符合客觀的,不能隨便去強行往上靠,使誤差為0,使戰鬥與經濟完全服從這些規劃。微分方程的計算結果自動地、儘可能多地修正了這些異常,但又儘可能貼近實際想要的(殘差平方和最小),微分方程的建模思路讓我們更深刻認識了吃蛋糕的規劃與蛋糕本身之間的關係。

巴比倫派數值策劃:813299364


相關文章