一、问题提出
在某一款游戏中,有这么一种装备升级机制:装备以概率 p ( p ≥ 0.1 ) p(p\ge0.1) p(p≥0.1) 升级,升级需要消耗材料和金币两种东西,如果升级成功,则升级结束;如果升级失败,以 p 2 \frac{p}{2} 2p 的概率保留本次数值,但材料和金币全部消耗掉,需要继续通过加材料将概率提升到 p ≥ 0.1 p\ge0.1 p≥0.1,并消耗金币执行升级功能。其中材料与金币消耗量与概率 p p p 成线性关系,即提升 p p p 点概率需要消耗 p p p 单位的材料;执行概率为 p p p 的升级需要消耗 p p p 单位金币。
二、 理论建模
1. 模型建立
首先,分析该强化机制,下一个时刻的状态(是否强化)只取决于当前状态(当前是否强化成功),故该过程是一个马尔可夫模型,用
0
0
0 表示当前失败状态,
1
1
1 表示当前成功状态,
p
p
p 为强化成功概率,
q
=
1
−
p
q=1-p
q=1−p 为失败概率,可以获得该马尔可夫过程的状态转移矩阵为
P
i
j
(
m
)
=
0
1
0
1
[
q
p
0
1
]
P_{ij}(m) = \ \begin{matrix} \ \ {\begin{matrix} 0 & 1 \cr \end{matrix} }\\ \begin{matrix} 0 \\ 1 \\ \end{matrix} \left[ {\begin{matrix} q & p \\ 0 & 1 \\ \end{matrix} } \right] \\ \end{matrix}
Pij(m)= 0101[q0p1]
上述表示在
m
m
m 时刻从状态
i
i
i 到 状态
j
j
j 的一步转移概率矩阵,先假设后续每一次升级概率与当前升级概率相同,即
p
p
p 固定(
p
p
p 变化的情况可能性过多,不易分析),则该过程为一个齐次马尔可夫过程,有
P
i
j
(
m
)
=
P
i
j
P_{ij}(m)=P_{ij}
Pij(m)=Pij
即状态转移矩阵与时刻无关,那么我们就可以得到
n
n
n 步以后的转移概率矩阵,有
P
i
j
(
n
)
=
P
i
j
n
=
[
q
p
0
1
]
n
=
[
q
n
p
∑
i
=
1
n
q
n
−
1
0
1
]
=
[
q
n
p
1
−
q
n
1
−
q
0
1
]
=
[
q
n
1
−
q
n
0
1
]
P_{i j}^{(n)}=P_{i j}^{n}=\left[\begin{array}{ll} q & p \\ 0 & 1 \end{array}\right]^{n}=\left[\begin{array}{cc} q^{n} & p \sum\limits_{i=1}^{n} q^{n-1} \\ 0 & 1 \end{array}\right]=\left[\begin{array}{cc} q^{n} & p \frac{1-q^{n}}{1-q} \\ 0 & 1 \end{array}\right]=\left[\begin{array}{cc} q^{n} & 1-q^{n} \\ 0 & 1 \end{array}\right]
Pij(n)=Pijn=[q0p1]n=⎣⎡qn0pi=1∑nqn−11⎦⎤=[qn0p1−q1−qn1]=[qn01−qn1]
这样,我们的
n
n
n 步转移概率矩阵就算出来,从矩阵中可以看到,随着
n
n
n 的增大,累积的失败概率
q
n
q^n
qn 会越来越小,而累积成功概率
1
−
q
n
1-q^n
1−qn 会越来越大,最终趋于 1,即随着时间推移,我们的升级早晚会成功,但是否真的是这样呢?那我们就要看一下对于任意初始分布,该马尔可夫过程的平稳分布了,根据平稳分布的定义有
π
=
π
P
\pi=\pi P
π=πP
则对于上述一个二维状态转移矩阵有
{
[
π
1
π
2
]
=
[
π
1
π
2
]
[
q
p
0
1
]
π
1
+
π
2
=
1
\left\{\begin{array}{ll} {\left[\begin{array}{ll} \pi_{1} & \pi_{2} \end{array}\right]=\left[\begin{array}{ll} \pi_{1} & \pi_{2} \end{array}\right]\left[\begin{array}{ll} q & p \\ 0 & 1 \end{array}\right]} \\ \pi_{1}+\pi_{2}=1 \end{array}\right.
⎩⎨⎧[π1π2]=[π1π2][q0p1]π1+π2=1
联立上述方程组解得
π
1
=
0
,
π
2
=
1
\pi_1=0,\pi_2=1
π1=0,π2=1,即不管我初始概率为多少,只要我坚持一个概率
p
p
p 去强化不变,早晚都能成功。
但实际强化时,我们更关注的是如何选择强化概率来使得我们消耗的材料最少,所以很多人觉得有时候一直 10 % 10\% 10% 升级不成功,感觉 10 % 10\% 10% 强化就是坑,所以会果断采用 100 % 100\% 100% 去强化,虽然 100 % 100\% 100% 成功,但所消耗的材料是否一定是最少的呢?所以这就需要我们去计算一下在强化概率 p p p 下材料消耗的期望。因为强化概率 p p p 是个随机变量,而材料消耗 c c c 又与 p p p 相关,故采用期望是最合适不过的啦。
2. 材料消耗期望计算
由于上述状态转移的计算中,已经假设了该过程是一个齐次过程,即每次强化概率 p p p 不变,那么根据强化机制我们知道两个条件:
- 材料消耗与我们的强化概率是线性的,即每一次强化概率越大,我们消耗的材料就越多,且是线性相关。因此这边假设材料单次消耗与强化概率 p p p 是正比的,即 c = p c=p c=p,在强化概率为 1 时,消耗材料为 1;强化概率为 0.1 时,消耗材料为 0.1,这样的假设并不破坏强化机制的单调性;
- 若当前时刻强化失败,则概率会变成 p 2 \frac{p}{2} 2p,基于齐次性假设和线性相关性,我们还需要再消耗 c = p 2 c=\frac{p}{2} c=2p 的材料使得概率回到 p p p。这边忽略强化概率因为是离散值导致本次强化概率和上一次强化概率 p c u r − p p r e p_{cur}-p_{pre} pcur−ppre 所带来的误差,该误差非常小,可以忽略。
上述条件已知,那么我们计算在概率
p
p
p 下总的材料消耗
C
m
a
t
e
r
i
a
l
C_{material}
Cmaterial 的期望即可,由于初始材料消耗为
c
0
=
p
c_0=p
c0=p,后续单次材料消耗为
c
i
=
p
2
c_i=\frac{p}{2}
ci=2p,因此根据期望定义有:
C
m
a
t
e
r
i
a
l
=
E
p
(
C
)
=
c
0
+
∑
i
=
1
∞
c
i
P
01
(
i
)
=
p
+
∑
i
=
1
∞
p
2
q
i
=
p
2
+
∑
i
=
0
∞
p
2
q
i
=
p
2
+
p
2
lim
n
→
∞
(
1
−
q
n
1
−
q
)
=
p
2
+
1
2
\begin{aligned} C_{material}=E_{p}(C)& =c_0+\sum\limits_{i=1}^{\infty}{c_i{P_{01}^{(i)}}} =p+\sum\limits_{i=1}^{\infty}{\frac{p}{2}q^i}\\ &=\frac{p}{2}+\sum\limits_{i=0}^{\infty}{\frac{p}{2}q^i} =\frac{p}{2}+ \frac{p}{2}\mathop {\lim }\limits_{n \to \infty }\left(\frac{1-q^n}{1-q}\right)\\ &=\frac{p}{2}+\frac{1}{2}\end{aligned}
Cmaterial=Ep(C)=c0+i=1∑∞ciP01(i)=p+i=1∑∞2pqi=2p+i=0∑∞2pqi=2p+2pn→∞lim(1−q1−qn)=2p+21
这样我们总消耗材料的期望值就算出来了,通过结果可以发现,材料总消耗的期望值与概率线性相关,这就意味着,概率越大,总材料消耗的期望值越大,所以从理论推导来说,每次强化的概率 p p p 越低,总材料消耗越小。
3.金币消耗期望计算
由于金币消耗与材料消耗类似,都与概率线性相关,不同之处在于:强化失败时,需要消耗
c
i
=
p
2
c_i=\frac{p}{2}
ci=2p 的材料来提升概率到
p
p
p,而此时需要消耗的金币
c
c
c 则也是
p
p
p,因此金币总的消耗期望
C
m
o
n
e
y
C_{money}
Cmoney 为:
C
m
o
n
e
y
=
E
p
(
C
)
=
∑
i
=
0
∞
c
P
01
(
i
)
=
∑
i
=
0
∞
p
q
i
=
p
lim
n
→
∞
(
1
−
q
n
1
−
q
)
=
p
1
1
−
q
=
1
\begin{aligned} C_{money}=E_{p}(C)& =\sum\limits_{i=0}^{\infty}{c{P_{01}^{(i)}}} =\sum\limits_{i=0}^{\infty}{pq^i}\\ &=p\mathop {\lim }\limits_{n \to \infty }\left(\frac{1-q^n}{1-q}\right)\\ &=p\frac{1}{1-q}=1\end{aligned}
Cmoney=Ep(C)=i=0∑∞cP01(i)=i=0∑∞pqi=pn→∞lim(1−q1−qn)=p1−q1=1
通过计算,发现金币消耗与材料并不相同,金币消耗的期望并不随概率改变,即对于任意概率
p
p
p 强化,金币消耗等价于以
100
%
100\%
100% 概率强化时金币的消耗量。
但事实是否真的如此呢,那我们就做一个 Monte Carlo 实验来验证一下我们的结果吧。
三、Monte Carlo实验
对材料与金币消耗量分别进行 Monte Carlo 实验,实验次数设置为 200 k 200k 200k 次,这是个人编写的代码:
import random
import numpy as np
import matplotlib.pyplot as plt
iteration = 200000 # monte carlo实验次数
prob = np.arange(0.1, 1.0, 0.01)
cost_material = np.zeros(len(prob))
cost_money = np.zeros(len(prob))
for i in range(iteration):
for i, p in enumerate(prob):
cost_material[i] += p/2
while True:
cost_material[i] += p/2
cost_money[i] += p
if random.random() < p:
break
cost_material = [c/iteration for c in cost_material]
cost_money = [c/iteration for c in cost_money]
plt.plot(prob, cost_material, label='material')
plt.plot(prob, cost_money, label='money')
plt.legend()
plt.xlabel('probability', fontsize=14)
plt.ylabel('total consumption', fontsize=14)
plt.title('distribution of total material and money consumption with probablity', fontsize=14)
plt.show()
最终运行结果如下:
我们看一下材料消耗和基本消耗随概率的函数分布图:
我们惊讶的发现是实验结果与我们理论推导一致,在 10 % 10\% 10% 概率时材料消耗约为 0.55 0.55 0.55,且线性增加,同时金币消耗不随概率变化,始终为1,故上述模型建立成功,实验结果有效。
最终我们得出结论,强化概率越低(最低 10 % 10\% 10%),材料总消耗的期望越小,同时金币消耗与概率无关,所以 10 % 10\% 10% 概率强化理论上是最合适的,当然要是游戏商的概率生成算法不合常理,那我们也没办法了,哈哈哈。