Gym是一个开发和比较强化学习算法的工具箱。它不依赖强化学习算法结构,并且可以使用很多方法对它进行调用。

1 Gym环境

        这是一个让某种小游戏运行的简单例子。

        这将运行 CartPole-v0 环境实例 1000 个时间步,在每次迭代的时候都会将环境初始化(env.render)。运行之后你将会看到一个经典的推车杆问题

import gym
env = gym.make('CartPole-v0')
#生成环境
env.reset()
#重置环境,让环境回到起点
for _ in range(100):
    env.render()
    #提供环境(把游戏中发生的显示到屏幕上)
    env.step(env.action_space.sample()) 
    #env.action_space.sample() 会在动作空间中随机选择一个
    #env.step会顺着这个动作进入下一个状态
env.close()

1.1 动作是如何和环境交互的

与环境交互过程中,每一步环境都会返回四个值

observation (object)

一个特定的环境对象,代表了你从环境中得到的观测值。

例如从摄像头获得的像素数据,机器人的关节角度和关节速度,或者棋盘游戏的棋盘。

reward (float)由于之前采取的动作所获得的奖励总和。
done (boolean)决定是否重置环境,大多数,但不是所有的任务都被定义好了什么情况该结束这个回合。(举个例子,前面所展示的这个倒立摆的小车离开地太远了就结束了这个回合)
info (dict)

调试过程中将会产生的有用信息,有时它会对我们的强化学习学习过程很有用

程序的开始被叫做reset(),它会返回一个初始的观测值,因此像比于前面的代码,一个改良版的方式编写代码如下所示:

import gym
env = gym.make('CartPole-v1')
for i_episode in range(2):
    observation = env.reset()
    #初始话环境
    for t in range(100):
        env.render()
        #提供环境
        action = env.action_space.sample()
        #在可行的动作空间中随机选择一个
        observation, reward, done, info = env.step(action)
        #顺着这个动作进入下一个状态
        print(observation, reward, done, info)
        if done:
            print("Episode finished after {} timesteps".format(t+1))
            break
env.close()

'''
[-0.02344513 -0.17659043  0.0043245   0.27116755] 1.0 False {}
[-0.02697694 -0.37177384  0.00974786  0.5652113 ] 1.0 False {}
[-0.03441242 -0.56703115  0.02105208  0.8609492 ] 1.0 False {}
[-0.04575304 -0.7624334   0.03827107  1.1601765 ] 1.0 False {}
[-0.06100171 -0.9580325   0.0614746   1.4646091 ] 1.0 False {}
[-0.08016236 -1.1538512   0.09076678  1.7758446 ] 1.0 False {}
[-0.10323939 -0.9598616   0.12628368  1.5127068 ] 1.0 False {}
[-0.12243662 -1.1562663   0.1565378   1.8419967 ] 1.0 False {}
[-0.14556195 -0.9631801   0.19337773  1.6017431 ] 1.0 False {}
[-0.16482554 -0.7708017   0.2254126   1.3750535 ] 1.0 True {}
Episode finished after 10 timesteps
'''

2 空间

        在上面的例子中,我们一直在从环境的动作空间中采样随机动作。

【”action = env.action_space.sample()’】

        每个环境都带有一个 动作空间和一个观察空间。 这些属性属于 Space 类型,它们描述了有效操作和观察的格式:

import gym
env = gym.make('CartPole-v1')
print(env.action_space)
print(env.observation_space)

'''
Discrete(2)
Box([-4.8000002e+00 -3.4028235e+38 -4.1887903e-01 -3.4028235e+38], [4.8000002e+00 3.4028235e+38 4.1887903e-01 3.4028235e+38], (4,), float32)
'''

         离散空间允许固定范围的非负数,在'CartPole-v1'中,有效动作是 0 或 1。

print(env.action_space.start)
#0
#离散动作空间的开始值

print(env.action_space.n)
#2
#离散动作空间中一共有几个值

        框Box空间表示一个 n 维框,因此有效观察值将是一个包含 n个数字的数组。

         我们还可以检查 Box 的边界:

print(env.observation_space.low)
print(env.observation_space.high)
'''
[-4.8000002e+00 -3.4028235e+38 -4.1887903e-01 -3.4028235e+38]
[4.8000002e+00 3.4028235e+38 4.1887903e-01 3.4028235e+38]
'''

 Box 和 Discrete 是最常见的空间。 您可以从 它们中采样或检查某些东西是否属于它:

from gym import spaces
space = spaces.Discrete(8) 
# Set with 8 elements {0, 1, 2, ..., 7}
x = space.sample()
print(x)
print(space.contains(x))
'''
5
True
'''


    

 参考资料 Gym (openai.com)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐