相关文章:

【一】gym环境安装以及安装遇到的错误解决

【二】gym初次入门一学就会-简明教程

【三】gym简单画图

【四】gym搭建自己的环境,全网最详细版本,3分钟你就学会了!

【五】gym搭建自己的环境____详细定义自己myenv.py文件

【六】gym搭建自己环境升级版设计,动态障碍------强化学习


gym简明教程

创建CartPole-v0的环境.

  1. import gym
  2. env = gym.make('CartPole-v0')
  3. env.reset()
  4. for i in range(1000):
  5. env.render()
  6. env.step(env.action_space.sample()) # take a random action
  7. env.close()

代码含义:

  • reset(self):重置环境的状态,返回观察。
  • step(self, action):推进一个时间步长,返回observation, reward, done, info。
  • render(self, mode=‘human’, close=False):重绘环境的一帧。默认模式一般比较友好,如弹出一个窗口。
  • close(self):关闭环境,并清除内存。

注释:导入gym库,第2行创建CartPole-v0环境,并在第3行重置环境状态。在for循环中进行1000个时间步长(timestep)的控制,第5行刷新每个时间步长环境画面,第6行对当前环境状态采取一个随机动作(0或1),最后第7行循环结束后关闭仿真环境。

同时本地会渲染出一个窗口进行模拟如下图:

关于Space的说明

在上面的代码中, 我们可以看到我们每一次的action都是随机进行取值的. 事实上, 每一个环境都有action_space和observation_space.(Every environment comes with an action_space and an observation_space)

以CartPole-v0来作为例子.

首先我们来看action_spaces, 这个代表可以采取的action的种类, 在CartPole-v0的例子中, 可以采取的action的种类只有两种. 我们看一下下面的示例.

  1. import gym
  2. env = gym.make('CartPole-v0')
  3. print(env.action_space)
  4. #> Discrete(2)
  5. print(env.observation_space)
  6. #> Box(4,)
  • action_space 是一个离散Discrete类型,从discrete.py源码可知,范围是一个{0,1,…,n-1} 长度为 n 的非负整数集合,在CartPole-v0例子中,动作空间表示为{0,1}。

对于observation_space. 则查看这个space的shape四个边界的上界和下界(能取到的最大值和最小值)

  1. print(env.observation_space.high)
  2. print(env.observation_space.low)
  3. [4.8000002e+00 3.4028235e+38 4.1887903e-01 3.4028235e+38]
  4. [-4.8000002e+00 -3.4028235e+38 -4.1887903e-01 -3.4028235e+38]

observation_space 是一个Box类型,从box.py源码可知,表示一个 n 维的盒子,所以在上一节打印出来的observation是一个长度为 4 的数组。数组中的每个元素都具有上下界。

利用运动空间和观测空间的定义和范围,在许多仿真环境中,BoxDiscrete是最常见的空间描述,在智体每次执行动作时,都属于这些空间范围内,代码示例为:

  1. from gym import spaces
  2. space = spaces.Discrete(6)
  3. # Set with 6 elements {0, 1, 2, ..., 6}
  4. x = space.sample()
  5. print(space.contains(x))
  6. print(space.n == 6)
  7. True
  8. True

CartPole-v0栗子中,运动只能选择左和右,分别用{0,1}表示

对于step的详细说明

上面我们只是每次做随机的action, 为了更好的进行action, 我们需要知道每一步step之后的返回值. 事实上, step会返回四个值. 下面我们一一进行介绍.

  • 观测 Observation (Object):当前step执行后,环境的观测(类型为对象)。例如,从相机获取的像素点,机器人各个关节的角度或棋盘游戏当前的状态等;
  • 奖励 Reward (Float): 执行上一步动作(action)后,智能体( agent)获得的奖励(浮点类型),不同的环境中奖励值变化范围也不相同,但是强化学习的目标就是使得总奖励值最大;
  • 完成 Done (Boolen): 表示是否需要将环境重置 env.reset。大多数情况下,当 Done 为True 时,就表明当前回合(episode)或者试验(tial)结束。例如当机器人摔倒或者掉出台面,就应当终止当前回合进行重置(reset);
  • 信息 Info (Dict): 针对调试过程的诊断信息。在标准的智体仿真评估当中不会使用到这个info,

在 Gym 仿真中,每一次回合开始,需要先执行 reset() 函数,返回初始观测信息,然后根据标志位 done 的状态,来决定是否进行下一次回合。所以更恰当的方法是遵守done的标志.

  1. import gym
  2. env = gym.make('CartPole-v0')
  3. for i_episode in range(20):
  4. observation = env.reset()
  5. for t in range(100):
  6. env.render()
  7. print(observation)
  8. action = env.action_space.sample()
  9. observation, reward, done, info = env.step(action)
  10. if done:
  11. print("Episode finished after {} timesteps".format(t+1))
  12. break
  13. env.close()

done 为true时,控制失败,此阶段episode 结束。可以计算每 episode 的回报就是其坚持的t+1时间,坚持的越久回报越大.在上面算法中,agent 的行为选择是随机的,平均回报为20左右。

*再次说明gym模块中环境的常用函数

gym的初始化

  1. env = gym.make('CartPole-v0')
  2. # 定义使用gym库中的某一个环境,'CartPole-v0'可以改为其它环境
  3. env = env.unwrapped
  4. # unwrapped是打开限制的意思

gym的各个参数的获取

  1. env.action_space
  2. # 查看这个环境中可用的action有多少个,返回Discrete()格式
  3. env.observation_space
  4. # 查看这个环境中observation的特征,返回Box()格式
  5. n_actions=env.action_space.n
  6. # 查看这个环境中可用的action有多少个,返回int
  7. n_features=env.observation_space.shape[0]
  8. # 查看这个环境中observation的特征有多少个,返回int

刷新环境

  1. env.reset()
  2. # 用于一个done后环境的重启,获取回合的第一个observation
  3. env.render()
  4. # 用于每一步后刷新环境状态
  5. observation_, reward, done, info = env.step(action)
  6. # 获取下一步的环境、得分、检测是否完成。

实例应用

平衡杆测试代码:以AC算法为例,详细解析看下面链接分析。


  1. import numpy as np
  2. import tensorflow as tf
  3. import gym
  4. import tensorflow.compat.v1 as tf
  5. tf.disable_v2_behavior()
  6. tf.compat.v1.disable_eager_execution() #这句话可有可无
  7. np.random.seed(2)
  8. tf.set_random_seed(2) # reproducible
  9. # Superparameters
  10. OUTPUT_GRAPH = False
  11. MAX_EPISODE = 3000
  12. DISPLAY_REWARD_THRESHOLD = 200 # renders environment if total episode reward is greater then this threshold
  13. MAX_EP_STEPS = 1000 # maximum time step in one episode
  14. RENDER = False # rendering wastes time
  15. GAMMA = 0.9 # reward discount in TD error
  16. LR_A = 0.001 # learning rate for actor
  17. LR_C = 0.01 # learning rate for critic
  18. env = gym.make('CartPole-v0')
  19. env.seed(1) # reproducible
  20. env = env.unwrapped
  21. N_F = env.observation_space.shape[0]
  22. N_A = env.action_space.n
  23. class Actor(object):
  24. def __init__(self, sess, n_features, n_actions, lr=0.001):
  25. self.sess = sess
  26. self.s = tf.placeholder(tf.float32, [1, n_features], "state")
  27. self.a = tf.placeholder(tf.int32, None, "act")
  28. self.td_error = tf.placeholder(tf.float32, None, "td_error") # TD_error
  29. with tf.variable_scope('Actor'):
  30. l1 = tf.layers.dense(
  31. inputs=self.s,
  32. units=20, # number of hidden units
  33. activation=tf.nn.relu,
  34. kernel_initializer=tf.random_normal_initializer(0., .1), # weights
  35. bias_initializer=tf.constant_initializer(0.1), # biases
  36. name='l1'
  37. )
  38. self.acts_prob = tf.layers.dense(
  39. inputs=l1,
  40. units=n_actions, # output units
  41. activation=tf.nn.softmax, # get action probabilities
  42. kernel_initializer=tf.random_normal_initializer(0., .1), # weights
  43. bias_initializer=tf.constant_initializer(0.1), # biases
  44. name='acts_prob'
  45. )
  46. with tf.variable_scope('exp_v'):
  47. log_prob = tf.log(self.acts_prob[0, self.a])
  48. self.exp_v = tf.reduce_mean(log_prob * self.td_error) # advantage (TD_error) guided loss
  49. with tf.variable_scope('train'):
  50. self.train_op = tf.train.AdamOptimizer(lr).minimize(-self.exp_v) # minimize(-exp_v) = maximize(exp_v)
  51. def learn(self, s, a, td):
  52. s = s[np.newaxis, :]
  53. feed_dict = {self.s: s, self.a: a, self.td_error: td}
  54. _, exp_v = self.sess.run([self.train_op, self.exp_v], feed_dict)
  55. return exp_v
  56. def choose_action(self, s):
  57. s = s[np.newaxis, :]
  58. probs = self.sess.run(self.acts_prob, {self.s: s}) # get probabilities for all actions
  59. return np.random.choice(np.arange(probs.shape[1]), p=probs.ravel()) # return a int
  60. class Critic(object):
  61. def __init__(self, sess, n_features, lr=0.01):
  62. self.sess = sess
  63. self.s = tf.placeholder(tf.float32, [1, n_features], "state")
  64. self.v_ = tf.placeholder(tf.float32, [1, 1], "v_next")
  65. self.r = tf.placeholder(tf.float32, None, 'r')
  66. with tf.variable_scope('Critic'):
  67. l1 = tf.layers.dense(
  68. inputs=self.s,
  69. units=20, # number of hidden units
  70. activation=tf.nn.relu, # None
  71. # have to be linear to make sure the convergence of actor.
  72. # But linear approximator seems hardly learns the correct Q.
  73. kernel_initializer=tf.random_normal_initializer(0., .1), # weights
  74. bias_initializer=tf.constant_initializer(0.1), # biases
  75. name='l1'
  76. )
  77. self.v = tf.layers.dense(
  78. inputs=l1,
  79. units=1, # output units
  80. activation=None,
  81. kernel_initializer=tf.random_normal_initializer(0., .1), # weights
  82. bias_initializer=tf.constant_initializer(0.1), # biases
  83. name='V'
  84. )
  85. with tf.variable_scope('squared_TD_error'):
  86. self.td_error = self.r + GAMMA * self.v_ - self.v
  87. self.loss = tf.square(self.td_error) # TD_error = (r+gamma*V_next) - V_eval
  88. with tf.variable_scope('train'):
  89. self.train_op = tf.train.AdamOptimizer(lr).minimize(self.loss)
  90. def learn(self, s, r, s_):
  91. s, s_ = s[np.newaxis, :], s_[np.newaxis, :]
  92. v_ = self.sess.run(self.v, {self.s: s_})
  93. td_error, _ = self.sess.run([self.td_error, self.train_op],
  94. {self.s: s, self.v_: v_, self.r: r})
  95. return td_error
  96. sess = tf.Session()
  97. actor = Actor(sess, n_features=N_F, n_actions=N_A, lr=LR_A)
  98. critic = Critic(sess, n_features=N_F, lr=LR_C) # we need a good teacher, so the teacher should learn faster than the actor
  99. sess.run(tf.global_variables_initializer())
  100. if OUTPUT_GRAPH:
  101. tf.summary.FileWriter("logs/", sess.graph)
  102. for i_episode in range(MAX_EPISODE):
  103. s = env.reset()
  104. t = 0
  105. track_r = []
  106. while True:
  107. if RENDER: env.render()
  108. a = actor.choose_action(s)
  109. s_, r, done, info = env.step(a)
  110. if done: r = -20
  111. track_r.append(r)
  112. td_error = critic.learn(s, r, s_) # gradient = grad[r + gamma * V(s_) - V(s)]
  113. actor.learn(s, a, td_error) # true_gradient = grad[logPi(s,a) * td_error]
  114. s = s_
  115. t += 1
  116. if done or t >= MAX_EP_STEPS:
  117. ep_rs_sum = sum(track_r)
  118. if 'running_reward' not in globals():
  119. running_reward = ep_rs_sum
  120. else:
  121. running_reward = running_reward * 0.95 + ep_rs_sum * 0.05
  122. if running_reward > DISPLAY_REWARD_THRESHOLD: RENDER = True # rendering
  123. print("episode:", i_episode, " reward:", int(running_reward))
  124. break

更多实例教程可以参考我下面的文章在本地或者在parl中制作自己的游戏环境:

PaddlePaddlle强化学习及PARL框架{飞桨}

【一】-环境配置+python入门教学

【二】-Parl基础命令

【三】-Notebook、&pdb、ipdb 调试

【四】-强化学习入门简介

【五】-Sarsa&Qlearing详细讲解

【六】-DQN

【七】-Policy Gradient

【八】-DDPG

【九】-四轴飞行器仿真

都有详细原理分析和码源解释的。

【二】gym初次入门一学就会---代码详细解析简明教程----平衡杆案例的更多相关文章

  1. Python入门必学:递归函数正确的操作使用方法,案例详解

    递归函数,在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以 ...

  2. Jmeter(二十) - 从入门到精通 - JMeter监听器 -下篇(详解教程)

    1.简介 监听器用来监听及显示JMeter取样器测试结果,能够以树.表及图形形式显示测试结果,也可以以文件方式保存测试结果,JMeter测试结果文件格式多样,比如XML格式.CSV格式.默认情况下,测 ...

  3. Jmeter(二十一) - 从入门到精通 - JMeter断言 - 上篇(详解教程)

    1.简介 最近由于宏哥在搭建自己的个人博客可能更新的有点慢.断言组件用来对服务器的响应数据做验证,常用的断言是响应断言,其支持正则表达式.虽然我们的通过响应断言能够完成绝大多数的结果验证工作,但是JM ...

  4. Jmeter(二十三) - 从入门到精通 - JMeter函数 - 上篇(详解教程)

    1.简介 在性能测试中为了真实模拟用户请求,往往我们需要让提交的表单内容每次都发生变化,这个过程叫做参数化.JMeter配置元件与前置处理器都能帮助我们进行参数化,但是都有局限性,为了帮助我们能够更好 ...

  5. 小白学Python | 最简单的Django 简明教程

    作者:浅雨凉 来源:http://www.cnblogs.com/qianyuliang/p/6814376.html 一.Django简介 1. web框架介绍 具体介绍Django之前,必须先介绍 ...

  6. SLAM+语音机器人DIY系列:(二)ROS入门——4.如何编写ROS的第一个程序hello_world

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

  7. 使用Code First建模自引用关系笔记 asp.net core上使用redis探索(1) asp.net mvc控制器激活全分析 语言入门必学的基础知识你还记得么? 反射

    使用Code First建模自引用关系笔记   原文链接 一.Has方法: A.HasRequired(a => a.B); HasOptional:前者包含后者一个实例或者为null HasR ...

  8. Monitor HDU6514 二维差分入门学习

    Monitor HDU 6514 二维差分入门学习 题意 小腾有\(n*m\)的田地,但是有小偷来偷东西,在一片矩形区域上,有一部分区域是监控可以覆盖到的,这部分区域由一个或多个包含于该矩形区域的小矩 ...

  9. python入门灵魂5问--python学习路线,python教程,python学哪些,python怎么学,python学到什么程度

    一.python入门简介 对于刚接触python编程或者想学习python自动化的人来说,基本都会有以下python入门灵魂5问--python学习路线,python教程,python学哪些,pyth ...

  10. webpack入坑之旅(二)loader入门

    这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack 在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不 ...

随机推荐

  1. shell 里使用 sed awk

    1 在shell脚本里使用sed 需把''改为"" 2 在shell脚本里使用awk 正则里使用 变量加上单引 awk -F: '/^'$user_name'/{print $1, ...

  2. 【JAVA基础】错误捕获try-catch

    错误捕获try-catch 使用BaseController统一管理 项目结构 UserController package com.cy.store.controller; import com.c ...

  3. Printer Queue,UVa 12100 (自定义标记法 + 优先队列)

    题目描述: 我们需要用打印机打印任务.每个任务都有1~9间的优先级,优先级越高,任务越急. 打印机的运作方式:从打印队列里取出一个任务j,如果队列里有比j更急的任务,则直接把j放到打印队列尾部,否则打 ...

  4. 2017年第八届 蓝桥杯B组C/C++决赛题目

    部分题目示意图来自网络,所以会带水印 最后编辑时间: 2021年5月12日 统一声明 如果不写默认带有常用头文件 如果不表明主函数默认表示在 void solve(){} 默认使用 using nam ...

  5. 分布式搜索引擎 Elasticsearch 的架构分析

    一.写在前面 ES(Elasticsearch下文统一称为ES)越来越多的企业在业务场景是使用ES存储自己的非结构化数据,例如电商业务实现商品站内搜索,数据指标分析,日志分析等,ES作为传统关系型数据 ...

  6. xapian 搜索引擎介绍与使用入门

    Xapian 是一个开源搜索引擎库,使用 C++ 编写,并提供绑定(bindings )以允许从多种编程语言使用.它是一个高度适应性的工具包,允许开发人员轻松地将高级索引和搜索功能添加到自己的应用程序 ...

  7. 企业如何利用 Serverless 快速扩展业务系统?

    2022 年 9 月 24 日,阿里云用户组(AUG)第 12 期活动在厦门举办.活动现场,阿里云高级技术专家史明伟(花名:世如)向参会企业代表分享了<未来已来--从技术升级到降本提效>. ...

  8. 深度学习(三)——Transforms的使用

    一.Transforms的结构及用法 导入transforms from torchvision import transforms 作用:图片输入transforms后,可以得到一些预期的变换 1. ...

  9. Linux 文件目录配置及命令总结

    前言 在Linux中,一切皆文件,而每一个文件和目录都是从根目录开始的 Linux文件目录的作用 /bin目录:用来存放二进制可执行命令的目录,用户常用的命令都存在该目录下. /sbin目录:用来存放 ...

  10. go Print 和 反射

    0. 前言 在 小白学标准库之反射 reflect 篇中介绍了反射的三大法则.但并未给出具体示例介绍反射,感觉还是少了点什么.这里进一步通过fmt.Println 源码,查看反射如何使用的,算是对前文 ...