一、gym环境分析

gym中三个重要的函数

env = gym.make(‘CartPole-v0’)env.reset()env.render()

1. 第一个函数用于创建环境,通常我们的环境文件存在目录为:gym目录文件/gym/envs/classic_control/环境.py,文件中会定义一个环境类,类中通常包括seed(), render(), reset(), step()等函数。

2. reset()为重新初始化函数,在强化学习算法中,智能体需要一次次地尝试,累积经验,然后从经验中学到好的动作。一次尝试我们称之为一条trajectory或一个episode. 每次尝试都要到达终止状态. 一次尝试结束后,智能体需要从头开始,这就需要智能体具有重新初始化的功能。函数reset()就是这个作用。

3. render()函数用于直观显示当前环境中物体的状态,扮演图像引擎的角色。使用时,通常引入rendering模块,用rendering模块中的画图函数进行图形的绘制。引用方式如下:

from gym.envs.classic_control import rendering

4. 此外,step()函数也至关重要。该函数描述了智能体与环境交互的所有信息,函数中,一般利用智能体的运动学模型和动力学模型计算下一步的状态和立即回报,并判断是否达到终止状态。当输入是动作a后,输出为:下一步状态,立即回报,是否终止(返回True或者False),调试项。

二、gym环境的构建

以找金币为例,创建自己的环境

1. 创建环境的本质是在py文件中定义一个环境类,然后在类中定义必要的函数。

import logging
import numpy
import random
from gym import spaces
import gymlogger = logging.getLogger(__name__)class GridEnv(gym.Env):metadata = {'render.modes': ['human', 'rgb_array'],'video.frames_per_second': 2}def __init__(self):self.states = [1,2,3,4,5,6,7,8] #状态空间self.x=[140,220,300,380,460,140,300,460]self.y=[250,250,250,250,250,150,150,150]self.terminate_states = dict()  #终止状态为字典格式self.terminate_states[6] = 1self.terminate_states[7] = 1self.terminate_states[8] = 1self.actions = ['n','e','s','w']self.rewards = dict();        #回报的数据结构为字典self.rewards['1_s'] = -1.0self.rewards['3_s'] = 1.0self.rewards['5_s'] = -1.0self.t = dict();             #状态转移的数据格式为字典self.t['1_s'] = 6self.t['1_e'] = 2self.t['2_w'] = 1self.t['2_e'] = 3self.t['3_s'] = 7self.t['3_w'] = 2self.t['3_e'] = 4self.t['4_w'] = 3self.t['4_e'] = 5self.t['5_s'] = 8self.t['5_w'] = 4self.gamma = 0.8         #折扣因子self.viewer = Noneself.state = Nonedef getTerminal(self):return self.terminate_statesdef getGamma(self):return self.gammadef getStates(self):return self.statesdef getAction(self):return self.actionsdef getTerminate_states(self):return self.terminate_statesdef setAction(self,s):self.state=sdef _step(self, action):#系统当前状态state = self.stateif state in self.terminate_states:return state, 0, True, {}key = "%d_%s"%(state, action)   #将状态和动作组成字典的键值#状态转移if key in self.t:next_state = self.t[key]else:next_state = stateself.state = next_stateis_terminal = Falseif next_state in self.terminate_states:is_terminal = Trueif key not in self.rewards:r = 0.0else:r = self.rewards[key]return next_state, r,is_terminal,{}def _seed(self, seed=None):self.np_random, seed = seeding.np_random(seed)return [seed]def _reset(self):self.state = self.states[int(random.random() * len(self.states))]return self.statedef _render(self, mode='human', close=False):if close:if self.viewer is not None:self.viewer.close()self.viewer = Nonereturnscreen_width = 600screen_height = 400if self.viewer is None:from gym.envs.classic_control import renderingself.viewer = rendering.Viewer(screen_width, screen_height)#创建网格世界self.line1 = rendering.Line((100,300),(500,300))self.line2 = rendering.Line((100, 200), (500, 200))self.line3 = rendering.Line((100, 300), (100, 100))self.line4 = rendering.Line((180, 300), (180, 100))self.line5 = rendering.Line((260, 300), (260, 100))self.line6 = rendering.Line((340, 300), (340, 100))self.line7 = rendering.Line((420, 300), (420, 100))self.line8 = rendering.Line((500, 300), (500, 100))self.line9 = rendering.Line((100, 100), (180, 100))self.line10 = rendering.Line((260, 100), (340, 100))self.line11 = rendering.Line((420, 100), (500, 100))#创建第一个骷髅self.kulo1 = rendering.make_circle(40)self.circletrans = rendering.Transform(translation=(140,150))self.kulo1.add_attr(self.circletrans)self.kulo1.set_color(0,0,0)#创建第二个骷髅self.kulo2 = rendering.make_circle(40)self.circletrans = rendering.Transform(translation=(460, 150))self.kulo2.add_attr(self.circletrans)self.kulo2.set_color(0, 0, 0)#创建金条self.gold = rendering.make_circle(40)self.circletrans = rendering.Transform(translation=(300, 150))self.gold.add_attr(self.circletrans)self.gold.set_color(1, 0.9, 0)#创建机器人self.robot= rendering.make_circle(30)self.robotrans = rendering.Transform()self.robot.add_attr(self.robotrans)self.robot.set_color(0.8, 0.6, 0.4)self.line1.set_color(0, 0, 0)self.line2.set_color(0, 0, 0)self.line3.set_color(0, 0, 0)self.line4.set_color(0, 0, 0)self.line5.set_color(0, 0, 0)self.line6.set_color(0, 0, 0)self.line7.set_color(0, 0, 0)self.line8.set_color(0, 0, 0)self.line9.set_color(0, 0, 0)self.line10.set_color(0, 0, 0)self.line11.set_color(0, 0, 0)self.viewer.add_geom(self.line1)self.viewer.add_geom(self.line2)self.viewer.add_geom(self.line3)self.viewer.add_geom(self.line4)self.viewer.add_geom(self.line5)self.viewer.add_geom(self.line6)self.viewer.add_geom(self.line7)self.viewer.add_geom(self.line8)self.viewer.add_geom(self.line9)self.viewer.add_geom(self.line10)self.viewer.add_geom(self.line11)self.viewer.add_geom(self.kulo1)self.viewer.add_geom(self.kulo2)self.viewer.add_geom(self.gold)self.viewer.add_geom(self.robot)if self.state is None: return None#self.robotrans.set_translation(self.x[self.state-1],self.y[self.state-1])self.robotrans.set_translation(self.x[self.state-1], self.y[self.state- 1])return self.viewer.render(return_rgb_array=mode == 'rgb_array')

2.将建好的环境进行注册,以便通过gym的标准形式进行调用

第一步:将我们自己的环境文件grid_mdp.py拷贝到gym安装目录/gym/gym/envs/classic_control文件夹中。(拷贝在这个文件夹中因为要使用rendering模块。当然,也有其他办法。该方法不唯一)

第二步:打开该文件夹(第一步中的文件夹)下的__init__.py文件,在文件末尾加入语句:

from gym.envs.classic_control.grid_mdp import GridEnv

第三步:进入文件夹你的gym安装目录/gym/gym/envs,打开该文件夹下的__init__.py文件,添加代码:

register(id='GridWorld-v0',entry_point='gym.envs.classic_control:GridEnv',max_episode_steps=200,reward_threshold=100.0,)

第一个参数id就是你调用gym.make(‘id’)时的id, 这个id你可以随便选取

第二个参数就是函数路口了。

后面的参数原则上来说可以不必要写。

经过以上三步,就完成了注册。

(上述代码复制的时候要注意最后一个括号顶格写)

最后进行一下验证

import gym
env = gym.make('GridWorld-v0')
env.reset()
env.render()

以上内容总结于《深入浅出强化学习——原理入门》。

另附:
作者的GitHub以及知乎专栏:
https://github.com/gxnk/reinforcement-learning-code

Gym环境分析及构建相关推荐

  1. 第22天:如何使用OpenAI Gym和Universe构建AI游戏机器人

    by Harini Janakiraman 通过哈里尼·贾纳基拉曼 第22天:如何使用OpenAI Gym和Universe构建AI游戏机器人 (Day 22: How to build an AI ...

  2. 强化学习(三) - Gym库介绍和使用,Markov决策程序实例,动态规划决策实例

    强化学习(三) - Gym库介绍和使用,Markov决策程序实例,动态规划决策实例 1. 引言 在这个部分补充之前马尔科夫决策和动态规划部分的代码.在以后的内容我会把相关代码都附到相关内容的后面.本部 ...

  3. ios jenkins_如何使用Jenkins和Fastlane制作iOS点播构建系统

    ios jenkins by Agam Mahajan 通过Agam Mahajan 如何使用Jenkins和Fastlane制作iOS点播构建系统 (How to make an iOS on-de ...

  4. 【强化学习实战】基于gym和tensorflow的强化学习算法实现

    [新智元导读]知乎专栏强化学习大讲堂作者郭宪博士开讲<强化学习从入门到进阶>,我们为您节选了其中的第二节<基于gym和tensorflow的强化学习算法实现>,希望对您有所帮助 ...

  5. 测试gym的cartPole 出错后的更改

    今天回去重新跑gym的cartPole用例,更新了包的版本后出现错误 python 版本:Python 3.9.13 gym版本:gym   0.26.2 网上看到的代码块: import gym # ...

  6. B站学强化学习?港中文周博磊变身up主,中文课程已上线

    本文经机器之心(微信公众号:almosthuman2014)授权转载,禁止二次转载 机器之心整理 众所周知,B 站是一个学习网站.在看完罗翔老师的刑法课之后,是时候探索人工智能了. 新冠疫情还未退散, ...

  7. TensorFlow应用实战-17-Qlearning实现迷宫小游戏

    七月 上海 | 高性能计算之GPU CUDA培训 7月27-29日三天密集式学习  快速带你入门阅读全文> 正文共2018个字,22张图,预计阅读时间14分钟. 什么是Q-learning Q是 ...

  8. 强化学习组队学习task01——基础

    强化学习 一.强化学习基础 二.序列决策过程(Sequential Decision Making) 1.奖励(rewards) 2.序列决策过程 3.动作空间(Action Spaces) 4.Ag ...

  9. Easy_RL 01:强化学习基础

    目录 0 Overview 1 RL概况 1.1 RL定义 1.2 RL中的建模问题 Environment & State Action Agent 2 RL实践(python) 3 RL应 ...

最新文章

  1. “BCH压力测试日”准备工作开启,将允许任何人参与测试
  2. I00031 Look-and-say sequence
  3. python【蓝桥杯vip练习题库】—BASIC-12十六进制转八进制
  4. antd table设置表格一个单元格的字体颜色_微软Office三件套,各有一个效率神器,全都知道的人不超过1%...
  5. phoenix 3.1 + hbase 0.94.21 的安装和使用
  6. linux用yum安装svn,linux下 yum安装svn
  7. SSL:Ubuntu证书配置
  8. jquerymobile使用技巧
  9. solr批量导入mysql_Windows系统环境下Solr之Java实战(二)配置从MySQL数据库批量导入索引...
  10. Java System.getProperty()
  11. android 5.0三星,转自【XDA】安卓(Android 5.0)L主题
  12. 8音度dsp调音教程_特伦诗DSP电脑调音教程 8音度DSP调音软件使用认知连载一
  13. k3 审核流程图_K3Cloud 业务流程图Sql
  14. 男孩子不上学了学计算机要学历吗,十三岁男孩不上学,能学什么手艺?
  15. H.264之lookahead
  16. 这个世界的本源不是物质,而是物质背后的基本秩序-柏拉图
  17. Matlab读取二进制数据文件
  18. python爬取公众号阅读量_公众号提升阅读量!免费推荐几个互阅推广平台.
  19. Android MIntegral广告SDK接入
  20. 【精选】JavaScript网页时钟

热门文章

  1. 操作系统OS linux实验日记
  2. 为什么一个byte的存储范围是-128~127?
  3. 【OKHTTP3】OKHTTP3使用GET和POST
  4. can not access a member of class xxx with modifiers “private“
  5. ucos II任务管理之三:删除任务
  6. 我与chatGPT的谈话从三个问题开始
  7. 创建收发文件的服务器端 客户端,TCP/IP网络编程 Chap.5 基于TCP的服务器端/客户端(2)...
  8. Newcomer先生的blog中文版的志愿者翻译已经招募
  9. codeforces round 717 div2 D
  10. Openfire 系统架构