This commit is contained in:
JohnJim0816
2020-10-07 21:47:32 +08:00
parent 07b835663a
commit 5fe8bfc6c1
23 changed files with 378 additions and 139 deletions
+41
View File
@@ -0,0 +1,41 @@
# 使用 Q-learning 实现贪吃蛇
贪吃蛇是一个起源于1976年的街机游戏 Blockade,玩家控制蛇上下左右吃到食物并将身体增长,吃到食物后移动速度逐渐加快,直到碰到墙体或者蛇的身体算游戏结束。
![image-20200901202636603](assets/image-20200901202636603.png)
如图,本次任务整个游戏版面大小为560X560,绿色部分就是我们的智能体贪吃蛇,红色方块就是食物,墙位于四周,一旦食物被吃掉,会在下一个随机位置刷出新的食物。蛇的每一节以及食物的大小为40X40,除开墙体(厚度也为40),蛇可以活动的范围为480X480,也就是12X12的栅格。环境的状态等信息如下:
* state:为一个元组,包含(adjoining_wall_x, adjoining_wall_y, food_dir_x, food_dir_y, adjoining_body_top, adjoining_body_bottom, adjoining_body_left, adjoining_body_right).
* [adjoining_wall_x, adjoining_wall_y]:提供蛇头是否与墙体相邻的信息,具体包含9个状态
adjoining_wall_x0表示x轴方向蛇头无墙体相邻,1表示有墙在蛇头左边,2表示有墙在右边adjoining_wall_y:0表示y轴方向蛇头无墙体相邻,1表示有墙在蛇头上边,2表示有墙在下边
注意[0,0]也包括蛇跑出480X480范围的情况
* [food_dir_x, food_dir_y]:表示食物与蛇头的位置关系
food_dir_x:0表示食物与蛇头同在x轴上,1表示食物在蛇头左侧(不一定相邻),2表示在右边
food_dir_y:0表示食物与蛇头同在y轴上,1表示食物在蛇头上面,2表示在下面
* [adjoining_body_top, adjoining_body_bottom, adjoining_body_left, adjoining_body_right]:用以检查蛇的身体是否在蛇头的附近
adjoining_body_top1表示蛇头上边有蛇的身体,0表示没有
adjoining_body_bottom1表示蛇头下边有蛇的身体,0表示没有
adjoining_body_left1表示蛇头左边有蛇的身体,0表示没有
adjoining_body_right1表示蛇头右边有蛇的身体,0表示没有
* action:即上下左右
* reward:如果吃到食物给一个+1的reward,如果蛇没了就-1,其他情况给-0.1的reward
## 任务要求
设计一个Q-learning agent用于学习snake游戏,并绘制reward以及滑动平均后的reward随episode的变化曲线图并记录超参数写成报告。
[参考代码](https://github.com/datawhalechina/leedeeprl-notes/tree/master/codes/snake)
Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

+6 -4
View File
@@ -99,11 +99,13 @@ class SnakeEnv:
self.render = True
class Snake:
''' 定义贪吃蛇的类
'''
def __init__(self, snake_head_x, snake_head_y, food_x, food_y):
self.init_snake_head_x = snake_head_x
self.init_snake_head_y = snake_head_y
self.init_food_x = food_x
self.init_food_y = food_y
# 初始化蛇头的位置
self.init_snake_head_x, self.init_snake_head_y = snake_head_x, snake_head_y
# 初始化食物的位置
self.init_food_x, self.init_food_y = food_x, food_y
self.reset()
def reset(self):