强化学习实战1:OpenAI Gym 实验环境介绍

环境配置

我的 torch 版本是 2.3.0,然后 gym 版本是 0.22.0,python 版本是 3.8 ,pygame 版本是 2.6.0 。

首先安装一下 gym:

pip install gym==0.22.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

然后安装一下 pygame:

pip install pygame -i https://pypi.tuna.tsinghua.edu.cn/simple

都安装好之后,可以写上下面的测试代码看是否能正常弹出一个游戏画面:

import gym  
env = gym.make('CartPole-v1')  
for _ in range(1000):  env.reset()  for _ in range(100):  env.render()  env.step(env.action_space.sample())  
env.close()

如果一切顺利,你将看到一个倒立摆小车在屏幕上移动,并随着时间步的推移而逐渐失去平衡。

环境介绍:以 CartPole-v0 为例

import gym# 1、介绍倒立摆基本的游戏环境env = gym.make('CartPole-v0')# 打印此时的游戏环境是什么 :<TimeLimit<OrderEnforcing<CartPoleEnv<CartPole-v0>>>>
print(env)# 打印其 action space:Discrete(2)
print(env.action_space)# 对该动作空间做随机采样,也就是随机取出其中一个动作,输出为 0 或 1,也就是往左或者往右
print(env.action_space.sample())# 打印观测空间,也就算 state space 状态空间,是一个意思
# 对于这个游戏环境,其 state space 有四个:
# 下标0表示小车位置,1表示小车速度,2表示锤的偏转角度,3表示锤的偏转角速度
# 补充:状态空间通常包含环境的完整信息,而观测空间可能只是部分信息;
# 在某些情况下,观测空间和状态空间可能是相同的,即智能体可以完全观察到环境的状态,
# 这样的环境被称为完全可观测(Fully Observable)。
# 在这个例子中,二者等价。
# 输出:Box([-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,), float32)
print(env.observation_space)# 然后可以打印看一下其边界情况
# 输出:[-4.8000002e+00 -3.4028235e+38 -4.1887903e-01 -3.4028235e+38]
print(env.observation_space.low)
# 输出:[4.8000002e+00 3.4028235e+38 4.1887903e-01 3.4028235e+38]
print(env.observation_space.high)# 我们同样可以对状态空间进行随机采样
print(env.observation_space.sample())"""
我们并不直接操作状态,我们操作或者说选择的是 action,我们在 action space 中基于一定策略会选择一个 action。
然后作用在这个环境上使得环境状态转移到一个新的环境状态。
状态空间和动作空间环境已经给定了,此外还需要什么?我们还需要做下面两件事情:当我们在当前 t 时刻(意味着此时状态为 st)选择了一个 action at,那么
我们将会得到一个 reward,称为 rt,同时因为在 st 状态下采取了 at 行为,状态 st 也将转移到 s(t+1) 状态下。而实际上环境已经给了一个 step 函数,在这个函数内完成了上述两个步骤。
"""# 来查看一下 step 函数内容
help(env.step)
# 输出如下
"""
step(action) method of gym.wrappers.time_limit.TimeLimit instanceRun one timestep of the environment's dynamics. When end ofepisode is reached, you are responsible for calling `reset()`to reset this environment's state.Accepts an action and returns a tuple (observation, reward, done, info).Args:action (object): an action provided by the agentReturns:observation (object): agent's observation of the current environmentreward (float) : amount of reward returned after previous actiondone (bool): whether the episode has ended, in which case further step() calls will return undefined resultsinfo (dict): contains auxiliary diagnostic information (helpful for debugging, logging, and sometimes learning)
"""

上面的代码是 CartPole 环境的一些介绍和简单使用,而下面的代码则是采用上面介绍的内容让 action 和 environment 交互实战感受一下:

# 2、尝试用 action 和 env 交互
done = False
score = 0
# env.reset()函数的主要作用是将环境重置到其初始状态,并返回这个初始状态给调用者
state = env.reset()while not done:# 可视化窗口展现env.render()# 从 action space 中随机采取一个 actionaction = env.action_space.sample()# 将该 action 传入 env 的 step 中完成 reward 的计算和状态转移observation, reward, done, info = env.step(action)# 统计一下这一轮下来总共获得了多少分数score += reward
print(f'total reward:{score}')

运行结果如下(两部分代码的运行结果一起打印了):

在这里插入图片描述

另外如果够专注的话,是能够看到有个画面在屏幕上一闪而过的,对于这个闪退的问题我们后面会解决。

解决闪退问题:将env保存为一个 mp4 / gif

之前的代码闪退太快,来看一下一个比较缓慢的效果:

import gym
import time
env_name = "CartPole-v0"
env = gym.make(env_name)state = env.reset()
done = False
total_reward = 0while not done:env.render()action = env.action_space.sample()# 打印随机采样的actionprint(action)observation, reward, done, info = env.step(action)total_reward += reward# 加一点延迟time.sleep(0.2)
print(total_reward)

运行效果如下:

在这里插入图片描述

因为渲染出来的摆锤效果是动态的,因此这里就不再展示,但是你应该和我的效果一样,是能够看到它摆的过程的。

接下来我们要做的事情就是将这么一个动态变化的过程给保存下来,怎么保存?其实重点在 env 中的 render 方法,默认情况下,我们调用 render 方法其有一个参数 mode,默认值为 “human”,其返回值为一个个 bool 值,即是否打开。

此时我们可以将这个默认值改成 “rgb_array”,此时 render 的返回将是当前时刻图像的 rgb 数值数组,这样的话我们就实现了将其放入内存里面的操作。

import gym
import time
env_name = "CartPole-v0"
env = gym.make(env_name)state = env.reset()
done = False
total_reward = 0
# 定义一个帧数组,用来存下每一帧的 rgb 数据
frames = []
while not done:frames.append(env.render(mode="rgb_array"))action = env.action_space.sample()# 打印随机采样的actionprint(action)observation, reward, done, info = env.step(action)total_reward += reward# 加一点延迟time.sleep(0.2)
print(total_reward)
# 再打印一下 frames 数组的一些信息,以更形象化的理解它
print(len(frames))
print(frames[0].shape)

运行结果如下:

在这里插入图片描述

可以看到这一次只进行了十四轮小锤就倒了,因此 frames 数组的大小为 14,然后每一帧图片的形状为 (400, 600, 3),一个彩色图像。

接下来我们就可以通过一些第三方的工具包,来实现保存为 mp4 的功能了:

# 引入将 env 保存为 mp4 所需要的包,主要是一个图表包 pyplot 和一个动画包 animation
import matplotlib.pyplot as plt
from matplotlib import animationdef display_frames_to_video(frames):plt.figure(figsize=(frames[0].shape[0]/72, frames[0].shape[1]/72), dpi=72)plt.axis("off")patch = plt.imshow(frames[0])def animate(i):patch.set_data(frames[i])anim = animation.FuncAnimation(plt.gcf(), animate, frames=range(len(frames)),interval=50)anim.save("cartpole.mp4")# 保存为 gif 也很简单:# anim.save("cartpole.gif", writer="imagemagick")
display_frames_to_video(frames)

提一嘴:plot 是英文图表的意思,animation 是英文定格动画的意思

运行结果如下:

在这里插入图片描述

可以看见已经生成了我们想要的 mp4 文件。

对于上面的这一段代码,使用 GPT 给出了一个比较详尽的解释,知道怎么用就行:

在这里插入图片描述
在这里插入图片描述

对于动画处理这种标准工具代码的流程是比较固定的,大概知道怎么回事就行,用的时候直接 CV。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Linux服务器CPU占用率达到100%排查思路

1、找到最耗CPU的进程pid&#xff0c;执行命令 top 2、找到最耗CPU的线程tid // 执行 top -Hp [pid] 定位应用进程对应的线程 tid // 按shift p 组合键&#xff0c;按照CPU占用率排序 > top -Hp 14246 3、将线程pid转化为16进制 // printf "%x\n" [tid] 将tid…

Sharding-JDBC分库分表之SpringBoot主从配置

Sharding-JDBC系列 1、Sharding-JDBC分库分表的基本使用 2、Sharding-JDBC分库分表之SpringBoot分片策略 3、Sharding-JDBC分库分表之SpringBoot主从配置 前言 在开发中&#xff0c;如果对数据库的读和写都在一个数据服务器中操作&#xff0c;面对日益增加的访问量&#x…

无法找到模块“@wangeditor/editor-for-vue”的声明文件

vue3项目中使用wangeditor/editor遇到的问题 开发环境不管红线报错正常使用 打包的时候就会报错了 1.安装依赖 pnpm install --save wangeditor/editor wangeditor/editor-for-vuenext 2.遇到的问题 3.解决方法 在src目录下面创建 wangeditor-types.d.ts 文件 代码如下 de…

【ai_agent】从零写一个agent框架(五)基于egui制作一个agent/workflow在线编辑器

前言 上篇我们实现了基础节点&#xff0c;并暴露出grpc服务&#xff0c;但是手动编辑文本制作一个workflow实在强人所难。 所以本文我们做个webui自动生成workflow。 开搞之前先看看别人怎么做的。 Dify 的ui 效果如下图示&#xff1a; 支持多种功能节点 但只能打开一个节…

【线性表,线性表中的顺序表和链表】

目录 1、线性表的定义和基本操作1.1、线性表的定义1.2、线性表的基本操作 2、顺序表和链表的比较2.1、顺序表2.1.1、顺序表的定义和特点2.1.2、顺序表的实现&#xff08;1&#xff09;顺序表的静态分配&#xff1a;&#xff08;2&#xff09;顺序表的动态分配 2.1.3、顺序表的基…

基于正点原子的FreeRTOS笔记——队列

一、什么是队列 队列是任务到任务、任务到中断、中断到任务数据交流的一种机制。 在队列中可以存储数量有限、大小固定的数据。队列中的每一个数据叫做“队列项目”&#xff0c;队列能够存储“队列项目”的最大数量称为队列的长度。 在创建队列时要指定队列长度以及队列项目…

蹭一个围棋亚军!不要和低维的人说话——早读(逆天打工人爬取热门微信文章解读)

熬夜后需要补什么呢&#xff1f; 引言Python 代码第一篇 洞见 不要和低维的人说话&#xff08;深度好文&#xff09;第二篇 冲冲冲结尾 引言 昨晚真的是熬夜又想不出东西 真的头大 最近下围棋 这个棋感很好呀 我是K级选手 目前是8级 套几个buff 纯自学 为什么决定学围棋呢? 是…

翰德恩咨询赋能材料行业上市公司,共筑IPD管理体系新篇章

赋能背景概览 坐落于江苏的某材料行业领军企业&#xff0c;作为国内无机陶瓷膜元件及成套设备领域的佼佼者&#xff0c;以其庞大的生产规模、丰富的产品系列及卓越的研发实力&#xff0c;屹立行业之巅二十余年。公司不仅在新材料研发、技术创新、工艺设计、设备制造及整体解决…

swift与Internvl下的多模态大模型分布式微调指南(附代码和数据)

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 基于Dify的智能分类方案&#xff1a;大模型结合KNN算法&#xff08;附代码&#xff…

InavFlight飞控固件学习-1《开发环境搭建》

目录 文章目录 目录摘要1.官网2.形成Linux开发环境工具2.1 简介2.2 相关工具2.2.1 Ubuntu / Debian系统配置命令2.2.2 Fedora系统配置命令2.2.3 Fedora系统配置命令 2.3 克隆存储库2.4 构建工具2.5 使用cmake2.6 构建固件2.7 清除2.8 cmake 缓存维护2.9 编译通过ninja2.10 更新…

小程序跳企业微信教程

来别急&#xff0c;我说几个点&#xff0c;你先记着&#xff0c; 必须真机才能测必须要企业微信里头去配置下关联到对应的小程序&#xff08;文章底部有图&#xff09;要同一个公司主体&#xff01; 说说几个报错&#xff0c; 一、代码其实就这么一个&#xff0c;你别在微信…

virtuoso:layout如何做flat修drc

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 有些drc在virtuoso layout中修更节省时间&#xff0c;比如遇到一些via array需要做删改时&#xff0c;发现工具把via array做成了一个cell&#xff0c;如图。 去改cell可能会影…

高考志愿怎么选专业,哪些是热门专业?

选专业看上去非常简单&#xff0c;但是真正做起来的时候确实不容易&#xff0c;因为对于很多结束高考的学生来说&#xff0c;选专业就意味着他们选择自己的未来&#xff0c;这可是直接关系到未来的学习和职业发展&#xff0c;关系到将来的就业方向&#xff0c;再加上现在的社会…

逆向案例十一——华强北登录逆向

网址&#xff1a;aHR0cHM6Ly9wYXNzcG9ydC5ocWV3LmNvbS9sb2dpbg 登陆页面&#xff1a; 打开开发者工具会出现debugger调试&#xff1a; 直接使用一律不再此处暂停即可。点击登录&#xff0c;找到登录包。 发现有三个参数进行了加密&#xff0c;分别是Password,UserName和Devic…

如何修复 wxpython 事件调用?

1、问题背景 在使用 wxpython 开发 GUI 时&#xff0c;遇到了一个问题。当鼠标悬停在 BitmapButton 上时&#xff0c;会同时调用两个事件&#xff1a; self.Bind(wx.EVT_LEAVE_WINDOW, self.onPanelMouseLeave)self.Bind(wx.EVT_ENTER_WINDOW, self.onPanelMouseOver) 这导致…

解决U盘识别不了的一个小思路

我的U盘在自己在其他地方能正常使用&#xff0c;但是到了自己电脑突然就用不了了&#xff0c;其他设备也同样在自己电脑可以正常读写。 看了经验贴&#xff0c;大多是在设备管理器设置启动&#xff0c;但我的U盘明显不是这个问题。后面我看到一个贴子上的一个评论&#xff0c;想…

MQ四兄弟:如何保证消息顺序性

在当今的分布式系统架构中&#xff0c;消息队列&#xff08;MQ&#xff09;是不可或缺的组成部分。它们在确保系统组件之间高效通信方面发挥着关键作用。特别是在金融交易、物流跟踪等对消息处理顺序有严格要求的场景中&#xff0c;消息队列的顺序性保证显得更为重要。接下来&a…

本地电脑连接FTP服务器,显示无权限连接?

问题&#xff1a; 打开文档&#xff0c;在这一栏输入ftp服务器地址&#xff0c;按下回车&#xff0c;弹出无权限提示。 解决方案&#xff1a; 1、系统设置——网络和Internet——网络和共享中心 2、Internet选项 3、高级——取消“使用被动FTP”的勾选

@RequestBody注解的使用及源码解析

前言 RequestBody 注解是我们进行JavaEE开发&#xff0c;最常见的几个注解之一&#xff0c;这篇博文我们以案例和源码相结合&#xff0c;帮助大家更好的了解 RequestBody 注解 使用案例 1.自定义实体类 Data NoArgsConstructor AllArgsConstructor public class User {priv…