文章同步发于公众号:1024程序开发者社区(cxkfzsq1024)
公众号中回复“AI贪食蛇”获取代码链接
前几日在丹枫无迹大哥的公众号里读到一篇用PyGame制作的贪食蛇游戏的文章并进行了转载,详见:Python:游戏:贪吃蛇。
玩的过程中我就在思考,如果用程序去控制蛇能达到怎样的效果呢?本文就将分析一下如何通过三种算法实现AI去玩贪食蛇。
一、搜索算法实现
第一大类就是通过获取蛇的头部和食物的位置,在避免碰到自己和边缘的前提下进行路径规划。这方面有大神已经研究过,在这里做简单介绍。
可以用的方法有:BFS、DFS、A*算法等,此处大神采用了BFS算法,也就是广度优先搜索算法,它从根节点开始遍历图并探索所有相邻节点,选择最近的节点并浏览所有未探测的节点。对于每个最近的节点,该算法遵循相同的过程,直到找到目标为止。具体实现过程可以看大神博客,实现的结果如图:
image此种方法的好处在于实现起来速度快,蛇的目标明确,直奔食物,对于贪食蛇游戏基本能玩转,但是如果新加一些约束条件如:障碍物,或者一个更加复杂的游戏,这个方法扩展性、适应性就显得不足。
博客链接:http://hawstein.com/2013/04/15/snake-ai/
源代码:公众号后台回复“AI贪食蛇”
二、强化学习实现
第二大类就是通过强化学习Q-Learning完成了贪食蛇,该方法原理如图:
image作者通过程序抽取游戏过程中蛇与食物相对的位置获取state,选择动作在环境中得到reward(吃到食物为1,死亡为-1,其他情况0.1),更新形成一个Q-table,其中动作空间为上下左右四种,每一种state对应四个动作的选择概率:
image该位大神通过js实现了代码的整个过程,可以在浏览器中完成训练的全过程,效果如图。他对游戏进行了简化,及没有边界,只有碰到自己身体蛇会死亡:
image此种方法优点:通过自学习的方式实现,避免了建模的复杂过程,模型灵活性较高。
缺点:需要大量训练,见效慢,且存在一定随机性。此外本模型中state的定义还存在一定的建模,没能完全脱离游戏模型。
博客链接:https://italolelis.com/snake
源代码:公众号后台回复“AI贪食蛇”
三、神经网络实现
第三类是通过建立神经网络来实现当前状态state和所要选取动作action之间的关系,也可以理解为一个分类问题。
image具体建模方法为:
选取能表示蛇与食物以及环境关系的参数,共有七个:左侧是否有物体、前方是否有物体、右侧是否有物体、蛇头运动X方向向量、食物与蛇头X方向向量、蛇头运动Y方向向量、食物与蛇头Y方向向量。
image比如:
image输出为,左右前三个动作。
NN模型为两个隐含层,分别为9和15个节点,较之于深度神经网络这个模型可以说非常轻巧。效果如图:
image此种方法难点是,训练数据获取,作者提出通过人工玩游戏这个过程进行数据采集,这就需要消耗一定的人力,而且数据越多模型玩的越好;
模型优点在于,建模简单,不需要考虑过多的逻辑关系和路径规划方法。
博客地址:https://theailearner.com/2018/04/19/snake-game-with-deep-learning-part-2/
源代码:公众号后台回复“AI贪食蛇”
以上,是三类方法构建AI玩贪食蛇的方法,下期会通过深度强化学习构建一个游戏AI,结合了第二、三种的优点,敬请期待。
后台回复【AI贪食蛇】,获取源码。
image1024程序开发者社区的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里就技术问题进行交流,还没有加入的小伙伴可以扫描下方“社区物业”二维码,让管理员帮忙拉进群,期待大家的加入。
image//猜你喜欢//
网友评论