如何用AI玩贪食蛇?

文章同步发于公众号:1024程序开发者社区(cxkfzsq1024)

公众号中回复“AI贪食蛇”获取代码链接

前几日在丹枫无迹大哥的公众号里读到一篇用PyGame制作的贪食蛇游戏的文章并进行了转载,详见:Python:游戏:贪吃蛇。

玩的过程中我就在思考,如果用程序去控制蛇能达到怎样的效果呢?本文就将分析一下如何通过三种算法实现AI去玩贪食蛇。

一、搜索算法实现

第一大类就是通过获取蛇的头部和食物的位置,在避免碰到自己和边缘的前提下进行路径规划。这方面有大神已经研究过,在这里做简单介绍。

可以用的方法有:BFS、DFS、A*算法等,此处大神采用了BFS算法,也就是广度优先搜索算法,它从根节点开始遍历图并探索所有相邻节点,选择最近的节点并浏览所有未探测的节点。对于每个最近的节点,该算法遵循相同的过程,直到找到目标为止。具体实现过程可以看大神博客,实现的结果如图:

此种方法的好处在于实现起来速度快,蛇的目标明确,直奔食物,对于贪食蛇游戏基本能玩转,但是如果新加一些约束条件如:障碍物,或者一个更加复杂的游戏,这个方法扩展性、适应性就显得不足。

博客链接:http://hawstein.com/2013/04/15/snake-ai/

源代码:公众号后台回复“AI贪食蛇”

二、强化学习实现

第二大类就是通过强化学习Q-Learning完成了贪食蛇,该方法原理如图:

作者通过程序抽取游戏过程中蛇与食物相对的位置获取state,选择动作在环境中得到reward(吃到食物为1,死亡为-1,其他情况0.1),更新形成一个Q-table,其中动作空间为上下左右四种,每一种state对应四个动作的选择概率:

该位大神通过js实现了代码的整个过程,可以在浏览器中完成训练的全过程,效果如图。他对游戏进行了简化,及没有边界,只有碰到自己身体蛇会死亡:

此种方法优点:通过自学习的方式实现,避免了建模的复杂过程,模型灵活性较高。

缺点:需要大量训练,见效慢,且存在一定随机性。此外本模型中state的定义还存在一定的建模,没能完全脱离游戏模型。

博客链接:https://italolelis.com/snake

源代码:公众号后台回复“AI贪食蛇”

三、神经网络实现

第三类是通过建立神经网络来实现当前状态state和所要选取动作action之间的关系,也可以理解为一个分类问题。

具体建模方法为:

选取能表示蛇与食物以及环境关系的参数,共有七个:左侧是否有物体、前方是否有物体、右侧是否有物体、蛇头运动X方向向量、食物与蛇头X方向向量、蛇头运动Y方向向量、食物与蛇头Y方向向量。

比如:

输出为,左右前三个动作。

NN模型为两个隐含层,分别为9和15个节点,较之于深度神经网络这个模型可以说非常轻巧。效果如图:

此种方法难点是,训练数据获取,作者提出通过人工玩游戏这个过程进行数据采集,这就需要消耗一定的人力,而且数据越多模型玩的越好;

模型优点在于,建模简单,不需要考虑过多的逻辑关系和路径规划方法。

博客地址:https://theailearner.com/2018/04/19/snake-game-with-deep-learning-part-2/

源代码:公众号后台回复“AI贪食蛇”

以上,是三类方法构建AI玩贪食蛇的方法,下期会通过深度强化学习构建一个游戏AI,结合了第二、三种的优点,敬请期待。

后台回复【AI贪食蛇】,获取源码。

1024程序开发者社区的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里就技术问题进行交流,还没有加入的小伙伴可以扫描下方“社区物业”二维码,让管理员帮忙拉进群,期待大家的加入。

//猜你喜欢//

  • Django+xadmin打造在线考试系统(一)

  • Django+uwsgi+nginx(Ubuntu:16.4)项目部署

  • 《解忧杂货店》豆瓣书评爬取和情感分析初探

  • 用Hexo+Github 搭建属于自己的博客(一)

  • 用Hexo+Github 搭建属于自己的博客(二)

  • 【运维管理】vlan信息配置不全导致的通信故障

你可能感兴趣的:(深度学习,游戏AI,强化学习,神经网络)