将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")) # 此处创建一个环境并修改它的观察空间