强化学习实践(三)基于gym搭建自己的环境

目录

前言

1.搭建环境

前言

1.1构建自己的环境文件

1.2 __init __

1.3 seed

1.4 step

1.5 reset

1.6 render

1.7 close

2.调用环境

2.1 注册

2.2 放入库中

2.3 测试

参考文献


前言

      为了减少训练成本,必须搭建合适的训练环境(仿真环境),在训练环境中测试算法,再将训练好的模型移植到真实的训练平台中。


      Openai的gym或者universe是当前最为流行的两个可以搭建训练环境的平台。支持Tensorflow和Pytorch等主流深度学习框架,但目前仅支持python语言。

      补充:可以直接用指令:pip show gym 找到安装目录,我的是 D:\anaconda3\lib\site-packages 

1.搭建环境

前言

自我搭建的环境可以视为一个类。主要包含:变量、函数。

变量:必须含有动作和状态,如self.states 状态空间,self.actions 动作空间,self.t 状态转移,self.rewards 回报,self.terminate_states 终止状态等。

函数包含:__init __ seed,step, reset, render, close。
 

1.1构建自己的环境文件

      以官方的MountainCarEnv为例。

      新建文件命名为grid_mdp.py,路径放在D:\anaconda3\lib\site-packages\gym\envs\classic_control中。

1.2 __init __

初始化一些参数,此处定义car的位置、大小、重量,推力大小,动作空间,观测空间。

    def __init__(self, goal_velocity=0):self.min_position = -1.2self.max_position = 0.6self.max_speed = 0.07self.goal_position = 0.5self.goal_velocity = goal_velocityself.force = 0.001self.gravity = 0.0025self.low = np.array([self.min_position, -self.max_speed], dtype=np.float32)self.high = np.array([self.max_position, self.max_speed], dtype=np.float32)self.viewer = Noneself.action_space = spaces.Discrete(3) # 动作空间,此处有三个动作空间,向左,不动,向右。self.observation_space = spaces.Box(self.low, self.high, dtype=np.float32) # 观测空间,环境中所能观测到的范围self.seed()

1.3 seed

      可以不设,但必须有这个模块。

随机种子:用于生成随机数的起始值或种子值,可以控制随机过程的可重复性。随机过程通常涉及到随机数的生成,例如在数据的划分、模型的初始化、参数的随机初始化等情况下。设置随机种子可以确保每次运行时使用相同的种子值,从而获得相同的随机数序列,使得实验或模型训练的结果可以重现。

好处

      结果可重现性:通过设置相同的随机种子,可以确保每次运行时获得相同的随机数序列,使实验结果可重现,方便调试和比较不同模型或算法的性能。

      模型比较:在比较不同模型或算法的性能时,使用相同的随机种子可以确保每个模型或算法在相同的随机条件下进行比较,消除了随机性对结果的影响。

      调试和开发:在调试和开发阶段,使用固定的随机种子可以使得结果可重现,方便定位问题和调整模型参数。

设置随机种子的方式可以归为以下三类

      设置为固定的整数值:如 random_state = 0。
      使用当前时间作为种子值:如 random_state = None 或 random_state = int(time.time())。
      使用其他可确定的值:如数据集的标识符或任务的编号。
 

    def seed(self, seed=None):self.np_random, seed = seeding.np_random(seed)return [seed]

1.4 step

      在训练环境中充当物理引擎,基于agent的运动学模型或动力学模型计算执行完当前输入动作(action)后,得到下一步的状态(state)和即时回报(reward),同时判断是否达到终止条件(done)。

    def step(self, action):assert self.action_space.contains(action), "%r (%s) invalid" % (action,type(action),)position, velocity = self.statevelocity += (action - 1) * self.force + math.cos(3 * position) * (-self.gravity)velocity = np.clip(velocity, -self.max_speed, self.max_speed)position += velocityposition = np.clip(position, self.min_position, self.max_position)if position == self.min_position and velocity < 0:velocity = 0done = bool(position >= self.goal_position and velocity >= self.goal_velocity)reward = -1.0self.state = (position, velocity)return np.array(self.state, dtype=np.float32), reward, done, {}

position, velocity = self.state:从self.state提取position, velocity(这里的初始值将在下一个reset函数中对其进行初始化)。

其后六行代码:根据运动学方程以及动力学方程对position, velocity进行更新。
done:判断智能体是否达到终止条件,此处终止条件为是否到达终点或是否到达指定速度
reward:这里是对每步进行惩罚以求最快到达山顶,reward不仅可以奖励也可以惩罚。reward如何设计影响训练速度。
return np.array(self.state, dtype=np.float32), reward, done, {}:返回值包括下一个状态(self.state),奖励(reward),完成状态(done)和调试接口({})。

state:包含智能体的运动学方程信息,编写智能体时可将所需的信息都加入其中,如无人机可加入俯仰角,xyz空间位置,速度,加速度等参数。
 

1.5 reset

      重置环境,将状态设置为初始状态,返回状态信息(不参与网络的计算)
补充: step中的state需要几个参数,这里就需要初始化几个参数。

    def reset(self):self.state = np.array([self.np_random.uniform(low=-0.6, high=-0.4), 0])return np.array(self.state, dtype=np.float32)

1.6 render

绘图函数,可以为空,但必须存在。

        screen_width = 600screen_height = 400world_width = self.max_position - self.min_positionscale = screen_width / world_widthcarwidth = 40carheight = 20if self.viewer is None:from gym.envs.classic_control import renderingself.viewer = rendering.Viewer(screen_width, screen_height)xs = np.linspace(self.min_position, self.max_position, 100)ys = self._height(xs)xys = list(zip((xs - self.min_position) * scale, ys * scale))self.track = rendering.make_polyline(xys)self.track.set_linewidth(4)self.viewer.add_geom(self.track)clearance = 10l, r, t, b = -carwidth / 2, carwidth / 2, carheight, 0car = rendering.FilledPolygon([(l, b), (l, t), (r, t), (r, b)])car.add_attr(rendering.Transform(translation=(0, clearance)))self.cartrans = rendering.Transform()car.add_attr(self.cartrans)self.viewer.add_geom(car)frontwheel = rendering.make_circle(carheight / 2.5)frontwheel.set_color(0.5, 0.5, 0.5)frontwheel.add_attr(rendering.Transform(translation=(carwidth / 4, clearance)))frontwheel.add_attr(self.cartrans)self.viewer.add_geom(frontwheel)backwheel = rendering.make_circle(carheight / 2.5)backwheel.add_attr(rendering.Transform(translation=(-carwidth / 4, clearance)))backwheel.add_attr(self.cartrans)backwheel.set_color(0.5, 0.5, 0.5)self.viewer.add_geom(backwheel)flagx = (self.goal_position - self.min_position) * scaleflagy1 = self._height(self.goal_position) * scaleflagy2 = flagy1 + 50flagpole = rendering.Line((flagx, flagy1), (flagx, flagy2))self.viewer.add_geom(flagpole)flag = rendering.FilledPolygon([(flagx, flagy2), (flagx, flagy2 - 10), (flagx + 25, flagy2 - 5)])flag.set_color(0.8, 0.8, 0)self.viewer.add_geom(flag)pos = self.state[0]self.cartrans.set_translation((pos - self.min_position) * scale, self._height(pos) * scale)self.cartrans.set_rotation(math.cos(3 * pos))return self.viewer.render(return_rgb_array=mode == "rgb_array")

开头设定画布的大小,以及智能体。

rendering.Line:画线

rendering.make_circle(10):画圆

rendering.Transform():添加旋转平移属性等

注意:可在奖励累积到一定程度时再调用绘图查看训练效果。可以减少资源浪费。

1.7 close

    def close(self):if self.viewer:self.viewer.close()self.viewer = None

2.调用环境

搭建好训练环境之后需要执行以下操作才可调用。

2.1 注册

      找到Gym的安装目录,就是说打开D:\anaconda3\Lib\site-packages\gym\envs文件夹,进而打开__init__.py文件加入以下内容。

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

id:是为了调用所构建的环境的时候起的名字
entry_point:是环境文件所在的位置,本例的文件放在D:\anaconda3\lib\site-packages\gym\envs\classic_control中

2.2 放入库中

      在D:\anaconda3\lib\site-packages\gym\envs\classic_control目录下的__init__.py文件中加入以下内容

from gym.envs.user.grid_mdp import GridEnv

grid_mdp:是训练环境的文件名

GridEnv:是该文件下的类。

2.3 测试

在项目中新建main.py

import gym
import numpy as np
import time
import sysenv = gym.make('GridWorld-v1') # 导入自己的环境env.reset()   # 初始化本场游戏的环境
env.render()    # 更新并渲染游戏画面
time.sleep(10)
env.close()
sys.exit()

参考文献

1.构建自己的gym训练环境 巨详细_gym自定义环境-CSDN博客

2.建立自己的gym环境并调用_gym 连续 环境-CSDN博客 

3.随机种子如何理解?_王摇摆的博客-CSDN博客 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/98772.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

聊聊僵尸进程

文章目录 1. 前言1.1 什么是僵尸进程1.2 为什么需要关注僵尸进程 2. 僵尸进程的产生2.2 为什么会产生僵尸进程2.3 举个栗子 3. 僵尸进程的影响3.1 僵尸进程为何会占用系统资源3.2 操作系统如何知道哪个资源需要被释放3.3 什么是进程表3.4 什么是PCB 5. 如何处理僵尸进程4.1 识别…

docker安装Jenkins完整教程

1.docker拉取 Jenkins镜像并启动容器 新版本的Jenkins依赖于JDK11 我们选择docker中jdk11版本的镜像 # 拉取镜像 docker pull jenkins/jenkins:2.346.3-2-lts-jdk11 2.宿主机上创建文件夹 # 创建Jenkins目录文件夹 mkdir -p /data/jenkins_home # 设置权限 chmod 777 -R /dat…

vue解决:Parsing error: No Babel config file detected for ....

报错信息 Parsing error: No Babel config file detected for C:\Users\Admin\Desktop\shabi\work\src\App.vue. Either disable config file checking with requireConfigFile: false, or configure Babel so that it can find the config files. 分析错误&#xff1a;没有检测…

2578. 最小和分割

给你一个正整数 num &#xff0c;请你将它分割成两个非负整数 num1 和 num2 &#xff0c;满足&#xff1a; num1 和 num2 直接连起来&#xff0c;得到 num 各数位的一个排列。 换句话说&#xff0c;num1 和 num2 中所有数字出现的次数之和等于 num 中所有数字出现的次数。 num…

Linux手记

常用的配置文件 文件作用/etc/profile系统级别的shell配置文件&#xff0c;它包含了系统中所有用户的默认环境变量和系统级别的全局配置信息/etc/apt/apt.conf配置APT&#xff08;Advanced Package Tool&#xff09;软件包管理器的行为&#xff0c;包括代理等/etc/apt/sources…

jmeter利用自身代理录制脚本

在利用代理录制脚本时一定要安装java jdk&#xff0c;不然不能录制的。 没有安装过java jdk安装jmeter后打开时会提示安装jdk&#xff0c;但是mac系统中直接打开提示安装jdk页面后下载的java并不是jdk&#xff08;windows中没有试验过&#xff0c;笔者所说的基本全部指的是在ma…

Linux从时间服务器同步时间

一、基本设定 自己的时间服务器&#xff1a;111.11.11.111 二、操作 查看当前时间命令&#xff1a;date&#xff0c;发现时间不一致。 同步命令&#xff1a;/usr/sbin/ntpdate 111.11.11.111 然后等待同步完成即可。 如果同步命令不可用&#xff0c;需要先安装Ntp服务&…

Qt事件机制

1.事件 Qt是用来开发基于窗口的程序,我们使用的基于窗口的应用程序都是基于事件,其主要的目的是回调(只有这样程序的效率才是最高的),所以在Qt内部为我们提供了一系列事件处理机制,当窗口事件产生后,事件会经过:事件派发-> 事件过滤->事件分发->事件处理 几个…

Can Large Language Models Understand Real-World Complex Instructions?

本文是LLM系列文章&#xff0c;针对《Can Large Language Models Understand Real-World Complex Instructions?》的翻译。 大型语言模型能理解现实世界的复杂指令吗? 摘要引言相关工作CELLO基准实验结论 摘要 大型语言模型(llm)可以理解人类指令&#xff0c;显示出它们在传…

70. 爬楼梯

70. 爬楼梯 原题 class Solution {public int climbStairs(int n) {if(n0||n1){return n;}//确定dp数组int[] dp new int[n1];//dp数组初始化dp[0]1;dp[1]1;//确定状态转移方程&#xff0c;进行遍历赋值for(int i2;i<n1;i){dp[i]dp[i-1]dp[i-2];}//返回结果return dp[n];…

智慧用电安全云监控系统

近年来&#xff0c;我国电气火灾频发&#xff0c;2017年至2019年&#xff0c;我国共之间发生发展电气控制火灾31.1万起&#xff0c;占全国进行火灾总量及伤亡风险损失的30&#xff05;以上&#xff0c;2019年全年共接报火灾23.3万起&#xff0c;电气火灾11.1万&#xff0c;占52…

2024眼博会/北京眼健康展/中国眼科医学展/近视矫正展

——2024第6届中国&#xff08;北京&#xff09;国际青少年眼健康产业展览会The 2024 sixth China (Beijing) International Youth eye health industry exhibition&#xff0c;将于2024年4月10-12日&#xff0c;在北京亦创国际会展中心盛大举办。主题&#xff1a;呵护好孩子的…

c++ 变量、常量、基本数据类型

文章目录 变量标识符作用域常量基本数据类型整型无符号字符类型bool类型浮点类型字面值赋值时自动类型转换 变量 变量的数据类型 int 数据类型 变量名;#include<iostream> using namespace std;int main() {// 定义变量int a 1, b;b 10;cout << "a "…

mysql 物理备份及恢复

一、物理复制的基本概念 物理备份:直接复制数据库文件&#xff0c;适用于大型的数据库环境&#xff0c;不受存储引擎的限制&#xff0c;但不能恢复到不同的mysql版本 完整备份&#xff1a;也叫完全备份&#xff0c;每次将所有数据&#xff08;不管自第一次备份有没有修改过&…

JS-树:二叉树前序遍历(先序遍历)

文章目录 前言一、前序遍历-递归二、前序遍历-队列总结 前言 最近总结一下树的算法&#xff0c;研究树相关的知识。 一、前序遍历-递归 1、从根出发&#xff0c;然后左边然后右边 2、如下输入是&#xff1a;a b d e c f g // 前序遍历const tree {val: a,left: {val: b,left…

CMIP6数据处理及在气候变化、水文、生态等领域中的实践技术

全球气候模型&#xff08;Global Climate Model, GCM&#xff09;&#xff0c;亦称全球环流模型或全球大气模型&#xff0c;是一种数值模型&#xff0c;被广泛用于模拟地球的气候系统。GCM利用一系列的数学公式来描绘气候系统的各个主要组成部分&#xff0c;包括大气、海洋、冻…

Java spring boot 一次调用多个请求

Java Spring Boot是一种基于Java编程语言的开发框架&#xff0c;它提供了一种快速构建高效、可伸缩和易于维护的企业级应用程序的方式。在实际的应用开发中&#xff0c;我们常常需要调用多个独立的请求来完成某个业务功能。然而&#xff0c;传统的同步方式一次只能调用一个请求…

STM32实战项目——WIFI远程开关灯

前言 其实WIFI开关灯在几个月前就想做了&#xff0c;但是对于没有云平台调试经验的我&#xff0c;一开始有些摸不着头脑&#xff0c;所以就搁置了。十一假期与老同学聊天时了解到他也在做一个远程开关灯的小项目&#xff0c;所以就重新开始了WIFI远程开关灯的小项目。 本文使用…

QA-LORA: QUANTIZATION-AWARE LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS

本文是LLM系列文章&#xff0c;针对《QA-LORA: QUANTIZATION-AWARE LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS》的翻译。 Qa-lora:大型语言模型的量化感知低秩自适应 摘要1 引言2 相关工作3 提出的方法4 实验5 结论 摘要 近年来&#xff0c;大型语言模型(llm)得到了迅速…

设置Mysql数据库开启远程连接

1、在服务器端开启远程访问 进入mysql数据库&#xff0c;然后输入下面两个命令&#xff1a; grant all privileges on *.* to root% identified by password; flush privileges;第一个*是数据库&#xff0c;可以改成允许访问的数据库名称 第二个* 是数据库的表名称&#xff…