强化学习实战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://www.mzph.cn/bicheng/44049.shtml

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

相关文章

AI究竟是在帮助开发者还是取代他们?来看大佬的观点你就明白了

AI&#xff08;人工智能&#xff09;在现代社会中扮演着越来越重要的角色&#xff0c;其在软件开发领域的应用也日益广泛。关于AI是在帮助开发者还是取代他们&#xff0c;V 哥个人认为&#xff0c;一半一半吧&#xff0c;为什么这么说&#xff0c;先不用噴&#xff0c;我们需要…

YOLOv8改进 | 注意力机制 | 增强模型在图像分类和目标检测BAM注意力【小白必备 + 附完整代码】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…

安防管理平台LntonCVS视频汇聚融合云平台智慧火电厂安全生产管理应用方案

中国的电力产业作为国民经济发展的重要能源支柱&#xff0c;被视为国民经济的基础产业之一。目前&#xff0c;我国主要依赖火力发电&#xff0c;主要燃料包括煤炭、石油和天然气等&#xff0c;通过燃烧转化为动能&#xff0c;再转变为电能输送至全国各地。火力发电量占全国发电…

【软件测试】 1+X初级 功能测试试题

【软件测试】 1X初级 功能测试试题 普通员工登录系统&#xff0c;在“个人信息维护”模块&#xff0c;可以查看和维护个人信息。个人信息维护需求包括用户&#xff08;UI&#xff09;页面、业务规则两部分。 UI 界面 个人信息维护 修改基本信息 业务规则 1. 个人信息维护页面…

CB-LLM 可信大模型,让大模型可解释

CB-LLM 可信大模型&#xff0c;让大模型可解释 提出背景解法拆解目的问题框架图第1步&#xff1a;概念生成第2步&#xff1a;自动概念评分&#xff08;ACS&#xff09;第3步&#xff1a;训练概念瓶颈层&#xff08;CBL&#xff09;第4步&#xff1a;学习预测器 例子&#xff1a…

图片批量重命名bat,一个脚本快速搞定图片批量重命名

BAT 批处理 是一种在 Microsoft Windows 操作系统中使用的脚本语言&#xff0c;用于自动执行一系列预定义的命令或任务。这些命令集合通常存储在一个文本文件中&#xff0c;文件扩展名为 .bat 或 .cmd。批处理脚本可以包含简单的命令&#xff0c;如文件复制、移动、删除&#x…

单片机中有FLASH为啥还需要EEROM?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 一是EEPROM操作简单&…

WebRTC API接口教程:实现高效会议的步骤?

WebRTC api接口教程如何使用&#xff1f;WebRTC api接口的功能&#xff1f; WebRTC无需中间服务器即可传输音视频流&#xff0c;为视频会议、在线教育等应用提供了强大的支持。AokSend将详细介绍如何利用WebRTC API接口实现高效会议的步骤。 WebRTC API接口教程&#xff1a;获…

2024年福州延安中学夏季拿云杯拔尖创新人才素养测试

1、选择题 那么&#xff0c;mn的值是&#xff08; &#xff09; A、1243 B、1343 C、4029 D、4049 2、填空题 一副扑克牌共54张&#xff0c;其中1到13点各有 4张&#xff0c;每个数字黑色红色各两张&#xff0c;还有两张王牌&#xff0c;至少要取出&#xff08; &#xff09;…

存储产品选型策略 OSS生命周期管理与运维

最近在看阿里云的 云存储通关实践认证训练营这个课程还是不错的。 存储产品选型策略、对象存储OSS入门、基于对象存储OSS快速搭建网盘、 如何做好权限控制、如何做好数据安全、如何做好数据管理、涉及对象存储OSS的权限控制、使用OSS完成静态网站托管、对OSS中存储的数据进行分…

论项目管理工作中的成本管理(20240528)

论项目管理工作中的成本管理 20240528 随着《“十四五”智能制造发展规划》的发布及其提出的2025发展目标及2035远景规划&#xff0c;国家对智能制造发展的重视程度进一步提升。生产制造企业对于智能制造转型的需求愈加迫切。2023年2月&#xff0c;XX电器制造企业为了解决企业…

前端直连小票打印机,前端静默打印,js静默打印解决方案

最近公司开发了一个vue3收银系统&#xff0c;需要使用小票打印机打印小票&#xff0c;但是又不想结账的时候弹出打印预览&#xff0c;找了很多方案&#xff0c;解决不了js打印弹出的打印预览窗口&#xff01; 没办法&#xff0c;自己写了一个winform版本的静默打印软件&#xf…

【鸿蒙学习笔记】Stage模型

官方文档&#xff1a;Stage模型开发概述 目录标题 Stage模型好处Stage模型概念图ContextAbilityStageUIAbility组件和ExtensionAbility组件WindowStage Stage模型-组件模型Stage模型-进程模型Stage模型-ArkTS线程模型和任务模型关于任务模型&#xff0c;我们先来了解一下什么是…

鸿蒙语言基础类库:【@ohos.util.ArrayList (线性容器ArrayList)】

线性容器ArrayList 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 …

基于Java中的SSM框架实现疫情冷链追溯系统项目【项目源码+论文说明】

基于Java中的SSM框架实现疫情冷链追溯系统演示 摘要 近几年随着城镇化发展和居民消费水平的不断提升&#xff0c;人们对健康生活方式的追求意识逐渐加强&#xff0c;生鲜食品逐渐受到大众青睐&#xff0c;诸如盒马鲜生、7-fresh等品牌生鲜超市&#xff0c;一时间如雨后春笋般迅…

合合信息大模型加速器重磅上线,释放智能文档全新可能

目录 0 写在前面1 高速文档解析引擎&#xff1a;拓宽大模型认知边界2 文本嵌入模型acge&#xff1a;克服大模型感知缺陷3 行业赋能&#xff1a;以百川智能为例总结 0 写在前面 随着人工智能技术的飞速发展&#xff0c;大模型以强大的数字处理能力和深度学习能力&#xff0c;不…

Canvas:掌握图像变换合成与裁剪状态像素操作

想象一下&#xff0c;用几行代码就能创造出如此逼真的图像和动画&#xff0c;仿佛将艺术与科技完美融合&#xff0c;前端开发的Canvas技术正是这个数字化时代中最具魔力的一环&#xff0c;它不仅仅是网页的一部分&#xff0c;更是一个无限创意的画布&#xff0c;一个让你的想象…

java使用poi-tl模版引擎导出word之if判断条件的使用

文章目录 模版中if语句条件的使用1.数据为False或空集合2.非False或非空集合 模版中if语句条件的使用 如果区块对的值是 null 、false 或者空的集合&#xff0c;位于区块中的所有文档元素将不会显示&#xff0c;这就等同于if语句的条件为 false。语法示例&#xff1a;{{?stat…

视图库对接系列(GA-T 1400)十四、视图库对接系列(本级)新增、修改订阅

说明 之前我们已经对接的设备,设备的话比较简单,是设备主动推送数据到平台的。 相信大家已经会了,那今天开始的话,我们来做对接平台,相对难点点。 但搞懂了核心的订阅流程的话,其实就不难了。 对接平台 订阅接口 订阅接口的话,有几个,添加、查询、更新、删除、取消…