《深入浅出强化学习原理入门》学习笔记(三)机器人找金币应用实例
原作者代码:链接: https://github.com/gxnk/reinforcement-learning-code/.
1、实例描述
以机器人找金币的例子构建MDP框架。
网格中一共8个状态,其中状态6和8都是死亡区域,状态7是金币区域。
机器人的初始位置为网格世界中的任意一个状态,机器人从初始状态出发开始寻找金币,进入死亡区域或者找到金币时,本次探索结束。
将机器人找金币的例子建模为MDP。
状态空间:S={ 1,2,3,4,5,6,7,8}
动作空间:A={东,南,西,北}
状态转移概率为机器人的运动方程
回报函数为:找到金币回报为1,进入死亡区域回报为-1,机器人在状态1-5之间转换时回报为0。
构建机器人找金币的gym环境。
2、 环境构建源码及注释
导入需要用的库
import logging
import numpy
import random
from gym import spaces
import gym
logger = logging.getLogger(__name__)
gym环境文件的主体是类,定义类名为GridEnv
class GridEnv(gym.Env):
metadata = {
'render.modes': ['human', 'rgb_array'],
'video.frames_per_second': 2
}
初始化为环境的基本参数
def __init__(self):
#状态空间
self.states = [1,2,3,4,5,6,7,8]
#机器人可能处的每个状态点的中心坐标x,y
self.x=[140,220,300,380,460,140,300,460]
self.y=[250,250,250,250,250,150,150,150]
#终止状态为字典格式
self.terminate_states = dict()
self.terminate_states[6] = 1
self.terminate_states[7] = 1
self.terminate_states[8] = 1
#动作空间
self.actions = ['n','e','s','w']
#回报函数,数据结构为字典
self.rewards = dict();
self.rewards['1_s'] = -1.0
self.rewards['3_s'] = 1.0
self.rewards['5_s'] = -1.0
#状态转移概率,数据格式为字典
self.t = dict();
self.t['1_s'] = 6
self.t['1_e'] = 2
self.t['2_w'] = 1
self.t['2_e'] = 3
self.t['3_s'] = 7
self.t['3_w'] = 2
self.t['3_e