使用强化学习快速让AI学会玩贪食蛇游戏(轻量级二十分钟训练+代码)
如何让AI玩会贪食蛇,甚至比你厉害
- 概述
- 构建问题(强化学习求解的一般步骤)
- 环境
- 动作定义
- 状态定义
- 奖励设计
- 训练奖励值收敛图
- 采用第4种状态定义方法
- 初步训练效果
- 最终训练效果
- 模型泛化迁移能力
- 代码
概述
- 所用技术:强化学习(Deep Reinforcement Learning),属于一种无监督学习,利用奖励rewardrewardreward教会智能体AgentAgentAgent在合适的场景做合适的决策。
- 采用算法:试过两种算法D3QN和离散版本的PPO算法,最终采用离散版本PPO算法+GAE(PPO是我用过的性能最好的算法之一)
- 编程语言与深度学习框架:Python3.8 + torch
构建问题(强化学习求解的一般步骤)
环境
贪食蛇的环境参考了https://www.cnblogs.com/dengfaheng/p/9241267.html,在其基础上进行改动和封装,写成了符合强化学习标准的环境接口,满足如下最基本操作:
.step(action)
,即对环境执行动作。.reset()
,重置环境。.render()
,渲染图像,可视化训练。
窗口设定为600*600像素,其中50*50像素格为一个单元,即整个游戏场景为12*12方格(也可以设置大,训练难度和时间会相应非线性增加)。
食物:一个单元尺寸大小。
贪食蛇:n个单元构成(n为当前贪食蛇长度)
动作定义
对于贪食蛇定义动作如下:
Action∈{0,1,2,3}Action\in \{0,1,2,3\}Action∈{0,1,2,3}
分别代表上下左右移动蛇头。其实更合理的是三个方向,因为蛇不能倒退,但是DRL对这个bug还是有忍耐度的。
状态定义
这个问题我试了很多种:
- 将游戏当前帧作为RGB图像(或者二值化图像),用卷积网络提取特征,这里图像就是强化学习的state。结果发现不可行,其一是网络参数因卷积而增加,而Actor网络是需要有快速回归能力的,其二是图像必须resize,太大了训练慢,太小了特征不明显(蛇都糊了…)。
- 将12*12的界面当成12*12的矩阵,其中蛇头位置取2,蛇身位置取1,食物位置取-1,其余位置取0,然后把这个矩阵要么当图像用卷积,要么直接flatten为向量作为特征。结果发现效果比较差,向量维度太大,强化学习难以学习到策略。
- 将当前蛇头和食物的相对x坐标和y坐标作为state,实验发现效果还行,但是由于state中没有蛇的身子的信息和游戏边界的信息,蛇很容易自杀。
- 蛇头和食物的相对x坐标和y坐标,蛇头上、下、左、右是否有自身身体或者游戏边界作为state,效果很好,训练后AI超过普通玩家水平:
state=[xfood−xhead,yfood−yhead,k1,k2,k3,k4],ki∈{0,1}state=[x_{food}-x_{head},y_{food}-y_{head},k_1,k_2,k_3,k_4],k_i \in\{0,1\}state=[xfood−xhead,yfood−yhead,k1,k2,k3,k4],ki∈{0,1}
其中当ki=1k_i=1ki=1时表明蛇头的第iii个方向上存在障碍,另外xfood−xhead,yfood−yheadx_{food}-x_{head},y_{food}-y_{head}xfood−xhead,yfood−yhead最好归一化。
目前暂时使用第四种方案。
奖励设计
奖励是强化学习的灵魂,常起画龙点睛之作用。
- 初始化
reward=0
; - 如果当前state蛇吃到了食物,
reward+=2
- 计算蛇头和食物的距离d,如果d<t,则
reward += (t-d)/t
(这里t取一个小正数即可比如2); - 如果当前state蛇自杀,
reward -= 0.5
;
其中第3条可以引导贪食蛇找食物,否则可能由于稀疏奖励导致训练出一个只会“苟且偷生”的蛇,但是如果你的算法性能够好,第三条可以不要。
训练奖励值收敛图
采用第4种状态定义方法
家用电脑半小时内训练完毕(横轴游戏训练回合数,纵轴累计奖励回报值):
初步训练效果
下面这张图是初步训练的策略,其实挺像我小时候玩这个游戏时到后期的做法,但最后太长了它也没想到把自己堵死了…
最终训练效果
经过一系列优化,得到了一个较为满意的策略:
可以看到贪食蛇是会躲避自己的身体的!并且有自己的路径规划策略!
模型泛化迁移能力
在小尺寸地图上训练好的模型可直接迁移到大尺寸地图策略依旧可行:
代码
整个项目的所有代码和中间结果甚至是权重均已push到github,欢迎star/fork,你的星星是对我最大的帮助:
DRL4SnakeGame:一个使用强化学习快速让AI学会玩贪食蛇游戏的项目
what you need to do is to run the main.py and then run the env4Snake to test your model!
这个项目还有很多改进的点,会不时更新~
使用强化学习快速让AI学会玩贪食蛇游戏(轻量级二十分钟训练+代码)相关推荐
- 强化学习与ChatGPT:快速让AI学会玩贪食蛇游戏!
大家好,我是千寻哥,现在自动驾驶很火热,其实自动驾驶是一个很大的概念,主要涉及的领域包括强化学习以及计算机视觉. 今天给各位讲讲强化学习的入门知识,并且手把手和大家一起做一个强化学习的Demo. 一. ...
- 基于强化学习的质量AI在淘系互动业务的实践之路
导读:AI人工智能的概念由来已久,因为alphago在围棋领域击败李世石掀起了全世界范围内的AI热潮,最近又随着DeepMind破解蛋白质折叠难题这一诺奖级成果再次让我们发现AI已经进化到了如此强大的 ...
- linux终端贪吃蛇,分享|nSnake: 在Linux的终端上玩经典的贪食蛇游戏
你知道20世纪末的那些古老的诺基亚手机上最棒的东西是什么吗? 贪食蛇! 我以前在这个看似无聊但却让人上瘾的游戏上花费了大把的时间.在古老的诺基亚手机被智能手机取代的同时,贪食蛇也被另外的无聊但却令人上 ...
- 杀疯了!通过游戏“元宇宙”,Deepmind让AI学会玩各种没玩过的游戏,骚操作不断...
来源:大数据文摘本文约1800字,建议阅读7分钟 面对任务一看就会的AI,离我们心里的通用人工智能还有多远呢? 对于AI来说,完成一个单一任务或许相对简单,但是涉及到合作和博弈时,AI往往显得有些愚蠢 ...
- OpenAI透露GPT-4动向:文本与视觉融合,人类反馈+强化学习解决安全问题 | AI日报...
图灵奖得主JudeaPearl联手21名学者发表公开信,要求重塑学术界「言论自由」 科学需要「自由」吗?至少,以图灵奖得主Judea Pearl,国际机器学习协会的联合创始人之一Pedro Domin ...
- AlphaZero炼成最强通用棋类AI,DeepMind强化学习算法8小时完爆人类棋类游戏
[新智元导读]或许"智能爆炸"不会发生,但永远不要低估人工智能的发展.推出最强围棋AI AlphaGo Zero不到50天,DeepMind又一次超越了他们自己,也刷新了世人对人工 ...
- 【重磅】AlphaZero炼成最强通用棋类AI,DeepMind强化学习算法8小时完爆人类棋类游戏...
2019独角兽企业重金招聘Python工程师标准>>> 世界最强围棋AI AlphaGo Zero带给世人的震撼并没有想象中那么久--不是因为大家都去看谁(没)跟谁吃饭了,而是Dee ...
- 【重磅】AlphaZero炼成最强通用棋类AI,DeepMind强化学习算法8小时完爆人类棋类游戏
世界最强围棋AI AlphaGo Zero带给世人的震撼并没有想象中那么久--不是因为大家都去看谁(没)跟谁吃饭了,而是DeepMind再次迅速超越了他们自己,超越了我们剩下所有人的想象. 12月5日 ...
- 深度强化学习 | 用TensorFlow构建你的第一个游戏AI
今天,你AI了没? 关注:决策智能与机器学习,每天学点AI干货 正文共:2157字 6图 预计阅读时间: 5分钟 DeepMind 的 AlphaGo 以 4-1 的比分打败了世界围棋冠军李世乭.超过 ...
最新文章
- php 经纬度 摩卡 转换,WGS84经纬度坐标与WEB摩卡托坐标转换
- 特征值与特征向量的几何含义(转)
- 再说TCP神奇的40ms
- 【重复制造精讲】定义重复制造参数文件
- Python 数据分析三剑客之 Pandas(十):数据读写
- 利用python进行数据分析第一版和第二版区别_《利用Python进行数据分析·第2版》第1章 准备工作...
- 频繁gc是什么意思_[JVM]一次线上频繁GC的问题解决
- SAP License:FI学习笔记
- ★★停止动画和停止所有动画$(selector).stop() 详解
- 抖音autojs 云控脚本源码
- java判断天数_Java判断两个日期相差天数的方法
- 计算机网络白龙飞,成电等你来 | 你的辅导员已上线,男神辅导员闪亮登场(一)...
- 安装win10 ltsc应用商店
- antd菜单使用动态图标
- Open3d-Point cloud (点云)
- 【MySQL进阶】MySQL事务隔离与锁机制底层原理万字总结(建议收藏!!)
- 高数(下)——平面及其方程
- Vijos P1153 猫狗大战(动态规划,背包)
- 线性代数(第六版)同济大学 习题一 (5-6题)个人解答
- java fix sence_repair fix mend的区别