Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何训练AI玩飞机大战游戏

如何训练AI玩飞机大战游戏

作者头像
数据森麟
发布于 2019-09-27 09:04:18
发布于 2019-09-27 09:04:18
3.3K11
代码可运行
举报
文章被收录于专栏:数据森麟数据森麟
运行总次数:1
代码可运行

本文转载自1024开发者社区

虽然没有谷歌强大的集和DeepMind变态的算法的团队,但基于深度强化学习(Deep Q Network DQN )的自制小游戏AI效果同样很赞。先上效果图:

下面分四个部分,具体给大家介绍。

/1/背景介绍

2013年DeepMind团队发表论文“Playing Atari with Deep Reinforcement Learning”,用Q-Network模型成功让AI玩起了Atari系列游戏。并于2015年在《Nature》上发表了一篇升级版,“Human-level control through deep reinforcement learning”,自此,在这类游戏领域,人已经无法超过机器了。AI玩游戏的姿势是这样的:

后来的故事大家都很熟悉了,AlphaGo击败世界冠军,星际争霸2职业选手也被打败,连大家接触较多的王者荣耀也不能幸免。

/2/深度强化学习模型

看完了轻松的部分,下面简单介绍一下模型。DQN是DRL的一种算法,它将卷积神经网络(CNN)和Q-Learning结合起来。

Q-learning是强化学习的一种,原理图如下:

也就是Agent在观察得到当前的状态state和回报reward的基础上,选取输出一个动作action,进而影响环境,使环境状态和回报都产生变化。通过不断循环让Agent学习如何在环境中获得更高的回报。

卷积神经网络CNN是图像处理领域非常经典的神经网络模型,在本模型中,输入是原始图像数据,输出为每个动作action对应的评估值。

因此DQN总体结构是这样的:

图比较简单,但原理很清晰,是将Agent中的模型用CNN来代替,环境的State为游戏界面截图,输出为AI的动作,在飞机大战中就是飞机向左、向右还是不动。回报reward具体为,在一次循环中没有被击中为0.1,被击中为-1,击中敌机为1。图中回放记忆单元、当前网络和目标网络都是为了将CNN这种需要大量样本的监督学习融合在强化学习模型中的手段。篇幅限制这里只是概述性的介绍,后期会专门讲。

/3/模型实现

3.1程序的总体结构

程序主函数在PlaneDQN.py中,与DQN模型相关的函数在BrainDQN_Nature.py中,游戏模型在game文件夹中,训练过程保存的训练值在saved_networks文件夹中。

3.2主函数搭建

大家注意看while循环里的结构,其实非常明确:

  • getaction()为在当前的Q值下选取动作
  • framestep()为运行环境,并输出观测值
  • process()为对图像数据进行处理的函数
  • setPerception()根据图像和回报,对网络进行训练
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def playPlane():
   # Step 1: 初始化DQN
   actions = 3
   brain = BrainDQN(actions)
   # Step 2: 初始化游戏
   plane = game.GameState()
   # Step 3: 玩游戏
   # Step 3.1: 获取初始动作
   action0 = np.array([1,0,0])  # [1,0,0]do nothing,[0,1,0]left,[0,0,1]right
   observation0, reward0, terminal = plane.frame_step(action0)
   observation0 = cv2.cvtColor(cv2.resize(observation0, (80, 80)), cv2.COLOR_BGR2GRAY)
   ret, observation0 = cv2.threshold(observation0,1,255,cv2.THRESH_BINARY)
   brain.setInitState(observation0)
   # Step 3.2: 开始游戏
   while 1!= 0:
      action = brain.getAction()
      nextObservation,reward,terminal = plane.frame_step(action)
      nextObservation = preprocess(nextObservation)
      brain.setPerception(nextObservation,action,reward,terminal)

3.3 游戏类GameState和framestep

通过pygame实现游戏界面的搭建,分别建立子弹类、玩家类、敌机类和游戏类,结构代码所示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Bullet(pygame.sprite.Sprite):
    def __init__(self, bullet_img, init_pos):
    def move(self):
# 我方飞机类
class Player(pygame.sprite.Sprite):
    def __init__(self, plane_img, player_rect, init_pos):
    def shoot(self, bullet_img):           def moveLeft(self):        
    def moveRight(self):
# 敌方飞机类
class Enemy(pygame.sprite.Sprite):
    def __init__(self, enemy_img, enemy_down_imgs, init_pos):
    def move(self):

class GameState:
    def __init__(self):      
    def frame_step(self, input_actions):       
        if input_actions[0] == 1 or input_actions[1]== 1 or input_actions[2]== 1:  # 检查输入正常
            if input_actions[0] == 0 and input_actions[1] == 1 and input_actions[2] == 0:
                self.player.moveLeft()
            elif input_actions[0] == 0 and input_actions[1] == 0 and input_actions[2] == 1:
                self.player.moveRight()
            else:
                pass
        else:
            raise ValueError('Multiple input actions!')
        image_data = pygame.surfarray.array3d(pygame.display.get_surface())
        pygame.display.update()
        clock = pygame.time.Clock()
        clock.tick(30)
        return image_data, reward, terminal

其中GameState中的framestep()函数,是整个DQN运行一次使环境发生变化的基础函数,该函数运行一次,会根据inputaction进行动作实施,接着会在该时段对界面上的元素进行移动,并判断是否撞击。最后通过get_surface获取界面图像,最后返回环境的image_data,reward和游戏是否停止的terminal。本文游戏效果图为:

为提高模型收敛速度,在实际运行时将背景图片去掉。

3.4 DQN模型类

该部分为DQN模型的核心,主要有根据参数建立CNN网络的createQNetwork(),进行模型训练的trainQNetwork(),进行动作选择的getAction()。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class BrainDQN:
   def __init__(self,actions):  
   def createQNetwork(self):
      return stateInput,QValue,W_conv1,b_conv1,W_conv2,b_conv2,W_conv3,b_conv3,W_fc1,b_fc1,W_fc2,b_fc2
   def copyTargetQNetwork(self):
      self.session.run(self.copyTargetQNetworkOperation)
   def createTrainingMethod(self):
   def trainQNetwork(self):   
   def getAction(self):
      return action
   def setInitState(self,observation):
      self.currentState = np.stack((observation, observation, observation, observation), axis = 2)
   def weight_variable(self,shape):
      return tf.Variable(initial)
   def bias_variable(self,shape):
      return tf.Variable(initial)
   def conv2d(self,x, W, stride):
      return tf.nn.conv2d(x, W, strides = [1, stride, stride, 1], padding = "SAME")
   def max_pool_2x2(self,x):
      return tf.nn.max_pool(x, ksize = [1, 2, 2, 1], strides = [1, 2, 2, 1], padding = "SAME")

3.5图像处理

图像预处理调用cv2库函数,对图像进行大小和灰度处理。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def preprocess(observation):
   observation = cv2.cvtColor(cv2.resize(observation, (80, 80)), cv2.COLOR_BGR2GRAY)#灰度转化
   ret, observation = cv2.threshold(observation,1,255,cv2.THRESH_BINARY)
    return np.reshape(observation,(80,80,1))

/4/环境搭建

  • 系统:Ubuntu16.04、win10
  • Python3.5
  • pygame 1.9.4
  • TensorFlow1.11(GPU版)
  • OpenCV-Python

公众号中回复“AI飞机”,获取代码,包含训练500000次的结果。本程序对硬件要求不高,显存2GB以上就可运行。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据森麟 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
你好,请问关注哪个公众号获取呢?
你好,请问关注哪个公众号获取呢?
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
强化学习系列案例 | 训练智能体玩Flappy Bird游戏
Flappy Bird是一款简单操作的手机游戏,在游戏中有一只飞翔的小鸟,在飞行中会遇到管道障碍物,玩家需要操控小鸟往上飞,飞行过程中不能坠地也不能触碰障碍物,不断的实行动作会飞的越来越高;如果不采取飞行动作,则会快速下降。因此玩家要使用合适的策略控制小鸟飞行,使小鸟不会坠地同时能顺利地穿越障碍物。本案例使用强化学习算法DQN训练智能体,使其最终学会玩Flappy Bird游戏。
数据酷客
2020/04/24
3.1K1
强化学习系列案例 | 训练智能体玩Flappy Bird游戏
强化学习DQN玩转FlappyBird|前景提要
强化学习是机器学习大家族中的一大类, 使用强化学习能够让机器学着如何在环境中拿到高分, 表现出优秀的成绩. 而这些成绩背后却是他所付出的辛苦劳动, 不断的试错, 不断地尝试, 累积经验, 学习经验。
用户1621951
2020/11/03
1.5K0
强化学习DQN玩转FlappyBird|前景提要
Python 还能实现哪些 AI 游戏?附上代码一起来一把!
人工智能作为当前热门在我们生活中得到了广泛应用,尤其是在智能游戏方面,有的已经达到了可以和职业选手匹敌的效果。而DQN算法作为智能游戏的经典选择算法,其主要是通过奖励惩罚机制来迭代模型,来达到更接近于人类学习的效果。
AI科技大本营
2020/06/17
1.4K0
Python 还能实现哪些 AI 游戏?附上代码一起来一把!
PaddlePaddle版Flappy-Bird—使用DQN算法实现游戏智能
刚刚举行的 WAVE SUMMIT 2019 深度学习开发者峰会上,PaddlePaddle 发布了 PARL 1.1 版本,这一版新增了 IMPALA、A3C、A2C 等一系列并行算法。作者重新测试了一遍内置 example,发现卷积速度也明显加快,从 1.0 版本的训练一帧需大约 1 秒优化到了 0.15 秒(配置:win8,i5-6200U,GeForce-940M,batch-size=32)。
用户1386409
2019/06/06
7420
PaddlePaddle版Flappy-Bird—使用DQN算法实现游戏智能
童年游戏大回顾:飞机大战
记得小学时,每逢放学便会打开电视机,接上红白机/小霸王,插上一张游戏卡带,魂斗罗、超级玛丽、冒险岛、足球小将
不惑
2024/02/27
6084
童年游戏大回顾:飞机大战
强化学习Double DQN方法玩雅达利Breakout游戏完整实现代码与评估pytorch
Breakout是一款经典的雅达利游戏,也就是我们所熟知的“打砖块”。玩家需要左右移动在屏幕下方的短平板子将一颗不断弹跳的小球反弹回屏幕上方,使其将一块块矩形砖块组成的六行砖块墙面打碎,并防止小球从屏幕底部掉落。在Atari 2600版本的Breakout中,玩家共有5次小球掉落机会,一旦用完就标志游戏结束,每打掉一块砖块得1分,全部打掉则游戏胜利结束。
Ranlychan
2024/01/10
1.1K0
内部分享:这篇文章教你如何用神经网络破Flappy Bird记录
AI科技评论按:本文作者杨浩,原文载于作者个人博客。 以下内容来源于一次部门内部的分享,主要针对 AI 初学者,介绍包括 CNN、Deep Q Network 以及 TensorFlow 平台等内容。由于笔者并非深度学习算法研究者,因此以下更多从应用的角度对整个系统进行介绍,而不会进行详细的公式推导。 关于 Flappy Bird Flappy Bird(非官方译名:笨鸟先飞)是一款 2013 年鸟飞类游戏,由越南河内独立游戏开发者阮哈东(Dong Nguyen)开发,另一个独立游戏开发商 GEARS
AI科技评论
2018/03/13
1.1K0
内部分享:这篇文章教你如何用神经网络破Flappy Bird记录
使用cursor完成飞机大战
在这篇文章中,我们将使用 Pygame 库创建一个简单的经典射击游戏——《飞机大战》。该游戏具有多个功能,包括玩家飞机、敌机、子弹、道具、Boss 战斗等元素。游戏逻辑相对简单,但却能为新手提供良好的学习案例,帮助理解如何使用 Pygame 开发2D游戏。
远方2.0
2025/01/02
2470
使用cursor完成飞机大战
Python 游戏编程之实现飞机大战(含源代码)
第一次接触打飞机的时候作者本人是身心愉悦的,因为周边的朋友都在打飞机, 每次都会下意识彼此较量一下,看谁打得更好。打飞机也是需要有一定的技巧的,熟练的朋友一把能打上半个小时,生疏的则三五分钟就败下阵来。
吾非同
2020/11/23
21.5K0
Python 游戏编程之实现飞机大战(含源代码)
10分钟教你用Python做个打飞机小游戏超详细教程
这次还是用python的pygame库来做的游戏。关于这个库的内容,读者可以上网了解一下。本文只讲解用到的知识。代码参考自网上,自己也做了一点代码简化。尽量把最核心的方面用最简单的方式呈现给大家,让大家尽快掌握这个游戏的框架。至于那些华丽的功能,大家在弄懂了核心知识以后,再去添加也是非常easy的。
短短的路走走停停
2019/05/14
3K0
基于Python的飞机大战复现
本游戏是一款使用Python和Pygame库开发的飞机大战游戏。玩家操控飞机,通过发射子弹击落敌机来获取分数,同时需要躲避敌机的碰撞。游戏具有开始界面、游戏界面和结束界面,还包括计分、生命值管理、敌机生成等功能。原文链接
Srlua
2024/11/27
3570
基于Python的飞机大战复现
实战项目:飞机大战
运行程序,英雄飞机出现在屏幕底边的中央区域,飞机中央每隔一秒会自动发射一枚子弹。随着游戏的开始,敌机会在屏幕上方随机不定时的出现在屏幕内向下飞行。英雄飞机需要通过移位躲避敌机或用子弹消灭敌机,避免碰撞导致游戏结束。
佛系编程人
2020/02/25
2.1K0
用 Python 制作飞机大战小游戏
这次用Python中的pygame模块来完成一个飞机大战的小游戏;基本思路是通过方向键来控制飞机的左右移动射击飞船。先来看下最后的效果
龙哥
2020/10/09
4.5K0
用 Python 制作飞机大战小游戏
深度强化学习之:PPO训练红白机1942
本公众号MyEncyclopedia定期发布AI,算法,工程类深度和前沿文章。欢迎关注,收藏和点赞。本系列将从原理和代码来循序渐进讲解强化深度学习。
godweiyang
2021/04/08
2.3K0
深度强化学习之:PPO训练红白机1942
python实现微信小游戏“飞机大战”
以前版本的微信小游戏有一个飞机大战的游戏,学完python之后我试着写了下程序去基本实现这个游戏的部分功能,下面是小游戏飞机大战的python代码
墨明棋妙27
2022/08/24
1.3K0
python实现微信小游戏“飞机大战”
东北大学研究生:用强化学习玩Chrome里的恐龙小游戏
【人工智能头条导读】Chrome 浏览器里面有一个小彩蛋,当你没有网络时,打开任意的 URL 都会出现一个恐龙小游戏(Dino Run),按空格键就可以跳跃。当然,直接打开 chrome://dino 也可以玩这个小游戏。近期,一名来自东北大学(美国)的研究生 Ravi Munde 利用强化学习,实现了对 Dino Run 的控制。 以下内容来自 Ravi Munde 博客,人工智能头条编译: 本文将从强化学习的基础开始,并详细介绍以下几个步骤: 在浏览器(JavaScript)和模型(Python)之间
用户1737318
2018/06/05
8580
类实例:飞机大战
一、子弹模块 import pygame WINDOW_WIDTH = 512 # 根据实际需求调整窗口大小 WINDOW_HEIGHT = 768 class Bullet(object): def __init__(self): # 图片,矩形对象,速度 self.bullet_img = pygame.image.load('res/bullet_11.png') # 资源文件自己选择 self.en
汪凡
2018/05/29
7690
Python实战小游戏飞机大战详解
本文是写的游戏代码,基于Pygame的源码项目,这里是自己写的飞机大战的1.0版本,比较简陋。
python学习教程
2021/11/11
8510
Python实战小游戏飞机大战详解
深度强化学习(DQN-Deep Q Network)之应用-Flappy Bird
本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/10811587.html
用户7225427
2020/09/03
1.9K0
深度强化学习(DQN-Deep Q Network)之应用-Flappy Bird
深度学习算法(第37期)----如何用强化学习玩游戏?
上期我们一起学习了强化学习中的时间差分学习和近似Q学习的相关知识, 深度学习算法(第36期)----强化学习之时间差分学习与近似Q学习 今天我们一起用毕生所学来训练一个玩游戏的AI智能体。
智能算法
2019/12/04
1.1K0
推荐阅读
相关推荐
强化学习系列案例 | 训练智能体玩Flappy Bird游戏
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档