|

楼主 |
发表于 2013-1-24 20:56:37
|
显示全部楼层
本帖最后由 eblis88 于 2013-1-25 11:06 编辑
上面有人说到战力不准的问题。就先说一下战力吧。
战斗力估计
假定一场战斗包含了若干因素S={S1,S2,S3.....Sn},譬如Atk, Hp, 站位, 技能 等。
那么,战力 P 就是S的函数 P = f(S)。
可以通过战斗模拟的方式来求得f的表达式。
对于一个特定玩家,战力Px。对方的战力为 Pe。引入战斗结果辅助标记M(Px,Pe)
M(Px,Pe) = 0 if Px <= Pe 且 失败
M(Px,Pe) = 0 if Px >= Pe 且 成功
M(Px,Pe) = 1 其他
假定已经收集了一组战斗,战斗结果标志 M = {M1, M2, ....}。对应的战力集合 P = {P1, P2,....}
那么,求得P的过程,就是如下的最优化过程
min_Px {sigma_i(Mi(Px,Pi)}
上述公式里, sigma_i表示以i为下标的求和 。
可用以下几个步骤来解决该最优化问题
1. 网格化
对于战斗因素S,取值范围是[Smin, Smax]。那么首先需要决定数据的离散程度。离散单位决定了数据复杂度。
可以用如下公式来估计数据量。假定在取值范围内取Sd个值 ,一共有n个战斗因素。
可以直观的看出,最大数据量 = Sd^n。
在实际经验中,由于要在一些数据突变点增加更多的数据参考,最大数据量大约是 Sd^2n
可以根据不同的情况,选择合适的Sd。
一般情况下,我选择 Sd = 5,最小离散单位 Sd = (Smax - Smin) / 5。
2. 战力建模及拟合
根据战斗的不同,战力模型也不同,但一个通用的模型是:
P = sigma_i ( ai*Si^2 + sigma_j ( bij*Si*Sj) ) + sigma_k ( ck*Sk) bij = bji
后半部分表示独立性战斗因素,前半部分表示相关性战斗因素。
推荐的拟合方法是 SVM,支撑向量基。
3. 解决奇异点
在拟合后,经常会有一些不连续的点。解决的方法有很多,譬如引入高阶,引入随机误差等等。推荐的方法是引入随机误差。
修正战斗力模型为 P = Pg + Pn
Pg是参数确定了的战斗力模型,Pn是服从(0, delta_p)的正态分布。
上述模型表明,之前的工作实际上只是给出了一个战斗力的期望。战斗多样性引起的大量不可控因素,将会体现在Pn中。
在解决奇异点的过程中,需要补充大量的数据,以计算delta_p的值。补充数据可取奇异点附近的1%~5%。譬如:
已方:Atk = 50, Hp = 200, Def = 450, Spd = 60
补充性对方数据:
Atk = 50 + 50*(-5% ~ 5%), Hp = 200 + 200 * ( -5% ~ 5%)......
4. 降维
在计算量很大的时候,降维是必须的。譬如将 HP转化成 有效HP(EHP)。乘法公式的EHP一般是 HP /( 1- 免伤1)/(1-免伤2)....
加法公式的EHP = HP + 防御折算1*被攻击次数 + 防御折算2*被攻击次数....
|
|