深度强化学习贪吃蛇AI与游戏环境。
Python版本: Python3.6或以上
- pygame
- tensorflow / tensorflow-gpu
- h5py
- numpy
- matplotlib
演示文件: Snakey_play.py
此文件与DRL_Snakey包无关联,不含有任何AI部分,作为一个人类可以游玩的游戏进行演示。
在使用包之前可以先运行该脚本查看游戏效果。
人类玩家游玩时,游戏内容设有等级划分,随着获取食物的数量上升,蛇前进的速度会变快。
同时每增加一个难度会多出现一个触碰到便会游戏结束的炸弹。(默认为无炸弹)
游戏在一个200×200像素的平面中运行,每10×10个像素作为一个单元。
游戏右侧是一个100×200像素的信息面板。主要用到的信息会在右侧给出。
使用方向键控制移动方向,任何时候都可以使用Q键退出。游戏结束画面按R重新开始,S
则会跳出计分板。游戏中按P
键可以暂停游戏,暂停中N键可以让游戏单步进行,F
键切换可视化模式。
除单独存在的演示脚本外,游戏主体主要由游戏逻辑,图形引擎,智能体三部分组成,运行时可以根据需要选择是否加载图形引擎显示游戏界面。
AI没有游戏的速度区别与等级区分,暂时无视炸弹,并且在使用界面时默认使用最快的刷新速度。
本项目内拥有数个AI脚本,详细见下文的各脚本说明。
游戏中按F键可切换可视化部分,P键暂停,N键在暂停时单步进行游戏。
首先import
import DRL_Snakey as Snakey
创建游戏对象,此游戏类仅包含游戏规则(DRL_Snakey.Game)。
game = Snakey.Game()
游戏控制agent对象。这里以简单逻辑算法AI举例。
agent = Snakey.agent.Logic()
游戏界面对象,通过pygame模块创建可视的游戏界面。
ui = Snakey.UI()
通过UI类的show(game, agent)函数创建游戏窗口。
ui.show(game, agent)
需要训练agent模型或其他等不需要游戏UI界面时,使用以下脚本控制游戏流程。
import DRL_Snakey as Snakey
game = Snakey.Game()
agent = Snakey.agent.Logic()
while True:
game.next_step(agent.get_next_direction(game))
if game.deathflag:
print("Gameover. score:", game.ate)
game.reset()
DRL_Snakey主要分为游戏环境DRL_Snakey.core
,智能体DRL_Snakey.agent
与DRL_Snakey.utlis
组件三部分组成。
其中DRL_Snakey.core.Game
为贪吃蛇游戏的基本行动规则,死亡判定以及地图查看等功能。可以视为游戏的本体。
DRL_Snakey.core.UI
为游戏界面显示相关。通过pygame包来创建可视化的游戏界面。
DRL_Snakey.agent
为智能体部分,其中拥有众多AI类。智能体会读取游戏中每步的状态,应用相对的决策方法
进行决策,并给出反应。
Agent类的结构:
class Agent(object):
def get_next_direction(self, Game):
"""
根据智能体对当前环境的判断选择下一步前进的方向。
:return: 方向["W", "S", "A", "D"]
"""
pass
def button_K_e_pressed(self, Game):
"""
给不同的agnet预留的自定义函数,用来调试或数据可视化。
"""
pass
def custom_function(self, Game):
"""
给不同的agnet预留的自定义函数,用来调试或数据可视化。
"""
pass
DRL_Snakey.core.snake
中还有一个Snake
类来表示游戏中的每条蛇。
ps. 请多多编写自己的agent然后pull request
一个简单的演示用逻辑AI,完全无视炸弹,只吃食物。具有十分简单的自身躲避算法。
通过计算蛇头位置与食物的水平竖直差,以之字形接近食物。并且在决策方向前,会通过Logic.next()
预测
下一步的位置,并调用Logic.elude()
依次尝试各个方向来避免与自己相撞。但是因为只能预测下一步的危险情况,
所以此AI并不具有很高智能,只是作为演示使用。
此AI在20次尝试中最好成绩为68,平均值为49.6。
DP(Dynamic Programming)动态规划-马尔科夫决策法。
每一步都通过迭代贝尔曼方程计算当前各点的价值,创建价值矩阵。并且朝周围价值最高的点前进。
构造函数参数说明:
discount
: 衰减率,贝尔曼方程中对于非即时回报的衰减率。iteration
: 推算价值矩阵的迭代次数。walk_reward
: 每走一步的回报eat_self_reward
: 吃到自己的回报food_reward
: 吃到食物的回报
按F打开可视化模式后,可观察每一步动作所基于的各点价值图像。
实际操作中会发现,AI可以根据价值的判断避开自身,并且在食物环境恶劣的情况下选择在安全地带迂回等待。
此AI在20次尝试中最好成绩为119,平均值为69.2。
MC(Monte-Calo)蒙特卡洛法。
每步分别基于某个策略循环计算三个可行方向的平均动作价值,选择平均动作价值最高的一个动
作。本AI采取的基础策略是DRL_Snakey.agent.Logic_AI.Logic
。
构造函数参数说明:
discount
: 衰减率iteration
: 迭代次数max_step
: 预测最大步数epsilon
: 探索率walk_reward
: 每步的回报eat_self_reward
: 吃到自己的回报food_reward
: 吃到食物的回报
此AI在20次尝试中最好成绩为89,平均值为50.5。
作为深度强化学习很好的一个例子,贪吃蛇游戏有着很明显的数据结构。Environment就是地图整体,Action是上下左右 四种可以采取的行动,无需再通过卷积神经网络读取游戏画面。
本项目提供了一个游戏环境,供他人自行编写新的agent或拓展游戏功能。