OpenAI-Gym入门

  |  

摘要: OpenAI gym 入门

【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】
我的网站:潮汐朝夕的生活实验室
我的公众号:算法题刷刷
我的知乎:潮汐朝夕
我的github:FennelDumplings
我的leetcode:FennelDumplings


强化学习的挑战之一是训练智能体,这首先需要一个工作环境。

OpenAI Gym 是一个工具包,提供了广泛的模拟环境。安装方式如下

1
pip install gym

根据系统可能还要安装 Mesa OpenGL 实用程序(GLU),例如 Ubuntu 18.04 上还需要以下库。某些环境在渲染的时候需要。

1
apt install libglu1-mesa

下面的代码用 make() 创建一个 gym 已有的环境,可以用一下方法获取所有可用环境

1
gym.envs.registry.all()

这里我们用 CartPole-v1。CartPole-v1 的每个观测值是包含 4 个浮点数的 Numpy 数组:水平位置、速度、极角、角速度,调用 render() 可以显示环境

1
env = gym.make("CartPole-v1")

创建环境后,必须用 reset() 初始化,返回第一个观察值,观察值取决于环境的类型。

1
obs = env.reset()

环境可能采取的行动: env.action_space,每个环境都带有 action_spaceobservation_space 对象。这些属性是 Space 类型,描述格式化的有效的行动和观察。

1
2
print("action_space: {}".format(env.action_space))
print("observation_space: {}".format(env.observation_space))

打印结果如下

1
2
action_space: Discrete(2)
observation_space: Box(-3.4028234663852886e+38, 3.4028234663852886e+38, (4,), float32)

box 和 discrete 是最常见的空间, 可以从 gym.spaces 中获取。

1
2
3
4
5
6
7
8
9
10
11
12
import gym
from gym import spaces

def main():
env = gym.make("CartPole-v1")
space = spaces.Discrete(8) # Set with 8 elements {0, 1, ..., 7}
x = space.sample()
print("space.sample: {}".format(x))
print("space.n: {}".format(space.n))

if __name__ == "__main__":
main()

step() 执行给定动作并返回四个值

  • obs: 新观察
  • reward: 无论做什么,每一步获得 1.0 奖励,因此目标是使小车尽可能长时间运行
  • done: 整个回合结束时,此值为 True,之后必须重置环境
  • info: 环境特定的字典,提供额外的信息
1
obs, reward, done, info = env.step(env.action_space.sample())

使用完环境后,调用 close() 释放资源。

1
env.close()

完整测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import time

import gym

"""
1. 环境(environment)
2. 智能体agent(算法)
agent发送action至environment,environment返回观察和回报。
"""

def main():
"""
用 make() 创建一个 gym 中的现成环境
"""
env = gym.make("CartPole-v1")
obs, reward, done, info = env.reset()
print("obs: {}".format(obs))
print("reward: {}".format(reward))
print("done: {}".format(done))
print("info: {}".format(info))
print("action_space: {}".format(env.action_space))
print("observation_space: {}".format(env.observation_space))
print("observation_space.high: {}".format(env.observation_space.high))
print("observation_space.low: {}".format(env.observation_space.low))
# 刷新当前环境,并显示
for _ in range(1000):
env.render()
obs, reward, done, info = env.step(env.action_space.sample())
if done:
break
time.sleep(0.1)
env.close()

if __name__ == "__main__":
main()

Share