【强化学习】OpenAI Gym 多线程环境的简单实现,适用于A2C、A3C等算法

        本文介绍了OpenAI Gym多线程环境的实现方法。由于OpenAI Baselines提供的SubprocVecEnv类在使用时会有一些bug,本文用自己的方式对多线程环境进行简单实现。以Breakout为例,效果如图。【注:本文的实现方法未使用多线程(进程)方法,故cpu利用率较低,之后有时间会考虑使用多线程实现】

图 1  多线程breakout环境训练过程

目录

环境初始化

环境step的处理

训练时环境的实时显示


环境初始化

        本文采用环境list的方式实现多环境,代码如下:

import gym 
import numpy as np

NUM_PROCESSES = 16

envs = [gym.make('Breakout-v0') for i in range(NUM_PROCESSES)]

obs = [env.reset() for env in envs]
obs = np.array(obs)

        就是调用了16次gym.make(),然后将得到的env放到一个list中。

        obs得到每个环境初始状态构成的list。由于reset()返回的时np.array格式,故将obs转换成array格式。

环境step的处理

        用action_np表示你的智能算法返回的array格式的动作,调用step()的代码如下:

# 处理step返回的数据,注意正常调用step时是这样的: obs, reward, done, info = envs[p].step(a)
# 故 results = [(obs, reward, done, info), (obs, reward, done, info), ...]
results = [envs[p].step(a) for p, a in enumerate(action_np)]

# 将step返回的每类值进行整合,如 obs = array([obs1, obs2, ...])
obs = np.array([result[0] for result in results])
reward = np.array([result[1] for result in results])
done = np.array([result[2] for result in results])
info = np.array([result[3] for result in results]) 

        得到的obs,reward,done,info就是每个环境的结果整合之后的array。

        此外,注意要对已经done的环境进行reset(),代码如下:

# 将done的环境reset
obs = np.array([envs[p].reset() if d else obs[p] for p, d in enumerate(done)])

# 可用masks表示每个环境是否done
masks = torch.FloatTensor([[0.0] if done_ else [1.0] for done_ in done])

训练时环境的实时显示

        这部分参考OpenAI Baselines提供的SubprocVecEnv类的实现方式。定义显示环境的类Environment和函数display_multi_process,代码如下:

import gym
import numpy as np
from gym.envs.classic_control import rendering

class Environment():

    def __init__(self):
        self.viewer = rendering.SimpleImageViewer()

    def display_multi_process(self, envs):
        # 将所有环境中的画面进行处理,形成一个大的图像,由于显示
        img_nhwc = np.array([env.render('rgb_array') for env in envs])  

        N, h, w, c = img_nhwc.shape     # (NUM_PROCESSES, 210, 160, 3)
        H = int(np.ceil(np.sqrt(N)))    # 大图像中每列小图像个数
        W = int(np.ceil(float(N)/H))    # 大图像中每行小图像个数
        img_HWhwc = img_nhwc.reshape(H, W, h, w, c)     # 将N拆分成H*W
        img_HhWwc = img_HWhwc.transpose(0, 2, 1, 3, 4)  # 调换顺序
        img_Hh_Ww_c = img_HhWwc.reshape(H*h, W*w, c)    # 组合成大图像
        self.viewer.imshow(img_Hh_Ww_c)     # 显示图像

        在训练时调用self.display_multi_process(envs)即可得到如图 1 所示的训练界面。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
OpenAI Gym是一个用于开发和比较强化学习算法的开源工具包。它提供了许多标准的环境,供研究人员和开发者用于测试和验证他们的算法OpenAI Gym环境可以分为两类:离散动作空间和连续动作空间。 在离散动作空间中,动作的选择是离散的,比如向左、向右、不动等。这类环境包括经典的游戏,如CartPole和FrozenLake。 CartPole是一个很简单环境,目标是让杆子保持平衡。智能体可以选择向左或向右施加力量来控制杆子的平衡。 FrozenLake是一个迷宫环境,智能体需要从起点到达目标,避免掉入冰冻的湖中。它有四种动作:向上、向下、向左、向右。 在连续动作空间中,动作的选择是连续的,可以是任意值。这类环境更接近于真实场景,比如自动驾驶和机器人控制。其中一个连续动作空间的环境是MountainCar。 MountainCar是一个小车爬坡的环境,目标是让小车爬到山顶。智能体可以选择施加的力量,力量的取值范围是[-1, 1]。 除了这些环境OpenAI Gym还提供了许多其他的环境供选择,涵盖了各种不同的问题和挑战。比如Atari游戏,如Pong和Breakout,以及一些经典的控制问题,如Acrobot和Pendulum。 总的来说,OpenAI Gym提供了丰富多样的强化学习环境,使研究人员和开发者能够快速开发、测试和评估他们的算法。无论是离散动作空间还是连续动作空间,都能够找到适合自己需求的环境

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

饮默、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值