大论文记录
基础知识回顾
1.强化学习(Agent、Environment)
在 RL 中,代理通过不断与环境交互、以试错的方式进行学习,在不确定性下做出顺序决策,并在探索(新领域)和开发(使用从经验中学到的知识)之间取得平衡。 (探索利用问题)
已经使用stable_baseline3做过一些列实验,sb3这个库相对简单,但是训练起来感觉并不是很好;
ElegantRL 在 Actor-Critic 框架下实现 DRL 算法,其中 Agent(又名 DRL 算法)由 Actor 网络和 Critic 网络组成。由于代码结构的完整性和简单性,用户能够轻松自定义自己的代理。

该开源库的框架很清楚的描述了运行流程,Run.py来实现Agent和Environment的交互;
ElegantRL 的文件结构如图 1 所示:
- Env.py:它包含代理与之交互的环境。
- 用于健身房环境修改的 PreprocessEnv 类。
- 以自建股票交易环境为例,进行用户自定义。
2. Net.py:有三种类型的网络:
- Q-Net,
- Actor Network、
- 评论家网络,
每个 API 都包括一个用于继承的基本网络和一组用于不同算法的变体。
3. Agent.py:它包含不同 DRL 算法的代理。
4. Run.py:提供训练和评估过程的基本功能:
- 参数初始化 /
- 训练环 /
- 计算器。
作为高级概述,文件之间的关系如下。在 Env.py 中初始化环境,在 Agent.py 中初始化代理。该代理是使用 Net.py 中的 Actor 和 Critic 网络构建的。在 Run.py 的每个训练步骤中,代理与环境交互,生成存储到 Replay Buffer 中的转换。然后,代理从 Replay Buffer 获取转换以训练其网络。每次更新后,评估器都会评估代理的性能,如果性能良好,则会保存代理。
该库每个DRL算法代理都遵循其基类中的层次结构

如图 2 所示,DQN 系列算法的继承层次结构如下:
- AgentDQN:标准 DQN Agent。
- AgentDoubleDQN:继承自 AgentDQN 的双 DQN 代理,具有两个用于减少高估的 Q-Net。
- AgentDuelingDQN:继承自 AgentDQN 的 Q 值计算不同 DQN 代理。
- AgentD3QN:AgentDoubleDQN 和 AgentDuelingDQN 的组合,继承自 AgentDoubleDQN。
class AgentBase:def init(self); def select_action(states); # states = (state, …) def explore_env(env, buffer, target_step, reward_scale, gamma);def update_net(buffer, max_step, batch_size, repeat_times); def save_load_model(cwd, if_save);def soft_update(target_net, current_net); class AgentDQN: def init(net_dim, state_dim, action_dim); def select_action(states); # for discrete action space def explore_env(env, buffer, target_step, reward_scale, gamma); def update_net(buffer, max_step, batch_size, repeat_times);def save_or_load_model(cwd, if_save); class AgentDuelingDQN(AgentDQN): def init(net_dim, state_dim, action_dim);class AgentDoubleDQN(AgentDQN): def init(self, net_dim, state_dim, action_dim);def select_action(states); def update_net(buffer, max_step, batch_size, repeat_times); class AgentD3QN(AgentDoubleDQN): # D3QN: Dueling Double DQN def init(net_dim, state_dim, action_dim);
在构建 DRL 代理时应用这样的层次结构可以有效地提高轻量级和有效性。用户可以在类似的流程中轻松设计和实施新代理。

基本上,一个智能体有两个基本功能,数据流如图所示:
- explore_env():它允许代理与环境交互并为训练网络生成转换。
- update_net() :它首先从 Replay Buffer 中获取一批 transitions,然后使用反向传播训练网络。
训练piple
train代理的两个主要步骤:
- 初始化:
- hyper-parameters 参数 args 的 Json 参数。
- env = PreprocessEnv() :创建一个环境(以 OpenAI gym 格式)。
- agent = AgentXXX() :为 DRL 算法创建代理。
- evaluator = Evaluator() :评估并存储经过训练的模型。
- buffer = ReplayBuffer() :存储过渡。
2. 然后,训练过程由 while 循环控制:
- agent.explore_env(...):代理在 Target Steps 中探索环境,生成转换,并将其存储到 ReplayBuffer 中。
- agent.update_net(...):代理使用 ReplayBuffer 中的批处理来更新网络参数。
- evaluator.evaluate_save(...):评估代理的性能,并保持经过训练的模型获得最高分。
while 循环将在满足条件时终止,例如,达到目标分数、最大步数或手动中断。
阅读ElegantRL框架,从Helloworld开始

1.正如这段所说,可以自己重新创建一个folder,并将net/agent/config/env/run.py文件加入并加入tutorial_*.py,然后运行tutorial。在代码中如下

2.同时也可以运行,因为从代码发现实际上是一样的,不过是将多个模块的代码集成到了一个py文件中;


了解结构之后从第一种方式去看代码,因为分成了不同模块更符合之后编写自己的环境以及接入算法的工作;

从这个教程上可以看到基本流程就是1.初始化智能体2.初始化环境3.配置参数的设定使用Config
4.训练


因此针对环境这一块需要去再看看gym。目前的疑问在于如果env_class不是gym.make。
env_class(**kwargs_filter(env_class.__init__, env_args.copy()))
该怎么使用?

看了GPT之后明白了,如果是else情况这里的env_class直接就相当于自定义的环境类,或则是来自其他库的非gym.make环境类;
GYM:
然后这里也回顾一下gym
- import gym
- env = gym.make('CartPole-v0')
- env.reset()
- for _ in range(1000):
- env.render()
- env.step(env.action_space.sample()) # take a random action
- env.close()
因为基于gym创建环境后可以注册到gym服务器,因此使用的时候使用注册名即可生成;
关于Observation Space 和 Action Space, 根据自己的应用场景设定;
对于 step 与返回的 obs, reward, done 与 info;
继承gym写环境就相当于一套模板,__init__(self,args), step(),reset() 这三个必须的

- import gym
- env = gym.make('CartPole-v0')
- env.reset()
- for _ in range(10):
- env.render()
- observation, reward, done, info = env.step(env.action_space.sample()) # take a random action
- print('observation:{}, reward:{}, done:{}, info:{}'.format(observation, reward, done, info))
- env.close()
上面的就是一个经典的 agent-environment 循环。agent 选择一个 action,环境返回一个observation 和 reward。就是如下图所示。

Gym进阶使用
Wrappers其实就相当于装饰器,在不改变原来的功能基础上可能对某些功能做一些增加;

这里如何调用了def action(),在gym.ActionWrappr里面封装的,动作输入之后实际上调用的是 RandomActionWrapper 中封装的 step 方法,而 RandomActionWrapper 继承自 gym.ActionWrapper。在这个过程中,动作会经过自定义的 action() 方法进行预处理。最后返回return self.env.step(final_action)


注册和删除:接上文代码中的部分,如何自定义环境后注册到gym

render():两种操作video和matplotlib
毕业设计按照后者做的,然后绘图代码基本上在render里面实现,test的时候并没有放到循环中实现。但是这里来开,plt.imshow()完全可以放到循环中,从而减少环境中显示的延迟;

整体看下来gym目前还是比较理解的,就是通过继承这个父类,然后自定义自己的环境,还可以通过wrapper,在自定义环境类生成示例后进行功能添加(装饰器的功能);
关于自定义环境注册,上述文本只提供了已有环境修改参数后的注册,至于如何针对自己自定义环境的注册,看下面的描述:

如何在 Gym 中注册自定义环境? - 知乎 (zhihu.com)
构建自己的gym训练环境 巨详细_gym自定义环境-CSDN博客
更加深入理解gym可以查看官方文档,已经更换团队维护,import gymnasium as gym
Basic Usage - Gymnasium Documentation (farama.org)
Basic Usage
Gymnasium is a project that provides an API for all single agent reinforcement learning environments, and includes implementations of common environments: cartpole, pendulum, mountain-car, mujoco, atari, and more.
这里已经说了这个API包括四个最关键的函数

gymnasium.envs.registry.keys() 就是一个字典查看键的操作,可以看到
dict_keys(['CartPole-v0', 'CartPole-v1', 'MountainCar-v0', 'MountainCarContinuous-v0', 'Pendulum-v1', 'Acrobot-v1', 'phys2d/CartPole-v0', 'phys2d/CartPole-v1', 'phys2d/Pendulum-v0', 'LunarLander-v2', 'LunarLanderContinuous-v2', 'BipedalWalker-v3', 'BipedalWalkerHardcore-v3', 'CarRacing-v2', 'Blackjack-v1', 'FrozenLake-v1', 'FrozenLake8x8-v1', 'CliffWalking-v0', 'Taxi-v3', 'tabular/Blackjack-v0', 'tabular/CliffWalking-v0', 'Reacher-v2', 'Reacher-v4', 'Pusher-v2', 'Pusher-v4', 'InvertedPendulum-v2', 'InvertedPendulum-v4', 'InvertedDoublePendulum-v2', 'InvertedDoublePendulum-v4', 'HalfCheetah-v2', 'HalfCheetah-v3', 'HalfCheetah-v4', 'Hopper-v2', 'Hopper-v3', 'Hopper-v4', 'Swimmer-v2', 'Swimmer-v3', 'Swimmer-v4', 'Walker2d-v2', 'Walker2d-v3', 'Walker2d-v4', 'Ant-v2', 'Ant-v3', 'Ant-v4', 'Humanoid-v2', 'Humanoid-v3', 'Humanoid-v4', 'HumanoidStandup-v2', 'HumanoidStandup-v4', 'GymV21Environment-v0', 'GymV26Environment-v0'])
环境构建完成之后;(插眼一下这个图很好可以用于答辩使用HH
但是存在的一个问题是,之前env.step返回的好像是4元组
看了一下版本用的是0.29.1,用的是5元组


我的调度任务中也是设置了终止状态和截断信号,到该就是跑完600个TTI算终止,然后在运行过程中不符合实际的调度时刻超过了600个TTI的50%可能就截止回合,然后reset重启环境;

这一部分也很重要,本身是MIMO系统,怎么把环境建模,
动作空间可以
1.建模成Discrete(如果考虑每次只选择单个用户)
2.MultiBinary(考虑一次性选出用户子集,目前使用)
3.看论文也发现存在连续动作空间采样离散值(在连续空间采样出多个用户,那么也可以使用Box)
4.如果能够做一个预分组,也可以使用MultiDiscrete (3.4两者非常一致,可看图片解释)


包装环境和获得原环境

2.兼容性:刚刚记得存在done的问题,下一篇就设计了环境的兼容性,大体意思就是说
1.以前的gym版本下注册的环境,可以通过特殊的这个环境名或者wrapper来实现;
2.对gymnasium低版本的环境,也有参数compatibility来实现;



这一节了解到了一个关键技巧,Reset这一步中表明info也已用来存储一些重要指标,和有效动作掩码。然后通过info中获取就可以比如说保存吞吐量或者公平性,因为本身step返回的是奖励,但是我们的奖励函数可能是多指标的组合,这个时候就将多个指标通过info返回,我们就可以用来分析训练的好坏。
同时这个动作掩码也提供了一种新思路:
obs, reward, terminated, truncated, info = env.step(action)
因为我只能根据obs_space给定的几个格式设置空间,那么如果现在我的环境状态时[H,J],空间该怎么设置呢?
我们可以只将H的shape设置为obs_space,对于j使用info来记录


day2.试验记录
遵循gym的custom环境创建格式,将自己的环境已经搭建完成,并实现了渲染。
同时也利用register将环境注册到了gym中;
实现过程参考了官方文档和【强化学习系列】Gym库使用——创建自己的强化学习环境2:拆解官方标准模型源码/规范自定义类+打包自定义环境_gym库 强化学习-CSDN博客
简化后的一版环境实现的效果如下;

相关文章:
大论文记录
基础知识回顾 1.强化学习(Agent、Environment) 在 RL 中,代理通过不断与环境交互、以试错的方式进行学习,在不确定性下做出顺序决策,并在探索(新领域)和开发(使用从经验中学到的知识ÿ…...
蘑菇分类检测数据集 21类蘑菇 8800张 带标注 voc yolo
蘑菇分类检测数据集 21类蘑菇 8800张 带标注 v 蘑菇分类检测数据集 21类蘑菇 8800张 带标注 voc yolo 蘑菇分类检测数据集介绍 数据集名称 蘑菇分类检测数据集 (Mushroom Classification and Detection Dataset) 数据集概述 该数据集专为训练和评估基于YOLO系列目标检测模型…...
dockerhub 镜像拉取超时的解决方法
在几个月前,因为一些原因,导致 dockerhub 官网上面的镜像拉取超时,目前可以通过修改仓库地址,通过 daocloud 拉取 public-image-mirror 方式一 源仓库替换仓库cr.l5d.iol5d.m.daocloud.iodocker.elastic.coelastic.m.daocloud.io…...
私家车开车回家过节会发生什么事情
自驾旅行或者是自驾车回家过节路程太远。长途奔袭的私家车损耗很大。新能源汽车开始涉足电力系统和燃电混动的能源供应过渡方式。汽车在路途中出现零件故障。计划的出发日程天气原因。台风是否会提醒和注意。汽车的油站供应链和电力充电桩的漫长充电过程。高速公路的收费站和不…...
正则表达式的使用示例--Everything文件检索批量重命名工具
一、引言 Everything是一款非常实用的文件搜索工具,它可以帮助您快速定位并查找计算机中的文件和文件夹。Everything搜索文件资料之神速,有使用过的朋友们都深有体会,相对于Windows自带的搜索功能,使用Everything,可以…...
centos环境安装JDK详细教程
centos环境安装JDK详细教程 一、前期准备二、JDK安装2.1 rpm方式安装JDK2.2 zip方式安装JDK2.3 yum方式安装JDK 本文主要说明CentOS下JDK的安装过程。JDK的安装有三种方式,用户可根据实际情况选择: 一、前期准备 查看服务器操作系统型号,执…...
Spring Cloud全解析:服务调用之OpenFeign集成OkHttp
文章目录 OpenFeign集成OkHttp添加依赖配置连接池yml配置 OpenFeign集成OkHttp OpenFeign本质是HTTP来进行服务调用的,也就是需要集成一个Http客户端。 使用的是Client接口来进行请求的 public interface Client {// request是封装的请求方式、参数、返回值类型/…...
前端算法合集-1(含面试题)
(这是我面试一家中厂公司的二面算法题) 数组去重并按出现次数排序 题目描述: 给定一个包含重复元素的数组,请你编写一个函数对数组进行去重,并按元素出现的次数从高到低排序。如果次数相同,则按元素值从小到大排序。 let arr [2, 11,10, 1…...
影刀---如何进行自动化操作
本文不是广告,没有人给我宣传费,只是单纯的觉得这个软件很好用 感谢大家的多多支持哦 本文 1.基本概念与操作(非标准下拉框和上传下载)非标准对话框的操作上传对话框、下载的对话框、提示的对话框 2.综合案例3.找不到元素怎么办&a…...
146. LRU 缓存【 力扣(LeetCode) 】
零、原题链接 146. LRU 缓存 一、题目描述 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中ÿ…...
【算法】链表:92.反转链表(medium)+双指针
系列专栏 《分治》 《模拟》 《Linux》 目录 1、题目链接 2、题目介绍 3、解法 (双指针) 4、代码 是 206. 反转链表 - 力扣(LeetCode)的类型题,且难度提升,可以先完成206,然后参照206的…...
Command | Ubuntu 个别实用命令记录(新建用户、查看网速等)
1. 实用命令 1.1 系统相关 1.1.1 查看系统、用户信息等 查看当前系统硬件架构 uname -m注:mac 上也能用 查看当前系统的操作系统及版本 cat /etc/os-release | grep "PRETTY_NAME"查看当前系统单个cpu的可用核心数 cat /proc/cpuinfo | grep "…...
云服务器部署k8s需要什么配置?
云服务器部署k8s需要什么配置?云服务器部署K8s需要至少2核CPU、4GB内存、50GBSSD存储的主节点用于管理集群,工作节点建议至少2核CPU、2GB内存、20GBSSD。还需安装Docker,选择兼容的Kubernetes版本,配置网络插件,以及确…...
Linux --入门学习笔记
文章目录 Linux概述基础篇Linux 的安装教程 ⇒ 太简单了,百度一搜一大堆。此处略……Linux 的目录结构常用的连接 linux 的开源软件vi 和 vim 编辑器Linux 的关机、开机、重启用户登录和注销用户管理添加用户 ⇒ ( useradd 用户名 ) ( useradd -d 制定目…...
并发编程三大特性(原子性、可见性、有序性)
并发编程的三大特性实际是JVM规范要求的JVM实现必须保证的三大特性 不同的硬件和不同的操作系统在内存管理上有一定的差异,JAVA为了解决这种差异,使用JMM(Java Memry Model)来屏蔽各个操作系统之间的差异,使得java可以…...
物理学基础精解【41】
文章目录 核物理基础 Υ \varUpsilon Υ衰变1. Υ \varUpsilon Υ衰变的一般性质2. 具体的衰变模式3. 衰变公式和机制4. 实验观测和理论研究 Υ \varUpsilon Υ衰变概述一、定义二、公式三、定理一、定义二、公式三、定理 重带电粒子概述重带电粒子的性质重带电粒子的公式 重带…...
深入理解Linux内核网络(一):内核接收数据包的过程
在应用层执行read调用后就能很方便地接收到来自网络的另一端发送过来的数据,其实在这一行代码下隐藏着非常多的内核组件细节工作。在本节中,将详细讲解数据包如何从内核到应用层,以intel igb网卡为例。 部分内容来源于 《深入理解Linux网络》…...
mysql学习教程,从入门到精通,SQL LIKE 运算符(28)
1、SQL LIKE 运算符 在SQL中,LIKE运算符主要用于在WHERE子句中搜索列中的指定模式。它通常与通配符一起使用,如%(代表零个、一个或多个字符)和_(代表单个字符),以执行模糊匹配。下面是一个使用…...
uniapp微信小程序使用ucharts遮挡自定义tabbar的最佳解决方案
如图所示: 使用的ucharts遮挡住了我自定义的tabbar(如果不是提需求的有病,我才不会去自定义tabbar) 查阅了不少文档,说是开启 ucharts 的 canvas2d 即可: 官网文档地址: uCharts官网 - 秋云…...
C初阶(八)选择结构(分支结构)--if、else、switch
前言: C语言是用来解决问题的,除了必要的数据输入与输出(见前文),还要有逻辑结构。其中基本可以归为三类:顺序结构、选择结构、循环结构。今天,杰哥提笔写的是关于选择结构(又叫“分…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
基于 HTTP 的单向流式通信协议SSE详解
SSE(Server-Sent Events)详解 🧠 什么是 SSE? SSE(Server-Sent Events) 是 HTML5 标准中定义的一种通信机制,它允许服务器主动将事件推送给客户端(浏览器)。与传统的 H…...
智警杯备赛--excel模块
数据透视与图表制作 创建步骤 创建 1.在Excel的插入或者数据标签页下找到数据透视表的按钮 2.将数据放进“请选择单元格区域“中,点击确定 这是最终结果,但是由于环境启不了,这里用的是自己的excel,真实的环境中的excel根据实训…...
