上篇博客介绍了使用OpenAI Gym的CartPole(倒立摆)的demo,如果想要在每个步骤中做出比采取随机行动更好的行动,那么实际了解行动对环境的影响可能会很好。
环境的step 函数返回需要的信息,step 函数返回四个值observation、reward、done、info,下面是具体信息:
import gym
env = gym.make('CartPole-v0')
for i_episode in range(20):
observation = env.reset()
for t in range(100):
env.render()
print(observation)
action = env.action_space.sample()
observation, reward, done, info = env.step(action)
if done:
print("Episode finished after {} timesteps".format(t+1))
break
当done 为真时,控制失败,此阶段episode 结束。可以计算每 episode 的回报就是其坚持的t+1 时间,坚持的越久回报越大,在上面算法中,agent 的行为选择是随机的,平均回报为20 左右。
[ 0.00753165 0.8075176 -0.15841931 -1.63740717]
[ 0.023682 1.00410306 -0.19116745 -1.97497356]
Episode finished after 26 timesteps
[-0.01027234 -0.00503277 0.01774634 0.01849733]
[-0.01037299 -0.20040467 0.01811628 0.31672619]
[-0.01438109 -0.00554538 0.02445081 0.02981111]
[-0.01449199 0.18921755 0.02504703 -0.25505814]
[-0.01070764 0.38397309 0.01994587 -0.53973677]
[-0.00302818 0.57880906 0.00915113 -0.8260689 ]
[ 0.008548 0.77380468 -0.00737025 -1.11585968]
[ 0.02402409 0.9690226 -0.02968744 -1.41084543]
[ 0.04340455 1.16449982 -0.05790435 -1.71265888]
[ 0.06669454 1.36023677 -0.09215753 -2.0227866 ]
[ 0.09389928 1.55618414 -0.13261326 -2.34251638]
[ 0.12502296 1.75222707 -0.17946359 -2.67287294]
Episode finished after 12 timesteps
在上面的例子中,已经从环境的动作空间中抽取随机动作。但这些行动究竟是什么呢? 每个环境都带有描述有效动作和观察结果的一级Space对象:
import gym
env = gym.make('CartPole-v0')
print(env.action_space)
#> Discrete(2)
print(env.observation_space)
#> Box(4,)
离散空间允许固定范围的非负数,因此在这种情况下,有效的动作是0或1. Box空间表示一个n维框,所以有效的观察将是4个数字的数组。 也可以检查Box的范围:
print(env.observation_space.high)
#> array([ 2.4 , inf, 0.20943951, inf])
print(env.observation_space.low)
#> array([-2.4 , -inf, -0.20943951, -inf])
这种反省(introspection)可以帮助编写适用于许多不同环境的通用代码。Box和Discrete是最常用的空格,可以从空格进行抽样或检查属于它的内容:
from gym import spaces
space = spaces.Discrete(8) # Set with 8 elements {0, 1, 2, ..., 7}
x = space.sample()
assert space.contains(x)
assert space.n == 8
对于CartPole-v0,其中一个操作会向左施加力,其中一个向右施加力。
gym主要目的是提供大量的暴露常见界面的环境,并进行版本控制,以便进行比较,可以查看系统提供那些环境:
from gym import envs
print(envs.registry.all())
[EnvSpec(PredictActionsCartpole-v0), EnvSpec(Asteroids-ramDeterministic-v0), EnvSpec(Asteroids-ramDeterministic-v3), EnvSpec(Gopher-ramDeterministic-v3), EnvSpec(Gopher-ramDeterministic-v0), EnvSpec(DoubleDunk-ramDeterministic-v3), EnvSpec(DoubleDunk-ramDeterministic-v0), EnvSpec(Tennis-ramNoFrameskip-v3), EnvSpec(RoadRunner-ramDeterministic-v0), EnvSpec(Robotank-ram-v3), EnvSpec(CartPole-v0), EnvSpec(CartPole-v1), EnvSpec(Gopher-ram-v3), EnvSpec(Gopher-ram-v0)...