聊聊强化学习:可自动玩游戏的AI技术,实战智能走迷宫案例我幼儿时期脑海中的人工智能,居然就是强化学习。它可以自动打游戏,

提到人工智能呀,大家普遍的认识,是应用在图像处理、文字生成这两类。其实,还有一个领域也挺有意思,那就是强化学习。

机器人AlphaGo打败人类围棋冠军这件事,就是强化学习的一个应用。除此之外,自动驾驶,自动游戏玩家,也是它的应用范畴。

为便于大家理解,举几个图例。

下面是机器狗学走路的例子。它一开始只能趔趔趄趄地站稳,1000次之后,能移动了。1800次之后,健步如飞。

下图是打砖块的游戏。这完全由机器人操作。它根据前4帧图像就可以判断出当前的形势,然后给出最佳行为。

下面这个,是强化学习经典的入门HelloWord。木板顶一跟棍子,棍子会随机倒下,你通过移动位置保持它不倒。

说白了,强化学习和马戏团训练狗熊类似。驯兽师会对狗熊的动作,给予奖励或者惩罚,让狗熊的行为按照趋利避害的方向发展,最后它就能走独木桥了。迁移到AI下棋的场景也是一样,如果下这一步棋能赢,那它就会依照能赢的方向进化。

说得这么玄乎,那具体如何实现呢?其实并不难。为此,我还写了个配套游戏来讲解。

如上图所示,话说有个古代人穿越到了现代。他很想快点回去结婚,不然新娘就改嫁了。因此,他得赶紧找到穿越之门。不过,寻门之路充满了艰辛。他需要吃鸡腿续命,也需要躲开雷电的伤害。

我通过强化学习,搞了自动玩这个游戏的算法。如下图所示,time是尝试次数,step表示走了多少步,reward表示得分,找到穿越之门可得100分。下图完全是机器自动操作。

到后面,随着地图复杂,他甚至可以自己学会吃鸡腿,躲避雷电,而且以最简路径找到大门。

下面,咱就连做带学,搞搞这个项目。经过这个项目,你可以了解强化学习中最基础的、入门级别的Q-Learning算法。

有游戏编程经验的朋友,可以直接略过这部分。没有基础的朋友,留下来看看。否则影响后面的理解。

我喜欢写游戏,我从2011年就写棋牌类游戏。我感觉,写游戏更考验编程逻辑能力。

比如,你把一个数组转化为地图。

比如下面这组数据。

game_map=[[1,1,1,1,1,1],[1,0,0,0,0,1],[1,0,0,0,0,1],[1,0,0,0,0,1],[1,1,1,1,1,1]]它是一个5行6列的二维数组。我们可以认为它就是个Excel表格。

如果用1表示围墙,0表示空地,那么你要做的,其实就是把数字换成图片。

fromtkinterimport*fromPILimportImageTk,Imagerows=len(game_map)#数组行数cols=len(game_map[0])#数组列数cell_size=48#一个格子的尺寸width=cell_size*cols#画面总宽度height=cell_size*rows#画面总高度defdraw(canvas,game_map):#白色幕布canvas.create_rectangle(0,0,width,height,fill="white")foryinrange(rows):#循环格子forxinrange(cols):v=game_map[y][x]#根据元素画出图形cell_x=x*cell_sizecell_y=y*cell_size#画出围墙ifv==1:canvas.create_image(cell_x,cell_y,anchor='nw',image=wall_img)root=Tk()wall=Image.open("wall.png")#加载一个围墙图片wall_img=ImageTk.PhotoImage(wall)canvas=Canvas(root,width=width,height=height)canvas.pack()draw(canvas,game_map)root.mainloop()如果用python实现,那就是上面的代码。其实,我用多种编程语言都写过,基本就是循环元素然后在画布上绘制。

结果如下:

而角色和道具的引入,其实是加一些定义。比如2代表人物,3代表鸡腿,4代表雷电,5代表大门。

##0空,1墙,2人,3鸡腿,4雷电,5穿越之门game_map=[[1,1,1,1,1,1],[1,2,0,3,0,1],[1,0,0,0,0,1],[1,0,4,0,5,1],[1,1,1,1,1,1]]反映到代码上,则是多一些if和else的判断。

你或许以为这没啥厉害的。实际上,只需要改一改数组,就可以让你大开眼界。

了解了吧,你花钱充的关卡和道具,只不过是人家捏造的数组。

那么,如果让人物动起来呢?

地图贯穿游戏的核心。人物在地图上走,其实也是改变数组中的元素。

人物元素所在的位置,可以用它在数组中的下标来表示。

##0空,1墙,2人game_map=[[1,1,1,1],[1,0,0,1],[1,2,0,1],[1,1,1,1]]在上面的地图中,人物2的坐标是p=game_map[2][1]也就是(2,1),表示第3行第2列。

如果人物要往上走,比如此时你按下了向上的方向键。表现在数据里,其实就是行的索引减去1,列的索引不变,变成下面这样。

##0空,1墙,2人game_map=[[1,1,1,1],[1,2,0,1],[1,0,0,1],[1,1,1,1]]这个变化,如果画出来,那就是游戏人物往上走了一格。其实,小数据量下,直接看数组也能看出来。

找到了目的地,或者吃了鸡腿、误入了雷电,这些如何判断与反馈呢?

##0空,1墙,2人,5门game_map=[[1,1,1,1],[1,2,5,1],[1,0,0,1],[1,1,1,1]]上面的数据中,5大门的位置我们是知道的,是(1,2)第2行的第3列。那么现在2人物位于(1,1),如果它往右走一步,就变成了(1,1+1),这样就和5大门重叠了,其实就是进入了大门。如果我们设置一个game_win游戏胜利的变量,此时可以将它置为true。

而吃到鸡腿、踏入雷区也是一样判断,只不过是给total_reward总奖励这个变量+10或者-20的区别。

说实话,我真的很想写游戏教程,很有意思。不过下面该讲人工智能啦。

针对上面的游戏,我们来编写强化学习算法流程。

在介绍强化学习之前,首先要讲几个基本概念。也就是术语啊,不懂术语不算入门。

我打算用一句话把几个概念说完,一说大家都懂。

强化学习,就是训练智能体(Agent)在环境(Environment)中,以奖励(Reward)为引导信号,让它可以基于当前状态(State)作出合理动作(Action)的一种策略(Policy)学习。

这一句话,在书里得讲好几个章节。我用一段话解释。

好了,了解完这些虚的概念,我们将思路迁移到代码。

本文要讲的Q-Learning强化学习算法,是一种计算方法,就像是3×7=21一样,它不依赖于任何框架,python环境即可。

首先,我们来建立一个类,这个类里面要有智能体的一些概念,比如环境、状态、动作等。

我们新建一个environment.py文件,这里面将包含那些元素与数据。

游戏中的环境,就是地图。为了便于学习,我们先准备一个简单的地图。

如下所示,这是一个5行6列的地图数组。一圈围墙,里面就一个人和一个门。

#1围墙,0空地,2人物,5目的地MAP=[[1,1,1,1,1,1],[1,2,0,0,0,1],[1,0,0,0,0,1],[1,0,0,5,0,1],[1,1,1,1,1,1]]为了便于低成本观察,我们搞一个很有意思的替换。现在很多图形文字可以在控制台打印了,我们将数字替换成图形字符。

vdict={0:"",1:"",2:"",3:"",4:"",5:""}str_map='\n'.join([''.join([vdict[i]foriinline])forlineinMAP])print("当前地图为:")print(str_map)这时再打印这个地图数据,就是下面这样:

哈哈,这样就很直观了。

在environment.py中,写一个EnvAgent类,算是智能体、环境的合集。里面包含很多信息。

classEnvAgent():def__init__(self):self.map=copy.deepcopy(MAP)#地图self.x=1#x坐标self.y=1#y坐标self.step=0#走了多少步self.total_reward=0#获得多少奖励self.is_end=False#游戏是否结束……其中,self.x和self.y就是智能体当前位置,我们把它初始化在(1,1)这个点,也就是左上角的位置。

除此之外,step是走了多少步,total_reward是获得多少奖励。

下面再来说一下动作。游戏里的人物有4个动作,分别是:向上、向下、向左、向右。

我们分别用0、1、2、3表示上下左右。人物往任意方向移动,会触发一些变化,代码如下:

DX=[-1,1,0,0]DY=[0,0,-1,1]classEnvAgent():……#根据指令,更新坐标,计算奖励definteract(self,action):assertself.is_endisFalsenew_x=self.x+DX[action]#新坐标new_y=self.y+DY[action]new_pos=self.map[new_x][new_y]self.step+=1reward=0ifnew_pos==1:#新位置是墙,保持原地,奖励0returnreward#其他区域可走,更新人物坐标self.x=new_xself.y=new_yifnew_pos==0:#新位置是空地reward=0elifnew_pos==5:#新位置是大门,更新坐标,奖励分数self.map[new_x][new_y]=0reward=100self.is_end=True#游戏结束self.total_reward+=rewardreturnreward……interact这个函数,作用是根据传来的action进行改变,并获取走这一步的收益值。

DX=[-1,1,0,0]和DY=[0,0,-1,1]巧妙地对应上、下、左、右的0、1、2、3。我们看,向上走action是0,那DX[0]=-1说明行的索引-1,DY[1]=0则表示列位置不变。同理,向右是3,DX[3]=0,DY[3]=1就是行不变,列向右移动1格。

移动完毕之后,获得一个新位置new_pos。然后对新位置进行判断。

这是基础的设置,算是最小闭环。如果你想要拓展,其实就是多加几个判断,例如遇到鸡腿加分,遇到闪电减分。

强化学习里的这个状态,我认为叫“局势”更为贴切。

这个游戏里面,刚开局时,人物距离大门很远,这是一种状态。人物和大门挨着,再走一步就胜利了,这也是一种状态。

两种状态下,同样是右移一格的动作,获得的奖励是不一样的。因此,脱离了环境的状态是没有意义的。这就是我觉得“局势”更贴切的原因。强化学习就是要在某种环境下,根据状态作出有最大奖励值的动作。

在这个游戏里面,有几种状态呢?

classEnvAgent():@propertydefstate_num(self):#状态数rows=len(self.map)cols=len(self.map[0])returnrows*cols@propertydefpresent_state(self):#当前的状态cols=len(self.map[0])returnself.x*cols+self.y……结论是有几个格子就有几种状态。要获取自己目前处于什么状态,计算一下当前的位置就可以了。

大家需要注意。这里的状态是一维数组。地图是5×6,而它的状态却需要用第29种状态来表示。

正常情况下,人物不会出现在围墙上。状态应该减去四面围墙,应该是(5-2)×(6-2)=12种状态。但实际上这对于结果影响不大,此处便于理解不做更细致处理。

到这里,准备工作就完成了。看我上面讲了那么多,其实就54行代码。

下面,就该强化学习上场啦。哈哈,整个项目,总共不超过100行代码。

我还是先上代码吧。新建一个qlearning.py文件,代码如下:

我们看到,一开始它四处乱撞,但是从第6次开始便可以稳定在4步内直捣黄龙。

如果代码能跑通,你可以自己设计一下地图,扩大一下面积,加点其他道具,让它探索试试。

虽然只有几十行代码,但这也可能是本文最烧脑的地方。它的核心原理就在这儿。

Q-Learning算法首先讲一个Q。我们看代码中有一个Q=np.zeros((e.state_num,4))。这里定义了一个全为0的矩阵。

这个矩阵的行数是状态数量,也就是5×6等于30个状态。列数是行为数量,就是上下左右4种行为。打印下来是这样的格式:

array([[0.,0.,0.,0.],[0.,0.,0.,0.],[0.,0.,0.,0.],……[0.,0.,0.,0.],[0.,0.,0.,0.]])它究竟想要干什么呢?

其实它是想穷举所有状态下,每种动作的预测收益得分。

如果我们能知道人生在每个路口往哪个方向走,能得多少分。那么我们就能以它为参考,作出一个高分选择。这个Q就是一张十字路口预测表。

上图所示,18号位置,往左走一步就胜利了,因此这个动作的得分是100。相对而言,如果往上走就远离目标了,预计会减分。这就是Q-Learning算法的核心。

那么重点来了,这里面的值是如何确定的呢?

还记得我们前面给智能体设置了个reward=e.interact(action),也就是走某一步返回得分。那是我们自己定义的,比如吃到鸡腿得10分,找到大门给100分。这种奖励是一次性的固定值,只针对某一步。状态16走到状态17进了大门,得100分。那从0开始到16这段距离就没有功劳吗?它得是连续更新才行。因此没法直接用这个reward,得处理一下。

看上面代码,Q[state,action]表示某个状态对于某一步的预测得分。知道了这个值,我们才能知道往哪个方向走最受益。它等于(1-ALPHA)*Q[state,action]+ALPHA*(reward+GAMMA*Q[new_state,:].max())。

ALPHA是学习率,前面定义为0.1。Q[new_state,:].max()表示在Q矩阵中选择这个新状态下得分最高的一项。这一项的得分,加上规则定义的得分reward。这俩加起来还不能全信,只信10%。另外90%我信上一个状态的功劳,没有前面就没有后面。GAMMA是衰减系数,它和预测新状态的最高分相乘,表示也不能全信。

抽离出来这里面的关键点就是Q[预测得分]=0.9*Q[旧状态]+0.1*Q[新状态]。这样做,整个链条的每一步,都会影响Q参考表,每一步都会向着得最高分去努力。

我的科普读者们,我知道你或许会有一丝儿听不懂。想要完全听懂,可能我还得再写这么一篇才行。你不用灰心,其他人也听不懂。如果你明白了一点,说明你很棒。

我们在每一次尝试后,打印Q的数值,格式如下:

[0.0.0.0.][0.0.0.0.081][0.2.520.0.]……[0.27.10.0.][0.0.0.0.]其实从数据可以看到,并不是只有进大门那一瞬间有收益值。前面的几步,有个向右走得0.081分。后面还有个往下走得2.52分。虽然离目的地很远,尽管数值很微弱,但也是一步步引导向高分迈进的。先有它们,才有后面的27.1分。而那些墙壁位置的状态,则长期为0。因为游戏人物不与它交互,不会有奖励反馈(撞墙扣分除外)。这就是前面我说算上它们,对结果也没影响的原因。

好了,最难的原理也解释完了。最后做一下总结。

这个Q-Learning算法的强化学习例子很初级。其实还有更多强化学习算法值得学习,希望大家看完本文能激发起学习的兴起。

比如Sarsa算法,和Q-Learning类似,是无模型的算法,但是它能在行动后更新状态值。相对于深度学习之于机器学习,强化学习也有个深度强化学习算法,比如DeepQLearning(DQN),它用神经网络来估算Q值。此外,与基于值的方法不同,策略梯度算法(PolicyGradients)是直接优化策略本身。

可能是出于男孩的原因。我幼儿时期脑海中的人工智能,居然就是强化学习。它可以自动打游戏,可以帮我跟老头下棋,可以自己开车。

最后说一点,我的游戏是画面的,例子是命令行打印的字符。主要目的是让大家将注意力集中到学习算法。代码就86行,我就不上传Github了,自己敲更有意思。

THE END
1.伯克利开源工具库RLib现已支持大规模多智能体强化学习开源AI 前线导读:近日,UC 伯克利的研究团队 RISELab 在其 Github 的项目 Ray Rlib 0.6.0 中添加了面向多智能体强化学习(multi-agent Reinforcement Learning)的支持。本文由团队成员 Eric Liang 首发于 RISELab 团队主页,AI 前线翻译整理。本文主要是关于多智能体强化学习的简明教程,以及在 RLib 中的设计思路。 https://www.infoq.cn/article/DLEqWRPc-Pcek5EQ6But
2.探秘多智能体强化学习MADDPG算法原理及简单实现探秘多智能体强化学习-MADDPG算法原理及简单实现 明天就是端午节了,首先祝兄弟姐妹们端午节安康! 之前接触的强化学习算法都是单个智能体的强化学习算法,但是也有很多重要的应用场景牵涉到多个智能体之间的交互,比如说,多个机器人的控制,语言的交流,多玩家的游戏等等。本文,就带你简单了解一下Open-AI的MADDPG(Multi-https://cloud.tencent.com/developer/news/246458
3.多智能体强化学习(MARL)框架一种新型的多智能体强化学习(MARL)框架——基于分层共识的多智能体强化学习(HC-MARL),由北京航空航天大学的研究团队提出。以下是核心内容概要:多智能体协作系统的重要性:解决单智能体无法完成的复杂任务。应用领域包括工业自动化、自动驾驶、能源管理和多人在线游戏。现有挑战:集中训练与分散执行(CTDE)框架的https://baijiahao.baidu.com/s?id=1804553133774179903&wfr=spider&for=pc
4.多智能体强化学习多智能体强化学习的在于,每一个Agent的动作都会影响环境的下一个状态,从而影响所有Agent。 Rewards 有n个Agent,所以每一轮都有n个奖励。使用R i R^iRi表示第i个Agent的奖励 在合作关系中,每个Agent获得的奖励都相等。在竞争的关系下,一个agent获得的奖励是另一个agent受的损失。 https://blog.csdn.net/qq_38689352/article/details/119646555
5.清华大学汪玉中文主页多智能体强化学习算法 得益于人工智能技术的发展和算力的不断提升,单智能体的感知和推理能力得到了大幅度增强。一般来说,提升系统智能性有两条途径,(1)不断提升单体智能,(2)利用协同智能,也就是利用多智能体系统。多智能体系统可以通过共享信息、资源调度、配合行动等手段配合完成任务,达到比单体系统更高的效率,目http://web.ee.tsinghua.edu.cn/wangyu/zh_CN/yjfx/2129/content/1304.htm
6.qlearning多智能体强化学习多智能体概念qlearning多智能体强化学习 多智能体概念 最近在学习多智能体的强化学习,看了几篇高质量基础论文,发现还是很有必要将强化学习的体系简单过一遍,然后再有针对性地练习代码。 1.强化学习简介 1.1 强化学习概念 强化学习与监督学习、非监督学习都属于机器学习,是人工智能的范畴。值得一提的是深度学习也是机器学习的一种https://blog.51cto.com/u_16099283/11852182
7.多智能体强化学习方法综述【摘要】:在自动驾驶、团队配合游戏等现实场景的序列决策问题中,多智能体强化学习表现出了优秀的潜力。然而,多智能体强化学习面临着维度灾难、不稳定性、多目标性和部分可观测性等挑战。为此,概述了多智能体强化学习的概念与方法,并整理了当前研究的主要趋势和研究方向。研究趋势包括CTDE范式、具有循环神经单元的智能体https://www.cnki.com.cn/Article/CJFDTotal-XXDU202401003.htm
8.科学网—[转载]群视角下的多智能体强化学习方法综述多智能体系统是分布式人工智能领域的前沿研究概念,传统的多智能体强化学习方法主要聚焦群体行为涌现、多智能体合作与协调、智能体间交流与通信、对手建模与预测等主题,但依然面临环境部分可观、对手策略非平稳、决策空间维度高、信用分配难理解等难题,如何设计满足智能体数量规模比较大、适应多类不同应用场景的多智能体强https://blog.sciencenet.cn/home.php?mod=space&uid=3472670&do=blog&id=1422698
9.多智能体强化学习入门本书之前介绍的算法都是单智能体强化学习算法,其基本假设是动态环境是稳态的(stationary),即状态转移概率和奖励函数不变,并依此来设计相应的算法。而如果环境中还有其他智能体做交互和学习,那么任务则上升为多智能体强化学习(multi-agent reinforcement learning,MARL),如图 20-1 所示。图https://hrl.boyuai.com/chapter/3/%E5%A4%9A%E6%99%BA%E8%83%BD%E4%BD%93%E5%BC%BA%E5%8C%96%E5%AD%A6%E4%B9%A0%E5%85%A5%E9%97%A8/
10.强化学习技术赋能智慧交通与电网让多智能体“见微知著”“这也意味着我们现在能够同时控制多个智能体,例如在交通信号灯、电网以及无人驾驶车辆等场景中的应用。这些系统都涉及大量智能体的协同运作。而这项工作的社会效应在于,它是首次由华人主导的多智能体强化学习应用,打破了此前该领域被西方机构垄断的局面。”论文通讯作者,北京大学人工智能研究院杨耀东研究员介绍道。http://www.xinhuanet.com/tech/20240904/1eeb042bdd5f4c6187fe0e2aa31196db/c.html
11.多智能体强化学习及其在游戏AI上的应用与展望多智能体强化学习及其在游戏AI上的应用与展望 近年来,人工智能技术在很多领域都取得了亮眼成就,并逐步从感知智能向决策智能迈进。强化学习是实现决策智能的重要路径,而现实世界中往往存在着多智能体的交互,也催生了多智能体强化学习的发展。这篇文章主要对多智能体强化学习进行整体阐述,并对其在游戏AI上的应用进行探讨https://www.gameres.com/890381.html
12.多智能体强化学习算法总结参考文章:多智能体强化学习(一) IQL、VDN、QMIX、QTRAN算法详解 - 知乎 (zhihu.com) "虚假奖励"(spurious reward signals)与“懒惰智能体”(lazy agent):当一个智能体 表现优秀的时候,另一个智能体 会“偷懒”,因为 的探索会导致整体奖励的下降。 https://www.jianshu.com/p/4467b7583206
13.多智能体机器学习本书主要介绍了多智能体机器人强化学习的相关内容。全书共6章,首先介绍了几种常用的监督式学习方法,在此基础上,介绍了单智能体强化学习中的学习结构、值函数、马尔科夫决策过程、策略迭代、时间差分学习、Q学习和资格迹等概念和方法。然后,介绍了双人矩阵博弈问题、多人随机博弈学习问题,并通过3种博弈游戏详细介绍了纳https://book.douban.com/subject/27095590/
14.基于多智能体深度强化学习的体系任务分配方法为了应对在未来复杂的战场环境下,由于通信受限等原因导致的集中式决策模式难以实施的情况,提出了一个基于多智能体深度强化学习方法的分布式作战体系任务分配算法,该算法为各作战单元均设计一个独立的策略网络,并采用集中式训练、分布式执行的方法对智能体的策略网络进行训练,结果显示,经过学习训练后的各作战单元具备一定的https://www.elecfans.com/d/2085562.html
15.多智能体机器学习强化学习方法中文pdf扫描版[29MB]电子书下载《多智能体机器学习:强化学习方法》共6章,首先介绍了几种常用的监督式学习方法,在此基础上,介绍了单智能体强化学习中的学习结构、值函数、马尔科夫决策过程、策略迭代、时间差分学习、Q学习和资格迹等概念和方法。然后,介绍了双人矩阵博弈问题、多人随机博弈学习问题,并通过3种博弈游戏详细介绍了纳什均衡、学习算法、https://www.jb51.net/books/693051.html
16.基于多智能体深度强化学习的无人机集群自主决策AET对人工操纵无人机来说,同时操控多架无人机完成多项任务且无人机之间形成有效配合是相当困难的,注意力分散或者操控失误都会造成较大的安全风险。无人机的操控还受到电磁干扰和远程控制距离的限制,因此,无人机灵活自主决策能力显得尤为重要。近年来,多智能体深度强化学习(Multi-Agent Deep Reinforcement Learning,MADRL)http://www.chinaaet.com/article/3000149669
17.深度强化学习实战:用OpenAIGym构建智能体第6章涵盖多种实现Q-Learning的方式,包括使用深度神经网络的动作-值函数近似、经验回放、目标网络和必要的相关实用工具,以及常用于训练和测试深度强化学习智能体的组件。学完本章,你能实现一个基于深度Q-Learning网络的智能体,做出最优化离散控制的决策,可以训练智能体玩一些Atari游戏,并观察它的性能。 第7章介绍如何https://www.epubit.com/bookDetails?id=UB83082546ee4de
18.告别偏科,能玩转多模态多任务多领域的强化智能体终于来了来自Hugging Face、法国国家信息与自动化研究所(INRIA)和波尔多大学的四位研究者提出了智能体中的「六边形战士」——Jack of All Trades (JAT)。JAT 是一个基于 Transformer 的多模态通用强化学习智能体框架。在此框架下,智能体能够通过同一套参数应对不同复杂度的多种任务,化身既会打游戏,又能控制机器人的全能高https://m.thepaper.cn/newsDetail_forward_27266388