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

news2024/9/29 3:18:11

环境配置

我的 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 instance
    Run one timestep of the environment's dynamics. When end of
    episode 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 agent
    
    Returns:
        observation (object): agent's observation of the current environment
        reward (float) : amount of reward returned after previous action
        done (bool): whether the episode has ended, in which case further step() calls will return undefined results
        info (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 中随机采取一个 action
    action = 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 = 0

while not done:
    env.render()
    action = env.action_space.sample()
    # 打印随机采样的action
    print(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()
    # 打印随机采样的action
    print(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 animation

def 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.coloradmin.cn/o/1913658.html

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

相关文章

Nifi内置处理器Processor的开发

Nifi-Processor自定义开发的流程 之前说过&#xff0c;大部分的数据处理&#xff0c;我们可以基于ExcuseGroovyScript处理器&#xff0c;编写Groovy脚本去完成&#xff08;或者Jpython&#xff0c;Js脚本等对应的组件&#xff09;&#xff0c;只能说这是基于Nifi平台的使用层面…

Mxnet转Onnx 踩坑记录

0. 前言 使用将MXNET模型转换为ONNX的过程中有很多算子不兼容&#xff0c;在此对那些不兼容的算子替换。在此之前需要安装mxnet分支v1.x版本作为mx2onnx的工具&#xff0c;git地址如下&#xff1a; mxnet/python/mxnet/onnx at v1.x apache/mxnet GitHub 同时还参考了如下…

李良济“小儿推拿妈妈班”圆满结课,以中医智慧守护儿童健康成长!

孩子生场病&#xff0c;妈妈半条命&#xff01;作为妈妈最害怕的就是孩子生病&#xff0c;自己又无能为力&#xff01; 为了帮助妈妈们&#xff0c;正确应对孩子健康问题&#xff0c;日常生活中科学帮助孩子提升体质少生病&#xff01; 参加此次课程的&#xff0c;不仅有妈妈&a…

8.7结构体const使用场景

代码 #include <iostream> using namespace std; #include <string>//const使用场景//定义学生结构体 struct student {string name;int age;int score; };//将函数中的形参改为指针&#xff0c;可以减少内存空间&#xff0c;而且不会复制出新的副本 void printSt…

Spring Cloud LoadBalancer 入门与实战

一、什么是 LoadBalancer? LoadBalancer(负载均衡器) 是一种网络设备或软件机制&#xff0c;用于分发传入的网络流量负载&#xff08;请求&#xff09;到多个后端目标服务器上&#xff0c;从而实现系统资源的均衡利用和提高系统的可用性和新能。 1.1 负载均衡分类 负载均衡…

微信小程序中wx.navigateBack()页面栈返回上一页时执行上一页的方法或修改上一页的data属性值

let pages getCurrentPages();let prevPage pages[pages.length - 2]; // 获取上一个页面实例对象console.log(prevPage) //打印信息// 在 wx.navigateBack 的 success 回调中执行需要的方法wx.navigateBack({delta: 1, // 返回上一页success: function() {//修改上一页的属性…

Oracle基础以及一些‘方言’(二)

1、Oracle的查询语法结构 Oracle 的单表查询的语法结构&#xff1a; SELECT 1 FROM 2 WHERE 3 GROUP BY 4 HAVING 5 ORDER BY 6 其每个关键词的功能与MySQL中的功能已知&#xff0c;不过分页查询的关键词 limit 并不在Oracle的语法结构中。伪列&#xff1a; 在 Oracle 的表的使…

三品PLM管理系统软件:制造企业工程变更管理的革新者

在当今快速变化的市场环境中&#xff0c;制造企业面临着前所未有的挑战。客户需求的不断变化、供应链的波动、设计过程中的不确定性以及产品生命周期的缩短&#xff0c;都要求企业能够迅速响应并适应这些变化。工程变更管理作为企业响应市场变化、提升产品竞争力的关键环节&…

Loadlibrary failed with error 87:参数错误

问题描述&#xff1a; win10 系统在安装 Photoshop 2022 版后&#xff0c;点击桌面图标提示&#xff1a;Loadlibrary failed with error 87&#xff1a;参数错误&#xff0c;反复出现&#xff0c;反复确定&#xff0c;直至软件关闭。 解决方法&#xff1a; 1. 找到 C:\Window…

Kafka安装使用指南

Kafka是一种高吞吐量的分布式发布订阅消息系统。 Kafka启动方式有Zookeeper和Kraft&#xff0c;两种方式只能选择其中一种启动&#xff0c;不能同时使用。 【Kafka安装】 Kafka下载 https://downloads.apache.org/kafka/3.7.1/kafka_2.13-3.7.1.tgz Kafka解压 tar -xzf kafka_…

服务器数据恢复—raid5阵列热备盘没有激活导致阵列崩溃的数据恢复案例

服务器存储数据恢复环境&#xff1a; 一台EMC存储中有一组raid5磁盘阵列&#xff0c;划分1个lun供小型机使用&#xff0c;上层采用ZFS文件系统。 服务器存储故障&#xff1a; 一台有一组raid5磁盘阵列的存储在运行过程中突然崩溃。管理员检查发现存储中的raid5阵列有两块硬盘离…

大模型时代:人工智能与大数据平台的深度融合

在当今的大数据时代&#xff0c;数据已经成为驱动业务增长和创新的关键因素。与此同时&#xff0c;随着人工智能技术的不断进步&#xff0c;AI在大规模数据处理和分析方面的能力日益强大。因此&#xff0c;将人工智能与大数据平台相结合&#xff0c;可以为企业带来巨大的商业价…

✈️一文带你入门【NestJS】

✈️引言 在现代Web开发领域&#xff0c;框架和技术的迭代速度令人咋舌。其中&#xff0c;NestJS作为一款基于Node.js的后端框架&#xff0c;以其卓越的设计理念和强大的功能集&#xff0c;迅速吸引了众多开发者的眼球。本文将带你深入了解NestJS的起源、发展&#xff0c;以及…

LangChain教程 – 如何构建自定义知识聊天机器人

您可能已经了解到过去几个月发布的大量 AI 应用程序。您甚至可能已经开始使用其中的一些。 ChatPDF和CustomGPT AI等 AI 工具已经对人们变得非常有用——这是有充分理由的。您需要滚动浏览 50 页文档才能找到简单答案的日子已经一去不复返了。相反&#xff0c;您可以依靠 AI 来…

mysql 9 新特性

mysql9新特性 新特性Audit Log NotesC API NotesCharacter Set SupportCompilation NotesComponent NotesConfiguration NotesData Dictionary NotesData Type NotesDeprecation and Removal NotesEvent Scheduler NotesJavaScript ProgramsOptimizer NotesPerformance Schema …

Linux初始化新的git仓库

1.在git服务器上找到项目常部署的git地址可以根据其他项目的git地址确认 例如ssh://git192.168.10.100/opt/git/repository.git 用户名&#xff1a;git&#xff08;前面的是用户&#xff09; 服务器地址&#xff1a;192.168.10.100 git仓库路径&#xff1a;/opt/git/ 2.在服务器…

js 图片放大镜

写购物项目的时候&#xff0c;需要放大图片&#xff0c;这里用js写了一个方法&#xff0c;鼠标悬浮的时候放大当前图片 这个是class写法 <!--* Descripttion: * Author: 苍狼一啸八荒惊* LastEditTime: 2024-07-10 09:41:34* LastEditors: 夜空苍狼啸 --><!DOCTYPE …

IP 地址与 CDN 性能优化

内容分发网络&#xff08;CDN&#xff09;就是通过内容分配到离用户最优的服务器来提高访问速度。而IP地址如何分配与管理就是CND技术的基础。本文将来探讨介绍CDN中的IP地址分配与管理&#xff0c;以及如何通过CDN优化网络性能。 首先我们来了解CDN的基本原理 CDN是一种分布式…

数据库之DML

1&#xff0c;创建表 mysql> create table student(-> id int primary key,-> name varchar(20) not null,-> grade float-> );插入记录 mysql> insert into student values(1,monkey,98.5); Query OK, 1 row affected (0.01 sec)一次性插入多条记录 mysql…

百问网全志D1h开发板MIPI屏适配

MIPI屏适配 100ASK-D1-H_DualDisplay-DevKit V11 1. 显示适配 1.1 修改设备树 1.1.1 修改内核设备树 进入目录&#xff1a; cd /home/ubuntu/tina-d1-h/device/config/chips/d1-h/configs/nezha/linux-5.4修改board.dts: &lcd0 {lcd_used <1>;lcd…