如果你是刚刚接触DRL的同学,那么本文的内容就是引你入胜的第一个小实验。
DRL的学习离不开理论知识,但更不能缺少实践!废话不多说我们直接开始。

0、 实验环境和包版本

① PyCharm 2022 Pro
② gym 0.25.2
③ python 3.8.16
④ numpy 1.23.5

1、初步了解Gym

关于gym(以及其他的库/包),了解它的最好方法我认为是直接看官方文档,因为官方的文档和说明永远是最权威最前沿的,你看再多的类似于这篇文章的学习分享,也都是二手内容,要知道这些Python库是在不断更新升级的,但是这些文章可能不会更新得那么快。在此我强烈建议当你慢慢熟悉这些环境、知识、框架的时候,可以试着通过阅读、查看官方文档这样的方式学习(只是个人建议,可能每个人适合的方式也不一样)。

官方文档链接(建议收藏):
Gym官方文档——Gym Documentation

打开之后就是这样的界面啦:
上图的这一段代码其实就可以直接复制粘贴到你的PyCharm中运行,注意这里的gym版本对应的是0.26.2。

图1中左侧是他的文档目录,新手可以从ENVIRONMENTS下的Classic Control(经典控制环境)开始了解,之前进入炼丹炉的测试代码也是用的gym的经典控制环境(比如小车上山:MountainCar-v0等)。

2、 强化学习代码框架

注意这里仅仅是gym版本为0.25.2的RL框架!不是完整代码!先不要急着跑它。

import gym                                               #导入gym库
env = gym.make("MountainCar-v0", render_mode = "human")   #导入/构建实验环境MountainCar-v0,当然你也可以导入其他环境
observation = env.reset()                              #重置环境/重置一个回合,env.reset()函数返回一个初始观测
agent = load_agent()                                   #load_agent()需要自己编写,是个类。可以理解为控制智能体的算法
for step in range(100):                                 #开始让agent和环境交互action = agent(observation)                          #给agent一个观测/状态,agent作出一个动作observation, reward, done, info = env.step(action)  #env.step()函数是环境在agent做出动作后的变化,返回4个值

以上代码仅仅是框架,直接粘贴在PyCharm里是跑不出东西的。
这几行代码展示了RL中智能体和环境之间的交互。具体来说,gym库为我们提供了很多环境,MountainCar-v0只是经典控制里的一个环境;我们导入环境后,利用env.reset()函数重置环境,并给予agent一个初始观测,也就是agent来到这个环境里看到的第一个画面;agent/load_agent()是需要我们自己创造的类,它应该包含我们我们设计的RL的算法,是智慧的结晶,agent类接收到一个观测后,应当依据你赋予的算法输出动作到环境中,与环境进行交互;那么环境在agent的输出动作的影响下,将新的状态/新的观测(observation)、agent刚刚做出的动作的奖励(reward)、游戏是否结束的标志(done)、以及环境的其他信息(info)返回给我们。

2.1、 认识环境

(gym version = 0.25.2)以MountainCar-v0为例:
这个环境将为你提供如下信息(在Gym Documentation中MountainCar-v0的介绍里面写的很清楚):

上图说:

  • Action Space是一个离散的(Discrete)动作空间,并且有3个动作;
  • Observation Shape (2,)说明观测是一个2维观测;
  • Observation HighObservation Low分别说明了观测值的上下界;由于一个观测是2维的,因此上界的第1个数据0.6代表了第1个维度的上界float值,第2个数据0.07对应了第2个维度的上界float值,下界同理。
  • 调用该环境MountainCar-v0就用函数gym.make("MountainCar-v0")即可。

注意:

  • 不同环境的观测Observation的维度是不同的,上下界是不同的;
  • 不同环境的动作空间Action Space也是不同的;
  • 观测空间和动作空间可以是离散的(Discrete)也可以是连续的(Continuous);
  • 在 Gym 库中,一般离散空间用 gym.spaces.Discrete 类表示,连续空间用 gym.spaces.Box 类表示
  • 环境会更新升级,也许过段时间gym会将MountainCar-v0升级为MountainCar-v1,因此调用环境报错时可以留意PyCharm给你的报错提示或去官网查看环境信息。

2.2、 观测空间


如上图图3所示:

  • 第一个观测0是小车在x轴方向的位置;
  • 第二个观测1是小车的速度;

如果想查看一个环境的观测空间,可以在Python Console中用print()打印相关信息:

import gym
env = gym.make("MountainCar-v0") #打印观测空间
print(env.observation_space)

Box([-1.2 -0.07], [0.6 0.07], (2,), float32)

print(env.observation_space.high)    #打印上界

[0.6 0.07]

print(env.observation_space.low) #打印下界

[-1.2 -0.07]

运行效果如下:

2.3、 动作空间


如上图(图5)所示:

  • 第一个动作0是向左加速;
  • 第二个动作1是不加速;
  • 第三个动作2是向右加速;

动作空间有离散动作空间(Discrete Action Space)和连续动作空间(Continuous Action Space)。
利用print()可以打印出相关信息,如:

import gym
env = gym.make("MountainCar-v0")
print(env.action_space)             #查看MountainCar-v0的动作空间

Discrete(3)

print(env.action_space.n)            #查看离散动作空间的动作个数

3

上述代码运行结果:

3、 测试代码

(gym version = 0.25.2
大致认识了MountainCar-v0环境后,我们可以跑一下测试代码了:

import gym                                               #导入gym
env = gym.make("MountainCar-v0")                     #导入环境MountainCar-v0,你也可以试试其他环境,比如CartPole-v0等
env.reset()                                             #初始化环境
for step in range(1000):                                #开始交互env.render()                                       #env.render()方法用于显示环境状态,渲染画面action = env.action_space.sample()                  #利用env.action_space.sample()方法在动作空间中随机抽取一个动作,并把这个动作赋给actionobservation, reward, done, info = env.step(action)   #把动作提交给环境,并存储环境反馈的信息print(observation, reward, done, info)               #打印环境反馈的信息
env.close()                                             #env.close()用于关闭显示窗口,应和env.render()成对存在,确保程序正常结束并释    放资源

运行结果如下:

4、 第1个实验的完整代码

注意:下列代码请在gym 0.25.2下运行
目前而言,我们没有介绍任何RL算法,因此这个实验只是一张gym环境的体验卡。
下列代码中BespokeAgent类并不是一个真正意义的智能体,由代码可见,他里面只包含了一些给定的数学表达式,因此他做出的动作只是靠这些表达式进行的,并没有实现真正的学习。因此下列代码只是一个让我们体会agent-env交互的体验代码。不建议直接复制粘贴,动手敲一敲,仔细读一下,会有自己的体会。

完整代码:

import gym
import numpy as npenv = gym.make("MountainCar-v0")                                                                   #构建实验环境class BespokeAgent:                                                                              #自定义的智能体类def __init__(self, env):pass                                                                                   def decide(self, observation):                                                              #决策position,velocity = observationlb = min(-0.09 * (position + 0.25) ** 2 + 0.03, 0.3 * (position + 0.9) ** 4 -0.008)ub = -0.07 * (position + 0.38) ** 2 +0.07if lb < velocity <ub:action = 2else:action = 0return actiondef learn(self, *args):                                                                        #学习passdef play_montecarlo(env, agent, render=False, train=False):episode_reward = 0.observation = env.reset()while True:if render:env.render()action = agent.decide(observation)next_observation, reward, done, _ = env.step(action)episode_reward += rewardif train:agent.learn(observation, action, reward, done)if done:breakobservation = next_observationreturn episode_rewardagent = BespokeAgent(env)
env.reset(seed=0)                                                              #重置一个回合,设置了一个随机数种子,只是为了方便复现实验结果,通常可以把seed=0删掉episode_reward = play_montecarlo(env, agent, render=True)
print("回合奖励={}".format(episode_reward))episode_rewards = [play_montecarlo(env, agent) for _ in range(100)]          #为了评估智能体性能求出连续交互100回合的平均奖励
print("平均回合奖励={}".format(np.mean(episode_rewards)))
env.close()   #关闭环境

注意:小车上山环境有一个参考的回合奖励值-110,如果连续 100 个回合的平均回合奖励大于-110,则认为这个任务被解决了。BespokeAgent 类对应的策略的平均回合奖励就在-110左右。测试智能体在 Gym 库中某个任务的性能时,习惯而言,一般最关心 100 个回合的平均回合奖励。当任务的连续 100 个回合的奖励大于一个指定值时,则认为这个任务被解决了。但实际上不是所有的任务都被指定了回合奖励值。对于没有指定值的任务,就无所谓了。

运行结果:

程序运行完后在Python Console里会打印出平均回合奖励:

DRL深度强化学习代码实战1——MountainCar-v0小车成功登顶相关推荐

  1. 首个深度强化学习AI,能控制核聚变,成功登上《Nature》

    编译 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 最近,DeepMind 开发出了世界上第一个深度强化学习 AI ,可以在模拟环境和真正的核聚变装置中实现对等离子体的自主控制. ...

  2. 【ICML2021】 9篇RL论文作者汪昭然:构建“元宇宙”和理论基础,让深度强化学习从虚拟走进现实...

    深度强化学习实验室 官网:http://www.neurondance.com/ 论坛:http://deeprl.neurondance.com/ 来源:转载自AI科技评论 作者 | 陈彩娴 深度强 ...

  3. 汪昭然:构建“元宇宙”和理论基础,让深度强化学习从虚拟走进现实

    作者 | 陈彩娴 深度强化学习的故事,可以追溯到2015年: 当时,位于英国伦敦的一家小公司 DeepMind 在<Nature>上发表了一篇文章"Human-level con ...

  4. 真的超越了波士顿动力!深度强化学习打造的 ANYmal 登上 Science 子刊

    编译:机器之心 深度强化学习开发出的机器人模型通常很难应用到真实环境中,因此机器人开发中鲜少使用该技术.然而这已经板上钉钉了吗?在两天前引发人工智能界关注的 ANYmal 机器人中,其机动性和适应性看 ...

  5. 【经典书籍】深度强化学习实战(附最新PDF和源代码下载)

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 深度强化学习可以说是人工智能领域现在最热门的方向,吸引了众多该领域优秀的科学家去发 ...

  6. 【2022·深度强化学习课程】深度强化学习极简入门与Pytorch实战

    课程名称:深度强化学习极简入门与Pytorch实战 课程内容:强化学习基础理论,Python和深度学习编程基础.深度强化学习理论与编程实战 课程地址:https://edu.csdn.net/cour ...

  7. 【Tensorflow教程笔记】深度强化学习(DRL)

    基础 TensorFlow 基础 TensorFlow 模型建立与训练 基础示例:多层感知机(MLP) 卷积神经网络(CNN) 循环神经网络(RNN) 深度强化学习(DRL) Keras Pipeli ...

  8. 基于深度强化学习的车道线检测和定位(Deep reinforcement learning based lane detection and localization) 论文解读+代码复现

    之前读过这篇论文,导师说要复现,这里记录一下.废话不多说,再重读一下论文. 注:非一字一句翻译.个人理解,一定偏颇. 基于深度强化学习的车道检测和定位 官方源码下载:https://github.co ...

  9. 深度强化学习(DRL)一:入门篇

    目录 前言 一.强化学习(RL)的基本概念 二.主要强化学习算法 2.1 Qlearning 2.2 Deep-Qlearning 2.3 Double-DQN 2.4 Sarsa 2.5 Sarsa ...

最新文章

  1. swift集成alamofire的简单封装
  2. 麻省理工人工智能实验室发现更小更容易训练的神经网络
  3. 打开AI芯片的“万能钥匙”
  4. Android的内存优化
  5. 【数据平台】Eclipse+Scala开发环境(本机和集群两个运行模式)
  6. Entity Framework中的Migrations
  7. 机器学习:如何在安卓上集成TensorFlow
  8. navicat premium 链接postgresql 无法加载表_PostgreSQL 每周新闻 2020311
  9. html复制文字兼容手机,JavaScript+Html5实现按钮复制文字到剪切板功能(手机网页兼容)...
  10. CF1063C Dwarves, Hats and Extrasensory Abilities
  11. 乐视跳过服务器验证,pandwonload不能登录?试试跳过启动验证
  12. 有没有用过苹果手机的人,使用后放弃苹果
  13. 机器学习Scikit-Learn相关文档汇总(ApacheCN)
  14. 微软Office Live Workspace测试版开放全球注册
  15. scala实现数值类型加法
  16. 谈java之GUI与安卓
  17. android仿iphone日期时间选择器,jquery仿苹果的时间/日期选择效果
  18. 国家开放大学《国际经济法》第二章 国际货物买卖法 边学边练
  19. 推荐系统遇上深度学习(十二)--推荐系统中的EE问题及基本Bandit算法
  20. Reentrantlock和其搭档Condition —————— 开开开山怪

热门文章

  1. 便携式明渠流量计的使用特点
  2. EChart案例-圆形环比图
  3. c++ sstream
  4. AS3933国产替代SI3933 125kPKE车钥匙方案
  5. VMware虚拟机黑屏解决
  6. java 实现注册调用短信验证码(网建SMS短信通)
  7. 北理工研究团队在脑-控移动机器人上取得重要进展
  8. 小型学生计算机怎样玩cf,教您笔记本玩cf如何调全屏操作详细方法
  9. msconfig蓝屏_关于MSConfig中修改引导造成开机蓝屏
  10. Ubuntu查看显卡型号 nvidia-smi