使用AI和大数据分析永劫无间振刀延时
使用AI和大数据分析永劫无间振刀延时
使用AI梯度下降拟合10米处振刀敌方长剑的最佳延时
永劫无间是一款比较好玩的动作游戏,如果能够在合适的时机振刀,则会对对手造成心理和生理上的巨大伤害。由于小康平时也玩永劫无间,但是却很难把握合适的振刀时机,尤其是长剑在远处的剑气很难把控。于是小康想到用自己所学的AI知识简单拟合一下振刀的最佳时机,从而将问题搞明白。下面将通过四个阶段来讲解。
1. 数据收集
数据收集的目的是尽可能在知道对方网络延时的条件下,百分百准确的取得最靠谱的振刀延时。从而增加己方振刀的成功率。距离和己方延时也会对结果造成影响,由于还是对问题的初步探索,我们先研究在己方延时60-85的区间,与敌方距离固定为10米的条件下,变量敌方网络延时与我方成功振刀延时的关系。暂且不论其他变量对结果造成的影响。
取得延时的方法很简单,在得知对方网络延迟(EnemyNetMs)的条件下,
判断敌方出刀时作为计时起点
t1(例如GetState(enemy)=12),
判断振刀成功状态作为一次合理振刀终点
t2(例如GetState(myself)=31),
振刀键位按下及其动作的总时间
t3(t3=振刀出手时刻(t5(GetVibratingTime(myself))-按下振刀键时刻t4),
那么我们可以得到振刀的最佳延时就是
t2-t1-t3,
至于各种问题造成判断速度的误差,我们暂且忽略不计。特别说明,以上均为理想的伪代码,与实际游戏无关。我们将获得的数据统计并利用matplotlib画出,得到下面的散点图:
2. 根据数据做出拟合函数的合理假设
得到了上面的散点数据图,接下来我们需要预测一个合理的拟合函数,这样的关系很明显,是典型的线性关系,小康这里大胆预测,这就是一个一元一次函数y=wx+b
我们接下来只需要想办法将这个一元一次函数尽可能完美拟合这些散点即可!
3. 写出代价函数并求出对应偏导数
因为做出了合理假设,我们求代价函数和对应的偏导数就显得十分简单了。
首先我们要初始化预测函数的值来帮助我们更快的收敛。
由以上散点图可知,我们的b大概在150左右,w反正是比1小比0大的,我们不妨直接设:
b=150,w=0.9作为初始值。
先来看下我们预测的初始函数长什么样子:
可以看出,虽然比较接近,但肯定不是正确答案喽。
- 用标准值与预测值查值的平方作为代价函数:
- 对代价函数中双变量w和b进行分别求偏导数:
4. 进行梯度下降算法得到拟合函数
最后我们终于可以进行梯度下降了,首先我们先设定一个学习率,避免震荡幅度过大导致不收敛,
learnrate=0.00003
开始梯度下降:
直接感知反馈1万次
for i in range(10000):
for j in range(100):
x=a1[j]
y=a2[j]
dw=2*x**2*w+2*x*b-2*x*y
db=2*b+2*x*w-2*y
w=w-learnrate*dw
b=b-learnrate*db
ypre=w*a1+b
plt.plot(a1,ypre)
plt.show()
生成第一次图像
不对劲,还是有一定偏移的,不过已经说明我们的算法使用正确了,我们把感知次数加到3万次
for i in range(30000):
for j in range(100):
x=a1[j]
y=a2[j]
dw=2*x**2*w+2*x*b-2*x*y
db=2*b+2*x*w-2*y
w=w-learnrate*dw
b=b-learnrate*db
ypre=w*a1+b
plt.plot(a1,ypre)
plt.show()
生成第二次图像
可以明显看到反馈变好了许多,这里就不继续加次数了,我们打印最后得到的w,和b值看一下:
w=0.40638673076922555
b=205.7727153053264
这跟我们初始值b=150,w=0.9确实是完全不同了。
结论
我们通过以上的分析,得到了在双方距离为10m,自身网络延时60-85ms的条件下, 振刀最佳延时与敌方网络延迟的关系函数:
y=0.406x+205.77
- 点赞
- 收藏
- 关注作者
评论(0)