强化学习:gym环境的解读及使用

原文地址

分类目录——强化学习

  • 本文全部代码

  • 以立火柴棒的环境为例

    效果如下

    立火柴棒
  • 获取环境

    env = gym.make('CartPole-v0')   
    # 定义使用gym库中的某一个环境,'CartPole-v0'可以改为其它环境
    env = env.unwrapped             
    # 据说不做这个动作会有很多限制,unwrapped是打开限制的意思
    

    可以通过gym.make(id)的方式获取gym中的环境,gym中都有些什么样的环境呢,如果你是用anaconda配置的环境,你可以在Anaconda3\envs\环境名\Lib\site-packages\gym\envs\__init__.py中获得gym中所有注册的环境信息。如果你用的是原生的python环境,大概也可以在你的python环境位置\Lib\site-packages\gym\envs\__init__.py找到这个文件,不过这个我就没有测试了,它是这样一个文件

    1584064233379

    make方法中就是根据这个id获取的,还可以根据entry_point属性找到环境的位置,(我试过通过 Ctrl+左键单击 的方式找到这个环境,但是失败了),不如就这个CartPole-v0的环境,它是这样的

    1584064507960

    可以查看到环境的相关信息

  • 获取环境参数

    gym中的环境都继承自gym.Env这个父类

    1583854666466

    至少其中这几个属性和函数在gym的环境中都是有的,当然基于需要各个环境中也有它们独有的环境

    下面这几个是常用的gym属性

    • 状态空间env.observation_space

      其状态空间是这样一个类型

      1584065225129

      在自定义环境时可以这样构造状态空间,其中

      方法/属性作用
      shape尺寸/规格/形状,通过用 .shape[0] 的方式获取状态向量的维度
      sample()从空间中随机取一个值,在回合重置时常用到
      seed()设定随机种子,效果就是定死其内部生成随机数的机制,是每次生成的结果不变
      contains(obj)判断空间中是否包含obj
      high上届
      low下界
    • 动作空间env.action_space

      其动作空间是这样一个类型

      1584065624978

      在自定义环境时可以这样构造动作空间,其中

      属性/方法作用
      sample()从空间中随机取一个值,在回合重置时常用到
      seed()设定随机种子,效果就是定死其内部生成随机数的机制,是每次生成的结果不变
      contains(obj)判断空间中是否包含obj
      n动作空间中的动作个数(连续空间中就没有这个了)
    • 使用实例

      print(env.action_space)
      print(env.observation_space)
      print(env.observation_space.low)
      print(env.observation_space.high)
      print(env.observation_space.shape)
      print(env.observation_space.sample())
      # Discrete(2)
      # Box(4,)
      # [-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,)
      # [-4.1981392e+00  1.1287736e+38 -3.8320544e-01 -2.4842601e+38]
      
  • 环境中的方法

    环境中一般都会有上面说到的父类中的方法,其中

    • step():用于编写智能体与环境交互的逻辑;它接受一个动作(action)的输入,根据action给出下一时刻的状态(state)、当前动作的回报(reward)、探索是否结束(done)及调试帮助信息信息。

      observation_, reward, done, info = env.step(action)
      
    • reset():用于在每轮开始之前重置并返回智能体的状态,这个状态通常会随机获得

      observation = env.reset()
      
    • render():可视化的关键部分,用来绘制画面

      env.render()
      

      我的大概理解就是根据当前状态刷新一帧

    • close():用来在程序结束时清理画布

      env.close()
      
  • 这里把关键部分放在这,更多的参见 本文全部代码

# 训练
for i_episode in range(2000):
    observation = env.reset()
    ep_r = 0
    while True:
        # env.render()  # 不进行可视化可以加速训练过程,取消注释可以观察训练过程
        action = RL.choose_action(observation)                          # 选择动作
        observation_, reward, done, info = env.step(action)             # 执行动作
        RL.store_transition(observation, action, reward, observation_)  # 存储 一步 的信息到记忆库
        ep_r += reward          # ep_r用来计算总回报
        if total_steps > 500:   # 待到记忆库中存有一些信息后,从里面抽取样本进行训练
            RL.learn()
        if done:                # 达到结束条件,结束本轮(跳出循环)
            if i_episode%20==0:
                print('episode: ', i_episode,
                      'ep_r: ', round(ep_r, 2),
                      )
            break

        observation = observation_  # 更新当前状态
        total_steps += 1
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

BBJG_001

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

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

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

打赏作者

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

抵扣说明:

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

余额充值