将gym游戏里原始离散的discrete观察空间变为box类型的连续观察空间

将gym游戏里原始离散的discrete观察空间变为box类型的连续观察空间

gym里的FrozenLake-v1游戏的观察空间就一个数字,范围0~15,游戏环境为4*4的方格,agent在初始位置,观察值为0,右移一个位置后的观察值为1,这是个discrete类型,通过下述方法,将0-15这16个互斥的状态值变为box类型的独热向量,

即初始状态值为[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],右移一个位置后的状态值为[0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

import gym, gym.spaces

# 继承一个gym.ObservationWrapper类
class DiscreteOneHotWrapper(gym.ObservationWrapper):
    def __init__(self, env):    # 需要一个env初始化
        super(DiscreteOneHotWrapper, self).__init__(env)

        # 判断env.observation_space变量是否是gym.spaces.Discrete类型
        assert isinstance(env.observation_space,gym.spaces.Discrete)

        shape = (env.observation_space.n, )     # shape为(16,)

        # 修改env的状态空间,变为Box类型,最小值0,最大值1,16维向量
        self.observation_space = gym.spaces.Box(0.0, 1.0, shape, dtype=np.float32)

    def observation(self, observation):
        res = np.copy(self.observation_space.low)   # 复制一个16维的数组,全为0
        res[observation] = 1.0  # 当前观察的动作为 1 ,变成独热向量
        return res

# 使用
env = DiscreteOneHotWrapper(gym.make("FrozenLake-v1"))  # 此处创建一个环境并修改它的观察空间

你可能感兴趣的:(深度学习,人工智能)