『贪吃蛇』AI 算法简易实现(中秋特别版)

前言

gettyimages-1276389470-64e48088aa123

一年一度的中秋节就快到了,平台也有各种各样的中秋发文活动,正在翻阅时偶然间我看到了这篇文章:《兔饼大作战》:吃月饼、见月亮,还能咬自己?| 欢庆中秋特制版 - 掘金 (juejin.cn)

大家肯定比较熟悉了,这个游戏的内核就是贪吃蛇,作者也是对玩法做了很多调整,趣味性十足,同时加入兔饼、月亮等元素增加节日氛围,可以说创意性十足

于是我就想可不可以针对这个游戏进行其他方面的创新,比如针对贪吃蛇 AI 算法进行探索和改进,下面就是算法训练的最终效果

6caf23a2-8b9b-4a69-8b39-1b1bd224da55

注:博主能力有限,因此本文剔除掉了上面文章中添加的难度提升、增添元素等游戏设置,只保留贪吃蛇最基本的游戏架构,后期可能会调整

深度强化学习

前言

我们可以使用深度强化学习(Deep Reinforcement Learning,Deep RL)算法,也可以使用贝叶斯优化(Bayesian Optimization)来优化深度强化学习算法

强化学习:机器学习的分支,相较于机器学习经典的有监督学习、无监督学习问题,强化学习最大的特点是在交互中学习(Learning from Interaction)。Agent 在与环境的交互中根据获得的奖励或惩罚不断的学习知识,更加适应环境。RL学习的范式非常类似于我们人类学习知识的过程,也正因此,RL 被视为实现通用 AI 重要途径。

贝叶斯优化:用于优化黑盒函数的方法,它通过在搜索空间中选择最有可能包含全局最优解的点来逐步改进模型。核心思想是结合贝叶斯统计和高斯过程回归

我们所熟知的 AlphaGo 就是基于深度强化学习进行训练的,核心过程是使用蒙特卡洛树搜索(Monte Carlo tree search),借助估值网络(value network)与走棋网络(policy network)这两种深度神经网络,通过估值网络来评估大量选点,并通过走棋网络选择落点。其余的算法应用包括广告推荐、对话系统、机器人工程等,此处不赘述

形式化定义强化学习问题最常用的表示方式是马尔科夫决策过程。这就引出我们的最终游戏 AI 算法 —— Deep Q-Learning(DQN)算法,DQN 是深度强化学习的一种具体实现方式

游戏定义

snake

snake 是一条线,当吃到食物时会增加得分以及 snake 的长度,当 snake 撞墙或撞到自己时,游戏结束得分就是游戏者所吃食物的数量,因为 snake 的大小会随着所吃食物的增加而边长,因此到后期游戏会越来越难,玩家的目标是在不结束游戏的情况下让蛇吃尽可能多的食物。

环境与状态空间

snake 游戏的环境可以用 n×n 的矩阵表示。矩阵中的每个 cell 可用 l×l 表示,为此状态空间的维度s∈(n×n×l×l),为了使游戏简单,直接忽略 l×l ,为此状态空间可用s∈n×n表示(仍然是指数增长)。

动作空间

对于 snake,只能采取四种动作up, down, left, right

为了加速训练以及减少向后碰撞,可以将动作简化为:straight, clockwise turn, counter-clockwise turn

这种方式表示动作是有益的,因为当 agent “探索”并随机选择一个动作时,它不会180度地改变自己。

正负奖励

游戏的主要奖励是当 snake 吃了食物并增加它的分数。因此,奖励直接与游戏的最终分数挂钩,这与人类判断奖励的方式类似。

有了其他积极的奖励,智能体可能会无限循环,或者学会完全避免食物以最小化 snake 长度。

此外,加入了负面奖励,让 snake 获得更多关于其状态的信息:**碰撞检测(与自身或墙壁),循环(不鼓励无限循环),empty cell,以及离食物 close/mid/far/very_far (鼓励通往食物)**。

DQN网络定义

定义一个网络,其中输入层大小为11,用于定义 snake 的当前状态,隐藏层大小为256个节点,输出层大小为3,用于确定采取何种操作。下图是网络的一个可视化表示。

由于游戏是离散时间步长(帧),能够为游戏的每个新帧计算一个新状态。

状态参数定义为11个布尔值,这些值基于 snake 的移动方向,将危险的位置定义为下一帧中可能发生的碰撞,以及相对于 snake 的食物位置。

3个动作是 snake 相对于它面对的方向移动的方向:forward, left, right 。注意这里网络的输出是3个动作的Q估计值。

每个时间步的状态被传递给Q-Learning网络,网络对它认为的最佳行动做出预测。这些信息会同时保存在短期记忆和长期记忆中。从之前的状态中学到的所有信息都可以从记忆中提取出来,并传递给网络以继续训练过程。

NN

消融实验

Robert Long对消融研究(或消融实验)定义:通常用于神经网络,尤其是相对复杂的神经网络,如R-CNN。通过删除部分网络研究网络的性能来了解网络。

“消融”的原始含义是手术切除身体组织。“消融研究”这一术语的根源于20世纪60年代和70年代的实验心理学领域,其中动物的大脑部分被移除以研究其对其行为的影响。在机器学习,特别是复杂的深度神经网络的背景下,已经采用“消融研究”来描述去除网络的某些部分的过程,以便更好地理解网络的行为

可以简单理解为控制变量法

参考项目

maurock/snake-ga: AI Agent that learns how to play Snake with Deep Q-Learning (github.com)

sourenaKhanzadeh/snakeAi: Reinforcement Learning with the classic snake game (github.com)

这两个项目均是采用 DQN 算法,但是第一个仓库安装依赖有些问题,同时操作系统也不同,故采用第二个仓库(如果大家感兴趣的话也可以尝试下第一个项目)

# 创建环境
conda create -n snk-ai-py3.7 python=3.7
# 拉取代码
git clone git@github.com:sourenaKhanzadeh/snakeAi.git
# 安装依赖
pip install -r requirements.txt

最后运行代码

python python main.py

注意:博主使用的服务器是没有桌面的,直接使用的 SSH 连接,对于如何使用 SSH 连接来传输 GUI 画面可以参考博主往期文章(VSCode『SSH』连接服务器『GUI界面』传输)

遗传算法

参考项目:Ackeraa/snake: Snake AI with Genetic algorithm and Neural network (github.com)

注:父级参考项目:Chrispresso/SnakeAI (github.com)

两个项目差别不大,可以直接使用父级参考项目,本次使用子项目演示,原理是使用遗传算法和简单神经网络的方式实现贪吃蛇寻路算法

快速开始

git clone git@github.com:Ackeraa/snake.git
pip install -r requirements.txt
# 无画面训练(推荐)
python main.py
# 有画面训练
python main.py -s

可以直接调节 settings.py中的参数,其中 FPS训练时可以调大,训练更快,展示的时候调小,便于展示

# 训练
FPS = 1000
# 展示
FPS = 8

这里不浪费时间从头训练,而是直接使用训练好的 genes ,方便展示

python main.py -i -s

如果您想要从头训练,需要先执行如下命令删除权重文件再训练

rm -rf genes/best/*
rm -rf genes/best/*
rm -rf seed/*

效果演示

6caf23a2-8b9b-4a69-8b39-1b1bd224da55

最后补充

作者能力有限,没法讲解所有算法,这里提供一些仓库(亲测可用),大家可自行探索

哈密尔顿 / 贪心

仓库地址:chuyangliu/snake: Artificial intelligence for the Snake game. (github.com)

仓库简介:主要使用 Hamilton(哈密尔顿算法),Greedy(贪心算法),DQN 算法(实验性功能),同时实现了用户友好的GUI和算法实现的简单性

多层感知机 / 卷积神经网络

仓库地址:snake-ai/README_CN.md at master · linyiLYi/snake-ai (github.com)

仓库简介:本项目为林亦大佬开发,B 站上也有介绍视频,有兴趣的小伙伴可以跳转到此,本项目是经典游戏《贪吃蛇》的程序脚本以及可以自动进行游戏的人工智能代理。该智能代理基于深度强化学习进行训练,包括两个版本:基于多层感知机(Multi-Layer Perceptron)的代理和基于卷积神经网络(Convolution Neural Network)的代理,其中后者的平均游戏分数更高。

注意:林亦大佬的这个项目适配 Windows 和 Mac 系统,请注意使用

神经网络 + 遗传算法

仓库地址:greerviau/SnakeAI: Train a Neural Network to play Snake using a Genetic Algorithm (github.com)

参考链接

greerviau/SnakeAI: Train a Neural Network to play Snake using a Genetic Algorithm (github.com)

snake-ai/README_CN.md at master · linyiLYi/snake-ai (github.com)

chuyangliu/snake: Artificial intelligence for the Snake game. (github.com)

maurock/snake-ga: AI Agent that learns how to play Snake with Deep Q-Learning (github.com)

深度学习与CV教程(17) | 深度强化学习 (马尔可夫决策过程,Q-Learning,DQN) (showmeai.tech)

【强化学习】基于DQN实现贪吃蛇(pytorch版) - 知乎 (zhihu.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/137642.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python处理CSV文件

CSV库还有其他处理CSV的方法,这里只是介绍几个常用的,后面如果用到别的会进行更新 目录 1 生成一个新的csv文件,并向其中写一点东西 2 单纯往里面写几行 3 读取csv文件 1 生成一个新的csv文件,并向其中写一点东西 import…

Mybatis学习笔记11 缓存相关

Mybatis学习笔记10 高级映射及延迟加载_biubiubiu0706的博客-CSDN博客 缓存:cache 缓存的作用:通过减少IO的方式,来提高程序的执行效率 Mybatis的缓存:将select语句的查询结果放到缓存(内存)当中,下一次还是这条select语句的话,直接从缓存中取,不再查数据库.一方面是减少了I…

vision transformer

一、网络构建 import torch from torch import nn from functools import partial# --------------------------------------- # # (1)patch embeddingimg_size224 : 输入图像的宽高 patch_size16 : 每个patch的宽高,也是卷积核的…

zabbix监控nginx

目录 一、实验准备 二、监控nginx 一、实验准备 zabbix-sever(192.168.115.4) zabbix-agent(192.168.115.5) 添加监控对象 二、监控nginx 安装NGINX在192.168.115.5上安装NGINX,开启status模块 yum -y install ep…

uniapp:OCR识别身份证上传原图失败,问题解决

1、上传普通图片成功 2、上传>4M | >5M图片失败检查&#xff1a;1、uni.uploadFile自身没有文件大小限制。然而&#xff0c;这仍然取决于你的应用程序所在的平台和存储空间容量。 2、上传照片后不在fail&#xff0c;在sucess 提交照片-3 {"data": "<h…

yolov5自动训练/预测-小白教程

文章目录 引言一、配置参数设置1、数据参数配置2、模型训练参数配置3、模型预测参数配置 二、一键训练/预测的sh介绍1、训练sh文件(train.sh)介绍2、预测sh文件(detect.sh)介绍 三、本文训练main代码解读1、训练main函数解读2、数据加工与参数替换 四、本文预测main代码解读1、…

单片机内存管理

源码说明 源码包含memory.h 和 memory.c 两个文件&#xff08;嵌入式C/C代码的“标配”&#xff09;&#xff0c;其源码中包含重要的注释。 memory.h文件包含结构体等定义&#xff0c;函数API申明等&#xff1b; memory.c文件是实现内存管理相关API函数的原型。 memory.h …

相机HAL

相机HAL 1、概览实现 HAL2、相机 HAL2.1 AIDL 相机 HAL2.2 相机 HAL3 功能2.3 Camera HAL1 概览 相机 HAL 相机 实现 HAL android12-release 1、概览实现 HAL HAL 位于 相机驱动程序 和 更高级别的 Android 框架 之间&#xff0c;它定义您必须实现的接口&#xff0c;以便应用…

城市管网污水监测方案,科技助力污水排放管理!

根据《国务院办公厅关于加强入河入海排污口监督管理工作的实施意见》各地要明确“水污染&#xff0c;谁治理”和政府兜底的原则&#xff0c;明确排污主体责任。根据排污口类型集中整治&#xff0c;划分主体。加大私设暗管借道排污的监察力度溯源主体责任。加强科技研发&#xf…

Java实现添加文字水印、图片水印功能实战

Java实现添加文字水印、图片水印功能实战 本文介绍java实现在图片上加文字水印的方法&#xff0c;水印可以是图片或者文字&#xff0c;操作方便。 java实现给图片添加水印实现步骤&#xff1a; 获取原图片对象信息&#xff08;本地图片或网络图片&#xff09;添加水印&#…

9月20日作业

时钟代码&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPainter> #include <QPaintEvent> #include <QTime> #include <QTimer> #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { class W…

初识canvas

对于一个前端人员来说&#xff0c;canvas是必须掌握的技能之一。如果你想像画画一样在浏览器上作画&#xff0c;那么canvas就可以做你的画布。 接下啦我们就以画画的标准来初步认识下canvas 1.画布 画画的第一步你得有一张画纸或者画布&#xff0c;canvas标签就是我们的画布…

中华崛起,科技强国!这三款充满科技风的科技模板,一起来探索吧

最近是不是都被华为mate60和苹果15刷屏了啊 &#xff0c;在我们的生活中&#xff0c;科技有着千变万化的面貌。它让我们的世界变得越来越小&#xff0c;让我们的生活越来越便捷。它使我们的梦想成为现实&#xff0c;使我们的思想得以落地。它打开了新的视野&#xff0c;为我们提…

grafana对指标进行组合计算

在使用Grafana配置图表看板时&#xff0c;我们可能需要对多个查询条件筛选出来的结果进行计算&#xff0c;把计算结果生成最终的图表。此时需要用到transform功能【add field from calculation】&#xff1a;

keytool工具生成JKS证书

生成证书 使用jdk keytool生成证书 自建证书不受CA信任&#xff0c;仅适合学习使用&#xff0c;如果需要用到服务中&#xff0c;建议使用由CA颁发的可信证书。如果仅是内部使用&#xff0c;也可以安装自己生成的证书到本机。 生成证书 keytool -genkey -alias jwt -keyalg RS…

【linux基础(七)】Linux中的开发工具(下)--make/makefile和git

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到开通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux中的开发工具 1. 前言2.…

重装系统(配置环境)

这里写目录标题 0.重装系统1.python1.1 anaconda1.2 pycharm1.3 深度学习环境配置 2.java2.1.安装JDK2.2.配置JDK环境变量2.3IDEA2.4 Maven 3.大数据3.1 虚拟机3.2 Hadoop平台3.3 存储3.4 采集3.5 计算3.6 查询3.7 可视化 0.重装系统 // An highlighted block var foo bar;1.…

SpringBoot 的版本、打包、Maven

一、SpringBoot 结构、集成 1.1、集成组件 Spring Core&#xff1a;Spring的核心组件&#xff0c;提供IOC、AOP等基础功能&#xff0c;是Spring全家桶的基础。 Spring Boot&#xff1a;一个基于Spring Framework的快速开发框架&#xff0c;可以快速创建独立的、生产级别的…

pnpm入门教程

一、概述 1、更小 使用 npm 时&#xff0c;依赖每次被不同的项目使用&#xff0c;都会重复安装一次。 而在使用 pnpm 时&#xff0c;依赖会被存储在内容可寻址的存储中。 2、更快 依赖解析。 仓库中没有的依赖都被识别并获取到仓库。目录结构计算。 node_modules 目录结构是…

Vue3快速上手

1.Vue3简介 2020年9月18日&#xff0c;Vue.js发布3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;海贼王&#xff09;耗时2年多、2600次提交、30个RFC、600次PR、99位贡献者github上的tags地址&#xff1a;Release v3.0.0 One Piece vuejs/core GitHub 2.Vue3带…