DQN玩游戏《2048》

用DQN玩小游戏,可分为游戏环境部分模型部分,最后有源码地址

1.《2048》

应该没有人不会玩吧
2048环境python代码
操作:上下左右
要点:每次都要在空地方随机产生一个新的(2或4)的块块
环境奖励机制:
1.如果有消去的滑块:+消去滑块的大小(比如32+32变成64,就加64分
2.存活:+1分
3.不能移动(即没有消去滑块或产生新滑块):-5分(需要避免模型陷入死路
4.死局:-20

2. Q Learning

Q表:Q[s, a]记录某状态s下对应的行为a的分数
优化(训练)Q表方法:即优化每个状态s下所执行的行为a,若在s下执行了a得到了下一个状态s_和奖励r,当前分数则为Q[s, a],下一步能得到的最好分数为maxQ[s_, ],那么对未来的估计分数就是r+gamma*maxQ[s_,](这里的gamma指的是未来奖励衰减
如果没有衰减,那么Q表可以看到无限远的奖励,但很多情况下会导致环境发生变化,那么之前所训练的Q表中对于较远的情况就不再适用,同时模型也会面临难以收敛的情况。所以设gamma<1,这样Q表就会着重考虑中近状态的情况,也有利于快速收敛)

用公式:Q[s, a] = rl * (r * gamma * maxQ[s_,] - Q[s, a]) 即可完成优化。在此公式中,r * gamma * maxQ[s_,]是Q估计(意思就是我还没有到s_状态,所以我估计在s_状态下能得到的估计奖励),Q[s, a]是Q现实(意思就是我在当前状态确确实实地执行了行为a后得到的现实奖励)。
Q Learning的更新算法思路就是:通过未来得到的估计奖励分数和目前手头的分数的差,来评估这个行为是否“好”。

  • 比如:在状态s执行行为a后,能在未来得到很大一笔奖励,那么久加大Q[s, a]的值,下次执行时,又到状态s时能更大可能地执行a。反之如果收益很小,则下次到状态s时减少执行a的概率

3. DQN

当环境中的状态数量非常多时,用Q表就不再适合,我们考虑用神经网络来代替Q表,但是训练的核心思路还是Q Learning
网络模型:
分为评估网络(evaluate net)和目标网络(target net)
结构一样,但训练时,评估网络拥有最新参数,所以得到的是现实奖励。而目标网络是老参数(通常每10代训练同步一次参数),只能基于过去的视角得到对未来的估计奖励,通过两个奖励的差值来实现模型的训练。

记忆库:
存储【当前状态,下一个状态,采取行为,奖励】(s, s_, a, r)

训练网络:
每次从记忆库中选择batch_size=512批数据进行学习,损失函数也可以仿照Q Learning定义为:TD error = (Q估计 - Q现实)2

q_next = self.q_target_model.predict(s_)  # 现实网络的输出
## 下面是一个训练技巧
q_eval = self.q_eval_model.predict(s)
q_target = q_eval.copy()
batch_index = np.arange(self.batch_size, dtype=np.int32)  # 0-512的下标
# 下面是Q估计
q_target[batch_index, a] = r + self.gamma * np.max(q_next, axis=1)
## 把q_eval_model的输出复制一份,并把所有下标的行为a的那一位维修改为Q估计
self.q_eval_model.fit(s, q_target, epochs=self.train_epochs, verbose=0)

在fit时,q_eval_model.fit(s, q_target)被keras执行为:loss_fun(q_eval_model(s), q_target) = (q_eval_model(s) - q_target)2
比如:某学习数据批中,状态s=[[x1], [x2]], q_eval_model.predict(s) =
[[2,5,1,-2],
[3,8,6,10]](状态x1在现实网络中输出是四个行为的分数为[2,5,1,-2], x2同理)
执行行为是[1,3],下一个状态s_[[x3], [x4]]。经过计算,Q估计为[8,1],所以q_target =
[[2,8,1,-2],
[3,8,6,1]]
那么TD_error = [[0,5-8,0,0],[0,0,0,10-1]]2,无关的行为都是0,只有相关的行为会被训练,即实现了对状态s下行为a的训练。

4. 训练技巧

归一化:因为2048游戏中是0-2048的数字,对于模型来说难以处理,所以考虑处理成0-1直接是最好的,我们使用对数进行压缩,由于大部分数字是2-1024,所以考虑用公式:

s = log(s+1) / 16

tbc…

5. 展示结果

获得奖励的图
tbc…
ps. 源码地址

【强化学习】小项目分析:DQN玩游戏2048相关推荐

  1. Unity红球吃绿球强化学习小任务——Ubuntu20.04系统于2022年2月26日实现

    Unity红球吃绿球强化学习小任务--Ubuntu20.04系统于2022年2月26日实现 Unity红球吃绿球强化学习小任务 一.主机环境参数说明 二.具体教程以之前提供的视频介绍为主,需要修改的章 ...

  2. 强化学习--Prioritised Replay DQN

    系列文章目录 强化学习 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录 前言 一.强化学习是什么? 二.核心算法(深度强化学习)Prioritised Rep ...

  3. 【深度学习】强化学习Q-Learning和DQN的应用(迷宫)

    [深度学习]强化学习Q-Learning和DQN的应用(迷宫) 文章目录 1 Q-Learning 2 例子 3 用 network 解决 4 DQN机器人走迷宫代码4.1 基础搜索算法介绍(广度优先 ...

  4. 强化学习快餐教程(2) - atari游戏

    强化学习快餐教程(2) - atari游戏 不知道看了上节的内容,大家有没有找到让杆不倒的好算法. 现在我们晋阶一下,向世界上第一种大规模的游戏机atari前进. 太空入侵者 可以通过 pip ins ...

  5. 强化学习实战 --- 用DQN让Ai玩吃豆子游戏吧

    前景介绍 上期文章介绍TensorFlow入门基础篇,本意就是给介绍强化学习做一篇前置. 本期我们将尝试利用深度强化学习来让神经网络学习自动地玩一款经典的吃豆人小游戏.让我们愉快地开始吧~ 吃豆人小游 ...

  6. Python详细了解强化学习算法并基于强化学习Q_learning让电脑玩flappy bird游戏

    完整代码:https://github.com/Connor666/flappy_bird-RL 首先,如果你是为了追求一个非常高的强化学习效果,也就是flappy bird的分数,那么建议出门右拐选 ...

  7. 深度强化学习中Double DQN算法(Q-Learning+CNN)的讲解及在Asterix游戏上的实战(超详细 附源码)

    需要源码和环境搭建请点赞关注收藏后评论区留下QQ~~~ 一.核心思想 针对DQN中出现的高估问题,有人提出深度双Q网络算法(DDQN),该算法是将强化学习中的双Q学习应用于DQN中.在强化学习中,双Q ...

  8. 强化学习 - 详细解读DQN(更新完成)

    详细解读DQN 一. 强化学习 1. 什么是强化学习问题? 2. 强化学习的理论体系 (1) MDP i) Markov Property ii) Markov Process iii) Markov ...

  9. 深度强化学习:从像素玩Pong!

    强化学习(Reinforcement Learning,RL)特别火!你看过许多新闻:电脑能自动学习ATARI游戏,在围棋比赛中击败世界冠军,模拟四足动物学习跑和跳,机器人学习完成编程无法实现的复杂操 ...

最新文章

  1. js中字符串转json
  2. 弱电工程室内外光纤敷设有哪些技术要求
  3. busmaster 使用教程_Busmaster使用.pdf
  4. 高效CSS的一些建议
  5. vtk类之vtkFixedPointVolumeRayCastMapper :一个固定像素点的体数据映射器
  6. c++制表符_在Linux命令行中将制表符(tab)转换为空格
  7. Grunt + Bower—前端构建利器
  8. python 批量修改密码
  9. 如何保证执行异步方法时不会遗漏 await 关键字
  10. To 研究生,第一:做学位论文期间,不要有任何度假休息的打算;第二,导师错的时候不多;第三……...
  11. 自动备份 SourceSafe
  12. java poi导出Excel表格超大数据量解决方案
  13. 深耕MySQL - 50道SQL练习题
  14. 计算两个时间之间的进度百分比
  15. 突破同一账号不能同时在不同电脑登录限制程序软件(多电脑端登录器多开软件)
  16. android 判断base64编码格式,一文带你读懂base64编码
  17. UG NX二次开发(C#)-UI Styler-批量选择点
  18. The puzzle
  19. [生存志] 第101节 九歌道尽楚芳华
  20. 【C语言】形参实参以及参数传递

热门文章

  1. IDA的脚本IDC的一个简单使用
  2. 微信小程序使用wxa-plugin-canvas分享海报和朋友圈
  3. 中国上古神话中神族谱系探源
  4. 2018n年全国计算机考试,2018年通信工程师考试真题及答案出炉,可以估分啦!
  5. ChatGPT vs. Bing vs. Bard
  6. 2.2 在Matlab中进行相机标定
  7. 充电桩、换电站、移动充电机器人,谁是补能最优解?
  8. windows不安装wifi共享软件实现wifi共享
  9. 怎么下载优酷,土豆、乐视网上视频,4种快速方法
  10. 节后上班第一天,我们为无心上班的你准备了一些硬科技“谈资”