王者荣耀-数模论文分享(虽然结果我自己都不信)

2023-05-16

基于基础数据的王者荣耀英雄强度评估及英雄设计

摘要

王者荣耀是当下很火爆的一款手机游戏,如何基于当下的双方阵容选择合适的英雄来获得胜利,是一个值得探讨的问题,现基于游戏数据对于各个英雄的强度进行建模评估,并进行英雄的设计。

针对问题一,我们首先利用Python的爬虫技术抓取了官网上英雄的攻击伤害,技能效果,上手难度,皮肤数量,视频总人气等数据,接着搜索到了一位玩家对于所有英雄的基础数据面板的Excel数据,从两个部分分别分析,主要利用线性模型,最后再组合成一个超越函数的形式进行综合建模。我们对得出的公式是否符合实际情况进行了相关的考究,对于难以直接求极值的超越函数,采用了模拟退火算法进行逼近。紧接着,在对英雄进行级别分类的问题上,我们从攻击伤害和生存能力两个角度进行评判和分析。

 针对问题二,我们引入了英雄的理论最大强度和实际强度的概念,因为一个英雄的胜率高并不能直接说明该英雄的理论最大强度高,在人为发挥水平的影响下,用实际强度的公式去进行衡量更为合适。我们将人群的水平看做高斯分布,采取幂函数的形式,融入英雄的上手难度作为变量来进行建模。最后,以人群的水平作为积分变量进行积分,从而得出一个相对合理的英雄实际强度。我们认为考虑胜率,应该以英雄实际强度为主要角度。最后我们将英雄的群体实际强度和英雄皮肤数量以及英雄的理论最大强度等作为输入参数,胜率作为输出参数,构建BP神经网络,根据结果调整输入的参数种类以及神经元的层数和数量,以求得到更好的模型。

       针对问题三,我们主要是根据问题一和问题二给出的模型,以及其他英雄作为参考,力求设计出一个新颖,可玩度高,但是平衡的英雄。最后我们将用前面的模型进行相关数据的验证。

关键词: 爬虫,模拟退火算法,线性模型,超越函数,幂函数,高斯分布,真切变换,神经网络拟合

 

 

1.问题重述

《王者荣耀》是一款由腾讯游戏开发并运营的移动端MOBA游戏,核心玩法以多人实时竞技为主,玩家直接可以进行1v1、3v3、5v5等多种模式的PVP对战。

问题一:游戏已经推出了几十位英雄,定期也会推出新的英雄,英雄定位可分为法师、战士、坦克、刺客、射手、辅助,不同的英雄拥有不同的属性和技能。请建立数学模型,对各个英雄的“强度”进行定义,根据“强度”把现有英雄分为几个等级。

问题二:英雄的“强度”直接反映为其胜率。但实际上,每个英雄的出场率和胜率除了与属性、技能等的数值有关系外,还与英雄的操作难度,外观受欢迎程度等许多因素有关。试建立数学模型,计算胜率、出场率与各个因素之间的关系。

问题三:根据问题一和问题二的结论,试设计一个新英雄,使其“强度”与现有英雄的平均值相近,并阐述你所设计的英雄在同类英雄中的特点,以演算结果佐证。角度不限(例如:控制能力、小规模团战能力、大规模团战能力、爆发输出能力等等)。

提示:

    一 .数据采集:可从《王者荣耀》内获取所需要的数据,在英雄的属性界面、技能界面都可查看详细的数值,或是从官网(pvp.qq.com)这类官方渠道获取。

    二 .演算工具不限,例如excel、matlab等等,只要能帮助你计算的工具皆可。

2.问题分析

2.1 问题一的分析

   一个英雄的强度不仅与面板的数据有关,也与技能的伤害和效果有关,应该分别从两方面出发进行建模,最后综合考虑。在玩家实力极高和反应力极高的假设下,我们才讨论英雄的理论最大强度,它是由英雄的技能效果,伤害数值,防御数值决定的。但是一个英雄的实际强度不仅与英雄本身的数值有关,还与玩家的操作水平,队友英雄的辅助效果,队友的操作水平有关。我通过搜索资料得到了所有英雄的基础数据,又通过爬虫技术在官网上获得了官方所给出的所有英雄的生存能力,攻击伤害,技能效果,上手难度的相对值,以这些数据为基础进行建模。

2.2 问题二的分析

   我们认为,模型一计算得到的结果仅仅是英雄的理论最大强度,而我们知道,一个英雄在游戏时发挥出来的实际强度其实与玩家的水平存在着紧密联系,而胜率其实并不是英雄的理论最大强度的单独反映,而是英雄强度与玩家群体的综合水平相结合的整体反映,理应重新设计变量进行分析,所以我们引入个人实际强度和群体实际强度。

我们将英雄的群体实际强度和英雄皮肤数量以及英雄的理论最大强度等作为输入参数,胜率作为输出参数,构建BP神经网络,根据结果调整输入的参数种类以及神经元的层数和数量,通过循环的方式,不断初始化权值和阈值,以求得到在验证集上不错的预测效果。

2.3 问题三的分析

本题是一个开放性很强的题目,我们根据模型一和模型二,秉着新颖,可玩度高,平衡的原则,设计了一个英雄,通过前面两题所得出的模型得出他的强度,并预测胜率。

 

3.模型假设

  1. 在同样的经济条件下,装备对于不同英雄的强度增益是一样的;
  2. 花同样的金钱买防御系的装备和攻击系的装备,对同一个英雄来说,在防御角度和攻击角度造成的增益是一样的。
  3. 在未知队友水平的情况下,统一取队友的水平为玩家平均水平;
  4. 玩家群体的水平看成近似的正态分布;
  5. 本文的研究对象为截止至2017年10月所出的67位英雄;
  6. 讨论英雄的理论最大强度时,玩家的水平为最大值;
  7. 每个英雄都配备适合的符文,并且适合的符文对于所有英雄的强度增益是一样的。
  8. 在所有条件均相同的情况下,物理英雄和法术英雄造成伤害的能力是一样的。

 

4.符号说明

符号表示

符号说明

Pm

英雄的理论最大强度

Prq

英雄的群体实际强度

Pr

英雄的个人实际强度

Si

个人水平

D’

官方给出的上手难度(范围0-1

H’

官方给出的生存能力(范围0-1

G’

官方给出的攻击伤害(范围0-1

J’

官方给出的技能效果(范围0-1

Pf

归一化后的英雄皮肤数量

Sp

官网上的视频总人气

Fw

英雄的攻击范围(布尔值,远程为1,进程为0

H’’

基础数据给出的生存能力

G’’

基础数据给出的攻击伤害

H

综合生存能力

G

综合攻击伤害

Sl

胜率

Sl’

预测的胜率

 

 

由于后期用到的公式和参数较多,其他特定的字母和符号会在具体的模型中再做说明。

5.模型的建立与求解

5.1 问题一的模型建立与求解

5.1.1 数据获取

   建模我们的英雄基础数据来自于论坛,一位玩家将67位英雄的所有基础数据整理成Excel表格发至网上,附件中有相关文件。

此外,我用python编写了一个爬虫程序从王者荣耀官网上抓取了85位英雄的生存能力,攻击伤害,技能效果,上手难度,皮肤数量,视频总人气,相关程序在附件中。其中视频总人气为官网发布的所有视频的播放量之和。

 

图1官网数据截图

 

图2官网皮肤数量截图

图3官网视频人气数据截图

5.1.2数据清洗

   首先,鉴于两个数据的时间点不一样,我们将研究英雄的对象统一为67位。

其次,如图3所示,同一个英雄的视频攻略中,存在相同的情况,于是在程序中将对视频数据进行审查,凡是播放量完全一样的视频,不再重复计算。当然,内容不同,播放量相同的视频也存在,但在观看人数达到十万级以上的情况下,可能性极小,故不作考虑。

第三,在审查数据时发现,英雄牛魔和夏侯惇的视频数据为空,经查证官网没有给出攻略视频,于是取所有英雄的视频人气的平均值2087.4万作为插值补空。

第四,每个英雄的初始数值是不一样的,同时成长数值也是不一样的,仅仅用基础数值反映显然是不合理的。因此我们画出数值随等级变化的函数后,用下式来反映:

其中k为成长数值,b为1级时的基础数值。用该种方法处理的数据有基础数据的生命数值,物攻数值,物防数值,法防数值。

最后,为了克服各个数据之间量纲以及范围的差异,我们对所有数据进行对应的归一化处理。下文所说的生命数值,物攻数值,物防数值,法防数值都是经过积分处理和归一化处理后的数值。

归一化公式如下:

https://images2015.cnblogs.com/blog/323808/201603/323808-20160307152657304-486322487.png

图4归一化公式

归一化后,所有数据均处在0-1范围内。

5.1.3攻击伤害分析

首先,我们对基础数据的攻击伤害进行分析。我们认为攻击伤害来源于物攻,法强,移速和攻击范围。但注意到所有英雄初始法强为0,基础数据中的技能效果在此不作考虑。

基础数据的攻击伤害计算公式为:

G’’=a1w+a2y+a3f

其中a1,a2,a3分别为物攻,移速,和攻击范围的权重,且满足:

a1+a2+a3=1

w,y,f分别为归一化后的物攻,移速和攻击范围。

根据经验,攻击伤害以物攻法强为主,移速和攻击范围为辅。因此可以先大致估计:a1=5/11, a2=3/11, a3=3/11

紧接着,由于官方数据给出的攻击伤害已知,综合攻击伤害可以通过下面的式子得到:

G= a4 G’’+a5 G’

其中a4,a5分别为G’’ 与G’的权重

根据经验可以知道,英雄基础面板数据对于英雄强度的贡献往往很小,事实上游戏发展一段时间后,由于装备的存在,基础面板数据对于英雄强度的影响往往越来越小,,而官方所给的相对数据也更加具有说服力,因此根据二八定律,取:

a4=0.2,a5=0.8

至此,我们得到了英雄的综合攻击伤害。

5.1.4 生存能力分析

与攻击伤害同理,可以得到英雄的综合生存能力。我们认为英雄的生存能力与物防,法防,生命,移动速度有关。值得注意的是,每一个英雄的法术防御都是一样的,均为169,因此在归一化时,统一取0.4。基础数据的生存能力计算公式为:

H’’=a6wf+a7Ff+a8Sf+a9y

其中wf+为物理防御,Ff为法术防御,Sf 为生命值。a6 a7 a8 a9分别为对应的权重。我们知道,对生存能力贡献最大的因素是生命值,其次是物防,然后是法防,法防之所以排在第三是因为所有英雄的法防数值一样,并不能体现太多差别,所以放低权重,最后是移速,移速越高有利于逃脱,但是贡献程度很有限。由经验可暂定a6=0.25,a7=0.15,a8=0.5,a9=0.1。

同样由二八定理可以得:

H= 0.2H’’+0.8 H’

5.1.5 强度定义

   一个英雄光有输出,但是生存能力太弱是显然不行的,没有输出的机会,而一个英雄生存能力很强,但是对敌方造成不了威胁,也如同鸡肋,因此这两者是相互制约的。伤害和生存能力应放在同等地位考虑。同时我们注意到,官方给出的攻击伤害是大程度反映普攻伤害的数值,因此我们有必要考虑技能效果,而经过参阅英雄的技能,我们可以得知技能效果是对技能伤害,技能减益效果,技能增益效果的综合反映,因此我们应将技能效果与攻击伤害放在同等地位考虑,共同组成为英雄造成的伤害。于是得出以下式子:

下面来证实该模型的建立是合理的。

 

根据第二条假设,花同样的金钱买防御系的装备和攻击系的装备,对同个英雄来说,在防御角度和攻击角度造成的增益是一样的。因此不妨令[(1+J’)(1+G)]=x, (1+H)=y,并且所拥有的金钱是一定值,由假设可知对于两方面的增益之和也是一定值,考虑到x,y均大于1,不妨设该定值为3。每个玩家都希望利益最大化,即Pm最大化。因此可得到一个优化问题:

subject to x+y=3

subject to x>=1

subject to y>=1

       紧接着代入x=y-3可以得到:

subject to x>=1

subject to x<=2

       对于Pm  使用对数求导可以得:

       显然该导数很难直接求得极值点,故下面将采用模拟退火算法来逼近极值点。首先根据对称性,猜想极值点应为1.5,下面通过模拟退火算法来验证,得到下图的优化路线:

图五模拟退火算法求极值

从上图我们可知,函数在第300代左右收敛,极值点在1.5处取得,最大值约为3.6742。而我们知道,金钱应该花在攻击伤害和生存能力上大致相同时,所获得的收益最高,这与该函数反映的现象是一致的。同时,我们还可以作出该函数的图像:

图六函数图像

       由图像可知,x在[1,1.5]递增,在[1.5,3]递减,这也符合游戏的实际情况,把所有经济全花在一个方面的提高上,对于整体的收益是不高的。因此该函数采取攻击伤害和生存能力互为底数和指数建模的方式是合理的。

       但是为什么要把x,y的范围确定在[1,2]之间而不是[0,1]之间呢?

若直接用 ,来进行建模,则会在零点出现尖峰,下面构造一个二元函数来进行类比:

subject to 1>=x>0

subject to 1>=y>0

       在matlab中画出该图像,得到下图:

图七

    从上图显然可知在零点附近会出现一个尖峰,这显然不符合游戏的情况,一个英雄在生存能力和攻击伤害都趋于零的时候,强度应该也趋于零才符合常理。经过分析,这是由于x,y的值域所造成的,应该将x,y的值域提高至[1,2]比较合理,故最终确定了该函数,将所有变量替换为对应变量加一的和。

    强度排名前十的英雄有:

["程咬金"]

["橘右京"]

["张飞" ]

["刘邦" ]

["赵云" ]

["关羽" ]

["芈月" ]

["项羽" ]

["高渐离"]

["曹操" ]

强度排名最后十名的英雄有:

["武则天"  ]

["鲁班七号"]

["张良"   ]

["诸葛亮"  ]

["韩信"   ]

["妲己"   ]

["小乔"   ]

["孙膑"   ]

["大乔"   ]

["甄姬"   ]

["姜子牙"  ]

英雄的最大强度为8.3094,平均强度为5.6125,最小强度为3.3022。

5.1.6 对英雄的级别进行分类

   级别为了衡量战士和法师的伤害程度,我们用综合伤害SH=(1+J’)(1+G)来衡量。此外为了公式的方便,我们定义H1=1+H。

   我们可以将英雄的级别先大致分为3级,第一等级是生存能力和综合伤害均大于平均值,第二等级是生存能力或者综合伤害有一方大于平均值,第三等级是两者均小于平均值。

    平均综合伤害SH平均值为2.2505

    H1平均值为1.4611

第三等级的英雄有:

    ["姜子牙"]

    ["大乔" ]

    ["甄姬" ]

    ["貂蝉" ]

    ["韩信" ]

    ["诸葛亮"]

    ["张良" ]

    ["妲己" ]

    ["蔡文姬"]

    ["小乔" ]

    ["安琪拉"]

["孙膑" ]

第二等级的英雄有:

["武则天"  ]

["花木兰"  ]

["王昭君"  ]

["嬴政"   ]

["李白"   ]

["周瑜"   ]

["干将莫邪"]

["马可波罗"]

["虞姬"   ]

["狄仁杰"  ]

["李元芳"  ]

["成吉思汗"]

["黄忠"   ]

["阿轲"   ]

["后羿"   ]

["鲁班七号"]

["不知火舞"]

["孙尚香"  ]

["高渐离"  ]

["娜可露露"]

["兰陵王"  ]

["雅典娜"  ]

["扁鹊"   ]

["项羽"   ]

["鬼谷子"  ]

["达摩"   ]

["老夫子"  ]

["墨子"   ]

["哪吒"   ]

["吕布"   ]

["夏侯惇"  ]

["典韦"   ]

["太乙真人"]

["白起"   ]

["东皇太一"]

["庄周"   ]

["亚瑟"   ]

["刘邦"   ]

["张飞"   ]

["牛魔"   ]

["刘禅"   ]

["程咬金"  ]

["廉颇"   ]

第一等级的英雄有:

["芈月"   ]

["宫本武藏"]

["钟馗"   ]

["孙悟空"  ]

["露娜"   ]

["赵云"   ]

["刘备"   ]

["钟无艳"  ]

["橘右京"  ]

["关羽"   ]

["杨戬"   ]

["曹操"   ]

5.2 问题二的模型建立与求解

5.2.1 英雄的个人实际强度Pr和群体实际强度Prq

   首先,根据假设,玩家的水平与玩家的数量应该成标准正态分布,但是我们同时注意到Si变化范围仅仅在(0,1)之间,而高斯分布的定义域为全体实数域,因此接下来我们将用正切函数进行映射转换。

图八高斯分布

标准正态分布的公式为:

fg(x)=

现在作如下正切变换:
 

x=tan(π(-0.5))

我们知道:

=1

结合三个式子,积分变换可得:

英雄的理论最大强度和英雄的个人实际强度最大的区别就在于,英雄的个人实际强度会随着玩家水平的变化而变化。于是我们构造了如下关系:

'

    其中, 为英雄的理论最大强度, 为官方所给的上手难度。

我们知道,当两个人同等水平时,如果所玩的英雄上手难度不一样,能够发挥出的英雄的最大理论强度的百分比是不一样的,因此个人实际强度中引入英雄本身的上手难度是符合常理的。同时,为了扩大各个英雄上手难度之间所导致的差异,我们将 的指数变为

下面我们通过程咬金,干将莫邪,妲己三个英雄来进行说明。首先,我们已知了程咬金,干将莫邪,妲己三个英雄的最大理论强度分别为8.3094,5.1863,3.8474,上手难度分别为0.1,0.7,0.2。于是我们可以绘出下图:

图九英雄的个人实际强度

图中,黄色代表程咬金的个人实际强度pr 曲线,橙色和蓝色分别是干将莫邪和妲己的曲线,我们可以知道,在玩家水平很低的时候,程咬金理论最大强度所能发挥出来的百分比远远大于妲己和干将莫邪,这是由于程咬金的上手难度低于妲己和干将莫邪造成的。之后在Si 高于0.7418时,干将莫邪的强度开始大于妲己,这也不奇怪,在玩家的水平越来越高时,对于高难度英雄的操作得越来越娴熟,一些高难度并且高最大理论强度的英雄就开始后来居上,超过原本的低难度英雄。

       既然知道了英雄的个人实际强度在人群中随着个人水平的变化关系,又知道了人群数量随着个人水平的变化关系,紧接着,我们将用积分继续给出英雄的群体实际强度和英雄的群体发挥系数的表达式:

      

     称为英雄的群体实际强度,是一个关于 的函数。

称为英雄的群体发挥系数,是一个关于 的函数。

5.2.2 模型的求解

在用matlab进行数值积分求解时,考虑到精度以及正切函数的特殊性,积分变量所取的范围实际上是[0.0001,0.9999]。根据式子写出程序,得到运行结果。

群体实际强度排名前十的英雄有:

["程咬金"]

["亚瑟" ]

["典韦" ]

["橘右京"]

["项羽" ]

["廉颇" ]

["老夫子"]

["狄仁杰"]

["刘邦" ]

["高渐离"]

群体实际强度排名最后十名的英雄有:

["露娜"   ]

["李白"   ]

["甄姬"   ]

["武则天"  ]

["张良"   ]

["诸葛亮"  ]

["孙膑"   ]

["太乙真人"]

["不知火舞"]

["韩信"   ]

["姜子牙"  ]

胜率和出场率的数据可以从王者荣耀官方助手上查到,取来自于时间段9.29-10.05的数据。于是紧接着,我们将英雄的理论最大强度,群体最大强度,出场率,上手难度作为输入参数,胜率作为输出参数,建立了一个[4,10,10,1]的神经网络模型,其中的数字分别代表输入层,第一层隐含层,第二层隐含层,输出层的神经元个数。我们将67个英雄的数据全部作为训练集,把百里守约,元歌,伽罗,明世隐,铠的数据作为验证集进行训练,这五位英雄的数据是我们登录王者荣耀游戏里面进行记录的。之后我们设置训练集的goal performance(目标的均方误差)为0.005,设置停止循环的条件为在验证集上的平均绝对值误差小于等于0.01,即如下式子:

在程序中设计循环,用训练集上的均方误差作为训练目标,并且用元胞数组记录下每一个神经网络的参数和性能,再用验证集进行仿真,用while循环判断是否满足了停止条件,如果没有满足验证集上的平均绝对值误差小于等于0.01的条件,则返回重新进行训练,重新初始化权值和阈值,如果满足了验证集上的要求,则停止训练。我们只需要在程序停止时,导出元胞数组保存的最后一个神经网络参数即可。最终,经过171训练,我们得到了一个模型,在验证集上的平均绝对值误差仅为0.0084,即预测胜率时平均出现±0.84%的误差。

神经网络的对于五位英雄的胜率预测结果为:

0.4655    0.5177    0.4903    0.5147    0.4913

实际的胜率为:

0.4776    0.5128    0.4873    0.5361    0.4906

基本满足预设的模型要求。

神经网络模型的相关参数太多,神经网络以及相关求解程序已经用mat格式保存在附件中。

综上所述,我们找到了一个神经网络模型来描述题目二中相关变量的关系,符合题目要求。

5.3 问题三的模型建立与求解

5.3.1  英雄总体设计思路

   我们决定设计一个法师英雄,技能释放需要时机和操作,上手难度中等偏上,理论最大强度偏大,但是个人需要花较多时间练习,群体实际强度偏小,这样的英雄练习起来有成就感,不至于太过枯燥,比较耐玩。

5.3.2 英雄相关信息说明

   英雄名称:祢衡

    英雄技能个数:3

    英雄攻击范围:远程

英雄面板数据:

最大生命:5971    起始生命:3125   

最大物攻:298    起始物攻:165

最大物防:343    起始物防:91 

移动速度:350

    英雄技能1名称:唇枪舌剑

    英雄技能1效果:

向最远700码距离处发射一杆长枪,造成750/900/1050/1300/1450/1600(+1.0*法术强度)的伤害,之后可以再次激活该技能发射三枚飞剑,每枚飞剑造成450/500/550/600/650/700(+0.4*法术强度)伤害,发射之间有0.5秒硬直。如果第一枚长枪没有击中,则接下来三枚飞剑的伤害将变为原来的50%。非指向性技能。

CD: 13/12/11/10/10/10

消耗:60

英雄技能3名称:不堪为伍

英雄技能3效果:

祢衡向目标冲锋,范围300码,并造成目标最大生命值 4%/4.5%/5%/5.5%/6%/6.5%(+0.01*法术强度)的魔法伤害,如果对方有愤怒标记,则伤害翻倍,并且获得30%移动速度加成1.5s,并且减少3SCD时间。指向性技能。

消耗:80

CD:15/14/13/12/12/12

    英雄技能2名称:击鼓骂曹

    英雄技能2效果:

标记900码范围内一名敌人,敌人被标记时头上会有愤怒标记,愤怒标记总共持续4s,在愤怒标记持续2.5s的期间内,来自祢衡的攻击该英雄的普攻或者技能会使该英雄减速70%,持续1.5s,在愤怒持续的2.5-4s时间内,来自祢衡的攻击该英雄的普攻或者技能会嘲讽该英雄1.5s,并且击碎该英雄40%/45%/50%的魔抗,持续4s。以上的任一效果在5s内只能被普攻或技能触发一次。指向性技能。

CD:15/14/13/12/12/12

消耗:120

   下面介绍一下这样取值的合理性及缘由。

    祢衡的基础面板数值,除了移动速度之外,取自67名英雄中所有法师的基础面板数据的平均值,给出了一个比较中庸的基础数值。

5.3.3 模型原理阐述

    据此,经过归一化之后我们可以得到:

    w=0.2500, y=0, f=1, wf=0.1839, Ff=0.4, Sf=0.1766

       并且我们根据英雄的描述,可知祢衡是一个操作性难度很大的英雄,需要掌握切入的时机,技能2的范围比较有限,但是配合技能3产生的加速可以很好地脱离战场,有一定的生存能力。技能3会一定程度上暴露自己的进攻意图,而且技能之间相互配合才能打出比较高的伤害,并且容错率很低,CD长,蓝耗大,但是一旦配合成功将输出很可怕的伤害。于是对比其他英雄,可以给出:

       G’=0.5,H’=0.4,J’=0.9,D’=0.9

我们可以算出英雄的各项指标:

H’’=a6wf+a7Ff+a8Sf+a9y=0.1943

H= 0.2H’’+0.8 H’=0.5189

G’’=a1w+a2y+a3f=0.3864

G= 0.2G’’+0.8 G’=0.4773

mean(G)=0.4550

mean(G’)=0.4627

mean(G’’)=0.4241

mean(H)=0.4611

mean(H’)=0.4896

mean(H’’)=0.3475

与所有英雄对应的平均值相比,并没有产生很大偏离。

    于是根据模型一,Pm=6.4299

    英雄的理论最大强度在所有英雄中排第17位,达到了我们想打造一个理论最大强度较高,可玩度较大的英雄。

    再根据模型二,我们可以算出:

   

prq(D')=pm×pf(D') =2.0903

    英雄的群体实际强度在所有的英雄中排55位,由于高额的上手难度,这个排名在预期范围之内。我们达到了低群体实际强度,高最大理论强度的目标。

    该英雄技能可玩性很高,但操作难度大,对出场率会有抑制,我们取出场率第20名至25名,即13.58%-15.55%之间进行预测,之后我们将相关数据代入神经网络进行仿真,绘制出图像:

图十神经网络仿真结果

 

    从上图可知,该英雄的胜率在[46.52%,51.31%]之间,符合常理,如果英雄的出场率低于10%时,胜率将跌至38%,不符合实际,这样一个伤害高,技能充满花样的英雄,胜率在50左右波动是正常的,合乎情理的,因此反推出场率确实应该在13.5%-15.5%左右。我们的假设是具有一定合理性的,如果出场率假设太高,当出场率突破20%时,胜率将超过68%,远远大于50%,所以这样假设这是不合理的,因为该英雄虽然可玩度高,但是难度毕竟较大,胜率在普通水平大众的参与下,不可能高到离谱。

综上,我们可以大致估计,英雄的出场率大概率在13.5%-15.5%左右波动,胜率在46.52%-51.31%左右波动。同时我们可以断言,波动再强烈,出场率最大波动峰值不可能超过20%,最低波动谷值不可能小于10%。

 

6.模型的评价与改进

6.1 模型的评价

本模型考虑到了个人水平发挥对于英雄实际强度的影响,从英雄实际数值和个人水平发挥,以及群体水平分布三个角度进行了相关分析,并且取得了一定成果,能够说明一些问题。

6.2 模型的改进

   模型一中,我们的分类仅仅是通过平均值进行分类,第二等级滞留了大部分英雄,应该还要找到更优秀的指标进行进一步的划分。

   从模型二的数据中我们可以看到,在预测胜率时,第三个英雄伽罗和第五个英雄铠预测效果比较好,这是由出场率高造成的,可以将所玩的玩家看成全体,于是高斯分布能够起到相应的效果,但是当英雄的出场率变低时,预测有一部分出现了较大偏离,这时所玩玩家的群体水平往往不能再看作是高斯分布,比如在预测武则天的群体实际强度时,排名特别低,但是胜率实际上却是第一,出场率越低,发生偏差的可能性以及偏差的数值就会越大。在出现这样的现象之后,我们还应该对出场率中的小部分人群的人群分布做更深一步的讨论,对于小部分冷门英雄进行独立建模,但这样会带来极大的工作量,小部分人群的分布往往更加难以确定。

7.附录

附录一:模型二的神经网络的相关求解代码(需要导入相关数据,不可直接运行)

load data_cell.mat

load 7个数据(物攻,物防,生命,移速,攻击范围,视频人气,皮肤数量).mat

load 官方四个相对值(生存能力,攻击伤害,技能效果,上手难度).mat

load 胜率和出场率矩阵形式.mat

load XT是群体强度降序排名XTT是胜率降序排名.mat

load 强度.mat

load 群体实际强度.mat

ccl_=testS1(:,2)

input__=[Pm,prq,ccl,pifi888]%结果并不好

input__=[Pm,prq,ccl,ssnd]

shipin888=shipin888'

input__=[Pm,prq,ccl,pifi888,shipin888,ssnd]%结果并不好

Pm_=Pm

p_test=[Pm_;sim_prq;ccl_;sim_pifu;shipin888_;ssnd_]%;是行,,是列

p_test=[Pm_;sim_prq;ccl_;ssnd_]%;是行,是列

p_test=[6.4299,2.0903,0.2,0.9]

ssnd_=ssnd_'

Pm=Pm'

ccl_=ccl_'

input__=input__';

sl_ccl=sl_ccl';

sl=sl'

sim_pifu=[0.3333,0.1667,0.1667,0.1667,0.3333]

%%

% T_train = sl_ccl;

T_train = sl;

% P_test = NIR(temp(81:end),:)';

% T_test = octane(temp(81:end),:)';

% N = size(P_test,2);

sl=sl'

%% III. 数据归一化

[p_train, ps_input] = mapminmax(P_train,0,1);

p_test_=mapminmax('apply',p_test,ps_input)

% p_test = mapminmax('apply',P_test,ps_input);

%  p_train = mapminmax('apply',p_train,ps_input);

[t_train, ts_output] = mapminmax(T_train,0,1);

 

%% IV. BP神经网络创建、训练及仿真测试

%%

% 1. 创建网络

t_train=t_train';

net = newff(p_train,t_train,[10,10]);

 

net_cell=cell(1)

abs__=[]

index=1

%%进行迭代训练

while(sum(abs(testS1(:,1)'-T_sim))>=0.05)

net = newff(p_train,t_train,[10,10]);

net.trainParam.epochs = 1000;

net.trainParam.goal = 5*1e-3;

net.trainParam.lr = 0.01;

net.trainParam.max_fail = 99999;

net.divideFcn = '';

 

% 3. 训练网络

net = train(net,p_train,t_train);

% time=etime(clock,t1);

 

 

% 4. 仿真测试

t_sim = sim(net,p_test_);

% t_sim=t_sim'

T_sim = mapminmax('reverse',t_sim,ts_output);

abs__=[abs__,sum(abs(testS1(:,1)'-T_sim))];

net_cell{index}=net;

index=index+1;

end

 

 

附录二:所有英雄的群体实际强度(由小至大排序)

1.4257

1.4333

1.7499

1.8004

1.8343

1.8461

1.8588

1.8659

1.9034

1.9542

1.9649

2.0343

2.0685

2.1354

2.1440

2.2849

2.3624

2.3651

2.4020

2.4266

2.4268

2.4505

2.4731

2.4922

2.4982

2.5252

2.5562

2.6168

2.6343

2.6582

2.8426

2.8724

2.8750

2.9304

2.9312

3.0018

3.1158

3.1580

3.1618

3.1658

3.1661

3.2588

3.2652

3.2912

3.3182

3.3437

3.3589

3.3852

3.5078

3.5512

3.5646

3.5973

3.6554

3.8300

3.8385

3.8430

3.9146

3.9159

3.9306

3.9774

4.0156

4.1883

4.4716

4.6190

4.7247

4.7821

7.1088

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

王者荣耀-数模论文分享(虽然结果我自己都不信) 的相关文章

随机推荐