借鉴
飞机大战源码 github
王者荣耀ai训练(试了一下,发现电脑带不动,就改了一点,训练其他游戏)
源码
通过网盘分享的文件:PlaneWar (2).zip
[链接](https://pan.baidu.com/s/1N4OorR7b36Zml8MadGmI6g?pwd=1234) 提取码: 1234
dqn的介绍(ai回复)
深度Q网络(DQN):
DQN是一种结合了深度学习和Q学习的强化学习算法。它使用深度神经网络来估计状态-动作值函数(Q值)。
在代码中,self.policy_net和self.target_net分别是策略网络和目标网络,它们都是深度神经网络。
经验回放(Experience Replay):
经验回放是一种常用的技术,用于打破数据之间的相关性,提高训练的稳定性和泛化能力。
在代码中,transitions是从经验池中随机抽取的一批经验,这些经验被用来训练网络。
目标网络(Target Network):
目标网络用于稳定训练过程,通过定期将策略网络的参数复制到目标网络,减少训练过程中的不稳定性和噪声。
在代码中,self.target_net是目标网络,每隔self.target_update步,将self.policy_net的参数复制到self.target_net。
策略梯度(Policy Gradient):
策略梯度是一种强化学习算法,通过最大化期望回报来更新策略。
在代码中,通过计算当前状态-动作值和期望状态-动作值之间的差异(即损失),然后使用反向传播和优化器来更新策略网络。
梯度下降(Gradient Descent):
梯度下降是一种优化算法,用于最小化损失函数。
在代码中,使用PyTorch的优化器(如self.optimizer)来执行梯度下降,更新策略网络的参数。
Epsilon-Greedy 策略:
Epsilon-Greedy策略是一种探索与利用的平衡策略,通过以一定概率随机选择动作,以探索未知状态,同时以一定概率选择当前最优动作,以利用已知信息。
在代码中,self.epsilon控制了探索的概率,如果self.epsilon大于self.epsilon_min,则将其乘以self.epsilon_decay,以逐渐减少探索的概率。
损失函数(Loss Function):
损失函数用于衡量预测值和真实值之间的差异,常见的损失函数包括均方误差(MSE)和交叉熵损失(Cross-Entropy Loss)。
在代码中,使用均方误差损失函数(self.criterion)来计算当前状态-动作值和期望状态-动作值之间的差异。
实现过程
1.决定目标 飞机大战
画风好看 下载即用
2.缝缝补补
“小”问题
内存泄漏
存储大量信息的部分代码几乎没动,就缩小了动作空间。依然是截图并作为状态传给网络。结果爆了
1.用了多种办法检测,还是找不到原因。
2.第二天突然灵机一动,觉得很可能是太多全局变量了。大刀阔斧的改了一早上,无效…
3.怀疑到了新加的游戏上面,添加了对象池(出了各种bug!!!)
最后实在没办法了,只能将该着训练下去。因此,不能一直训练,会报错,没有内存放模型
效果
个人觉得有点玄学,一个模型上一局得了60分,下一局直接成不死战神了
可惜,由于不死,最后内存不足,报错,只能关机重启。没有保持到战神!真是成也不死,败也不死了。
吸取了这个惨痛教训,我特意设计成不仅每局自动保存最高分的模型,还会在训练一定步数后对比当前分数与最高分的,如果更高,则保存当前模型,再也不怕“不死战神”的惨剧上演了!可以根据电脑情况决定保存步数的大小。
训练挺快的,因为游戏难度不算太高。可是就出了一个厉害的战神,后面的最高才166分!
如果有什么建议,欢迎提出