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

news2025/2/26 22:03:25

前言

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.coloradmin.cn/o/1027311.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

XML文件序列化读取

原始XML文件 <?xml version"1.0" encoding"utf-8" ?> <School headmaster"王校长"><Grade grade"12" teacher"张老师"><Student name"小米" age"18"/><Student name&quo…

重装系统(配置环境)

这里写目录标题 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.…

Python爬虫(二十一)_Selenium与PhantomJS

本章将介绍使用Selenium和PhantomJS两种工具用来加载动态数据&#xff0c;更多内容请参考&#xff1a;Python学习指南 Selenium Selenium是一个Web的自动化测试工具&#xff0c;最初是为网站自动化测试而开发的&#xff0c;最初是为网站自动化测试而开发的&#xff0c;类型像我…

数据包络分析(DEA)——CCR模型

写在前面&#xff1a; 博主本人大学期间参加数学建模竞赛十多余次&#xff0c;获奖等级均在二等奖以上。为了让更多学生在数学建模这条路上少走弯路&#xff0c;故将数学建模常用数学模型算法汇聚于此专栏&#xff0c;希望能够对要参加数学建模比赛的同学们有所帮助。 目录 1. …

单元测试spring-boot-starter-test

参考博客&#xff1a; https://www.cnblogs.com/mzc1997/p/14306538.html 配置pom junit-vintage-engine junit4 junit-jupiter-engine junit5 排除junit4使用junit5,两者在切换时要特别注意 <dependency><groupId>org.springframework.boot</groupId><…

惯性动捕+数据手套,让“虚拟”触手可及

当今&#xff0c;虚拟现实技术已经从科幻电影走进现实生活。在数字化时代&#xff0c;惯性动作捕捉系统与数据手套的结合使用&#xff0c;带给我们全新的虚拟互动体验&#xff0c;使虚拟世界更能够“触手可及”。 01 惯性动作捕捉系统 FOHEART MAGIC是一款高性能的惯性动作捕…

windows 安装Linux子系统 Ubuntu 并配置python3

环境说明&#xff1a; Windows 11 Ubuntu 20.04.6 安装步骤以及问题&#xff1a; 1、开启Windows Subsystem for Linux dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart 2、开启虚拟机特性 dism.exe /online /enabl…

【Linux】常用工具(下)

Linux常用工具 一、Linux 项目自动化构建工具 - make/Makefile1. 依赖关系和依赖方法2. 伪目标3. make/Makefile 具有依赖性的推导能力&#xff08;语法扩展&#xff09;4. 编写一个进度条代码&#xff08;1&#xff09;缓冲区&#xff08;2&#xff09;\n 和 \r&#xff08;3&…

一句话设计模式12:适配器模式

适配器模式: 继承原对象,持有目标对象; 文章目录 适配器模式: 继承原对象,持有目标对象;前言一、适配器模式的作用二、如何适配器模式直接上代码 总结 前言 适配器模式一般使用场景是: 将一个类(接口)转换成客户希望的另外一个类(接口)。其中适配器充当一个假的原类的作用; 一…

读高性能MySQL(第4版)笔记12_查询性能优化(下)

1. “快速、精确和实现简单” 1.1. 三者永远只能满足其二&#xff0c;必须舍掉一个 2. 排序优化 2.1. 无论如何排序都是一个成本很高的操作&#xff0c;所以从性能角度考虑&#xff0c;应尽可能避免排序或者尽可能避免对大量数据进行排序 2.2. 文件排序&#xff08;filesor…

数组和指针笔试题解析之【指针】

目录 &#x1f342;笔试题1&#xff1a; &#x1f342;笔试题2&#xff1a; &#x1f342;笔试题3&#xff1a; &#x1f342;笔试题4&#xff1a; &#x1f342;笔试题5&#xff1a; &#x1f342;笔试题6&#xff1a; &#x1f342;笔试题7&#xff1a; &#x1f342;笔试题…

实施主品牌进化战略(一):确立主品牌进化架构

主品牌进化战略&#xff0c;即以主品牌为核心创造、巩固、转化竞争优势应对竞争环境变化&#xff0c;避免衰退&#xff0c;回归增长&#xff0c;让主品牌进化的方法论体系。主品牌进化战略制定要从 4 个方面出发&#xff1a;确立主品牌进化架构、更新和明确主品牌竞争方向、建立…

Java高级-注解

注解 1.介绍2.元注解3.注解的解析4.注解的应用场景 1.介绍 注解 Annotation 就是Java代码里的特殊标记&#xff0c;作用是让其他程序根据注解信息来决定什么是执行该程序注解&#xff1a;注解可以在类上、构造器上、方法上、成员变量上、参数上等位置 自定义注解 /*** 自定…

【产品经理】深入B端SaaS产品设计核心理念

这几年各企业的B端业务都在做SaaS平台&#xff0c;但对SaaS的了解还不是完全全面&#xff0c;对于一些产品的定位以及设计还在探索中 本文讨论“为什么采用SaaS模式”、“SaaS产品有哪些”以及“如何做好SaaS产品设计”三个话题&#xff0c;核心是产品设计&#xff0c;主要从需…

Qt5开发及实例V2.0-第九章-Qt文件及磁盘处理

Qt5开发及实例V2.0-第九章-Qt文件及磁盘处理 第9章 Qt 5文件及磁盘处理9.1 读写文本文件9.1.1 QFile类读写文本9.1.2 QTextStream类读写文本 9.2 读写二进制文件9.3 目录操作与文件系统9.3.1 文件大小及路径获取实例9.3.2 文件系统浏览 9.4 获取文件信息9.5 监视文件和目录变化…

由于数字化转型对集成和扩展性的要求,定制化需求难以满足,百数低代码服务商该如何破局?

当政策、技术环境的日益成熟&#xff0c;数字化转型逐步成为企业发展的必选项&#xff0c;企业数字化转型不再是一道选择题&#xff0c;而是决定其生存发展的必由之路。通过数字化转型升级生产方式、管理模式和组织形式&#xff0c;激发内生动力&#xff0c;成为企业顺应时代变…

Nacos服务列表有服务,但是配置列表不起作用。

目录 bug现场解决思路POM文件启动日志排查完整pom文件nacos配置中心部署流程 想要重新再写一下springcloud alibaba 的组件配置&#xff0c;再另一个服务renren-product引入&#xff0c;nacos的注册发现和配置中心。前面都很顺利但是修改配置中心配置的时候不起作用&#xff01…

Spring Boot实现对超大文件进行异步压缩下载

在Web应用中&#xff0c;文件下载功能是一个常见的需求&#xff0c;特别是当你需要提供用户下载各种类型的文件时。本文将演示如何使用Spring Boot框架来实现一个简单而强大的文件下载功能。我们将创建一个RESTful API&#xff0c;通过该API&#xff0c;用户可以下载问价为ZIP压…

linux下CentOS安装mysql-5.7

linux下安装mysql只需要在root用户下安装&#xff0c;普通用户也能使用 1.检查&#xff1a; 通过以下两条命令查看改系统下是否已存在mysql。 ps ajx | grep mysql ps ajx | grep mariadb通过指令如果只显示如下两条信息&#xff0c;则当前系统下不存在MySQL。 就可以直接进…

蓝牙电话之HFP—电话音频

1 媒体音频&#xff1a; 播放蓝牙音乐的数据&#xff0c;这种音频对质量要求高&#xff0c;数据发送有重传机制&#xff0c;从而以l2cap的数据形式走ACL链路。编码方式有&#xff1a;SBC、AAC、APTX、APTX_HD、LDAC这五种编码方式&#xff0c;最基础的编码方式是SBC&#xff0…