使用gym实现的第一个强化学习的问题,简单来说就是一个找金币的问题。
该网格世界一共8个状态,其中6和8是死亡区域,状态7是金币区域,机器人的初始位置为网格中的任意一个状态,机器人从初始状态出发寻找金币,机器人每探索一步,进入死亡区域或找到金币本次探索结束。
状态空间 S = { 1, 2, 3, 4, 5, 6, 7, 8},动作空间是 A = {上,下,左, 右}, 找到金币回报为1, 进入死亡区域回报为-1,在状态1和5中切换的时候,回报为0。
代码实现部分,实现的框架使用的是gym,关于如何安装和使用的相关基础知识参考网络上的其他资料
import numpy
import random
from gym import spaces
import gym
gym.Env是gym的世界模拟的世界类,要使用gym库来实现相关功能的模拟,必须继承该类实现相关的接口,主要的接口包含reset和step等,在不同的gym版本中函数的名称已经有了一定的变化,如在以前你在实现Env类的子类的时候,需要实现的接口大都在前面有一个下划线_如_step,请注意使用的gym版本不同,相关的实现代码会有一定的变化。
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] #状态空间列表
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 = ['up', 'down', 'left', 'right']
self.rewards = dict(); #回报
self.rewards['1_down'] = -1.0
self.rewards['3_down'] = 1.0
self.rewards['5_down'] = -1.0