深度强化学习(十)(TRPO)

深度强化学习(十)(TRPO与PPO)

一.信赖域方法

原问题:
maxmize J ( θ ) \text{maxmize} \qquad\qquad J(\theta) maxmizeJ(θ)
J J J是个很复杂的函数,我们甚至可能不知道 J J J 的解析表达式(比如 J J J 是某个函数的期望)

现在我们可对 J ( θ ) J(\theta) J(θ)进行近似成 L ( θ ) L(\theta) L(θ),使用 L ( θ ) L(\theta) L(θ)作为我们的目标函数(比如用均值代替期望),但这个近似仅在一定范围内成立,原问题可转化为以下问题。
maxmize L ( θ ) s.t ∣ ∣ θ − θ n o w ∣ ∣ 2 ≤ Δ ( 仅在 θ n o w 邻域内成立 ) \begin{aligned} \text{maxmize}&\qquad \qquad L(\theta)\\ \text{s.t}&\qquad \qquad ||\theta-\theta_{now}||^2\leq \Delta \qquad (\text{仅在}\theta_{now}邻域内成立) \end{aligned} maxmizes.tL(θ)∣∣θθnow2Δ(仅在θnow邻域内成立)
这样求得了新问题的解后,将新问题的解记作 θ n o w \theta_{now} θnow,继续在 θ n o w \theta_{now} θnow邻域内构造新的函数 L ′ ( θ ) L'(\theta) L(θ)使其近似于 J ( θ ) J(\theta) J(θ),继续迭代求解。

除此之外,置信域也有多种多样的选择, 既可以是二范数,也可以是两个概率分布的KL散度。

二.TRPO

Theorem:

目标函数 J ( θ ) J(\boldsymbol{\theta}) J(θ) 可以等价写成:
J ( θ ) = E S [ E A ∼ π ( ⋅ ∣ S ; θ now  ) [ π ( A ∣ S ; θ ) π ( A ∣ S ; θ now  ) ⋅ Q π ( S , A ) ] ] . J(\boldsymbol{\theta})=\mathbb{E}_S\left[\mathbb{E}_{A \sim \pi\left(\cdot \mid S ; \boldsymbol{\theta}_{\text {now }}\right)}\left[\frac{\pi(A \mid S ; \boldsymbol{\theta})}{\pi\left(A \mid S ; \boldsymbol{\theta}_{\text {now }}\right)} \cdot Q_\pi(S, A)\right]\right] . J(θ)=ES[EAπ(S;θnow )[π(AS;θnow )π(AS;θ)Qπ(S,A)]].

上面 Q π Q_\pi Qπ 中的 π \pi π 指的是 π ( A ∣ S ; θ ) \pi(A \mid S ; \boldsymbol{\theta}) π(AS;θ)

Proof:
J ( θ ) = E A , S [ Q π ( S , A ) ] = E S [ E A ∼ π ( A ∣ S ; θ ) [ Q π ( S , A ) ] ] = E S [ ∑ A Q π ( S , a ) ⋅ π ( a ∣ S ; θ ) ] = E S [ ∑ A Q π ( S , a ) ⋅ π ( A ∣ S ; θ ) π ( A ∣ S ; θ now  ) ⋅ π ( A ∣ S ; θ n o w ) ] = E S [ E A ∼ π ( ⋅ ∣ S ; θ now  ) [ π ( A ∣ S ; θ ) π ( A ∣ S ; θ now  ) ⋅ Q π ( S , A ) ] ] \begin{aligned} J(\boldsymbol \theta)&=\Bbb E_{A,S}[Q_{\pi}(S,A)]\\ &=\Bbb E_{S}[\Bbb E_{A\sim\pi(A\mid S;\boldsymbol \theta)}[Q_{\pi}(S,A)]]\\ &=\Bbb E_{S}[\sum_{A}Q_{\pi}(S,a)\cdot\pi(a\mid S;\boldsymbol \theta)]\\ &=\Bbb E_{S}[\sum_{A}Q_{\pi}(S,a)\cdot \frac{\pi(A \mid S ; \boldsymbol{\theta})}{\pi\left(A \mid S ; \boldsymbol{\theta}_{\text {now }}\right)}\cdot \pi(A\mid S;\boldsymbol \theta_{now})]\\ &=\mathbb{E}_S\left[\mathbb{E}_{A \sim \pi\left(\cdot \mid S ; \boldsymbol{\theta}_{\text {now }}\right)}\left[\frac{\pi(A \mid S ; \boldsymbol{\theta})}{\pi\left(A \mid S ; \boldsymbol{\theta}_{\text {now }}\right)} \cdot Q_\pi(S, A)\right]\right] \end{aligned} J(θ)=EA,S[Qπ(S,A)]=ES[EAπ(AS;θ)[Qπ(S,A)]]=ES[AQπ(S,a)π(aS;θ)]=ES[AQπ(S,a)π(AS;θnow )π(AS;θ)π(AS;θnow)]=ES[EAπ(S;θnow )[π(AS;θnow )π(AS;θ)Qπ(S,A)]]
有了以上的结论,我们可以对期望做蒙特卡洛近似,从而把函数 J J J近似成函数 L L L。用策略网络 π ( A ∣ S ; θ n o w ) \pi(A|S;\boldsymbol \theta_{now}) π(AS;θnow)控制智能体跟环境交互,从头到尾玩完一局游戏, 观测到一条轨迹:
s 1 , a 1 , r 1 , s 2 , a 2 , r 2 , ⋯ , s n , a n , r n s_1, a_1, r_1, s_2, a_2, r_2, \cdots, s_n, a_n, r_n s1,a1,r1,s2,a2,r2,,sn,an,rn
其中的状态 { s t } t = 1 n \left\{s_t\right\}_{t=1}^n {st}t=1n 都是从环境中观测到的, 其中的动作 { a t } t = 1 n \left\{a_t\right\}_{t=1}^n {at}t=1n 都是根据策略网络 π ( ⋅ ∣ s t ; θ now  ) \pi\left(\cdot \mid s_t ; \boldsymbol{\theta}_{\text {now }}\right) π(st;θnow ) 抽取的样本。所以,
π ( a t ∣ s t ; θ ) π ( a t ∣ s t ; θ now  ) ⋅ Q π ( s t , a t ) \frac{\pi\left(a_t \mid s_t ; \boldsymbol{\theta}\right)}{\pi\left(a_t \mid s_t ; \boldsymbol{\theta}_{\text {now }}\right)} \cdot Q_\pi\left(s_t, a_t\right) π(atst;θnow )π(atst;θ)Qπ(st,at)

是无偏估计。我们观测到了 n n n 组状态和动作, 于是应该求平均, 把得到均值记作:
L ( θ ∣ θ now  ) = 1 n ∑ t = 1 n π ( a t ∣ s t ; θ ) π ( a t ∣ s t ; θ now  ) ⋅ Q π ( s t , a t ) ⏟ 期望的无偏估计  . L\left(\boldsymbol{\theta} \mid \boldsymbol{\theta}_{\text {now }}\right)=\frac{1}{n} \sum_{t=1}^n \underbrace{\frac{\pi\left(a_t \mid s_t ; \boldsymbol{\theta}\right)}{\pi\left(a_t \mid s_t ; \boldsymbol{\theta}_{\text {now }}\right)} \cdot Q_\pi\left(s_t, a_t\right)}_{\text { 期望的无偏估计 }} . L(θθnow )=n1t=1n 期望的无偏估计  π(atst;θnow )π(atst;θ)Qπ(st,at).

既然连加里每一项都是期望的无偏估计, 那么 n n n 项的均值 L L L 也是无偏估计。所以可以拿 L L L 作为目标函数 J J J 的蒙特卡洛近似。

L ( θ ∣ θ now  ) L\left(\boldsymbol{\theta} \mid \boldsymbol{\theta}_{\text {now }}\right) L(θθnow ) 是对目标函数 J ( θ ) J(\boldsymbol{\theta}) J(θ) 的近似。可惜我们还无法直接对 L L L 求最大化, 原因是我们不知道动作价值 Q π ( s t , a t ) Q_\pi\left(s_t, a_t\right) Qπ(st,at) 。解决方法是做两次近似:
Q π ( s t , a t ) ⟹ Q π old  ( s t , a t ) ⟹ u t . Q_\pi\left(s_t, a_t\right) \Longrightarrow Q_{\pi_{\text {old }}}\left(s_t, a_t\right) \Longrightarrow u_t . Qπ(st,at)Qπold (st,at)ut.

公式中 Q π Q_\pi Qπ 中的策略是 π ( a t ∣ s t ; θ ) \pi\left(a_t \mid s_t ; \boldsymbol{\theta}\right) π(atst;θ), 而 Q π old  Q_{\pi_{\text {old }}} Qπold  中的策略则是旧策略 π ( a t ∣ s t ; θ now  ) \pi\left(a_t \mid s_t ; \boldsymbol{\theta}_{\text {now }}\right) π(atst;θnow ) 。我们用旧策略 π ( a t ∣ s t ; θ now  ) \pi\left(a_t \mid s_t ; \boldsymbol{\theta}_{\text {now }}\right) π(atst;θnow ) 生成轨迹 { ( s j , a j , r j , s j + 1 ) } j = 1 n \left\{\left(s_j, a_j, r_j, s_{j+1}\right)\right\}_{j=1}^n {(sj,aj,rj,sj+1)}j=1n, 所以折扣回报
u t = r t + γ ⋅ r t + 1 + γ 2 ⋅ r t + 2 + ⋯ + γ n − t ⋅ r n u_t=r_t+\gamma \cdot r_{t+1}+\gamma^2 \cdot r_{t+2}+\cdots+\gamma^{n-t} \cdot r_n ut=rt+γrt+1+γ2rt+2++γntrn

是对 Q π o l d Q_{\pi_{\mathrm{old}}} Qπold 的近似, 而未必是对 Q π Q_\pi Qπ 的近似。仅当 θ \boldsymbol{\theta} θ 接近 θ now  \boldsymbol{\theta}_{\text {now }} θnow  的时候, u t u_t ut 才是 Q π Q_\pi Qπ 的有效近似。这就是为什么要强调置信域, 即 θ \boldsymbol{\theta} θ θ now  \boldsymbol{\theta}_{\text {now }} θnow  的邻域中。

三.PPO-惩罚

TRPO求解的原问题是
minmize − J ( θ ∣ θ n o w ) s.t KL ( θ ∣ θ n o w ) ≤ Δ \begin{aligned} \text{minmize}&\qquad-J(\boldsymbol \theta\mid \boldsymbol \theta_{now})\\ \text{s.t}& \qquad \text{KL}(\boldsymbol\theta\mid \boldsymbol \theta_{now})\leq\Delta \end{aligned} minmizes.tJ(θθnow)KL(θθnow)Δ
我们通过控制信赖域 Δ \Delta Δ来获得解。将其转化为等价优化问题,引入拉格朗日乘子 λ \lambda λ
maxmize θ maxmize λ J ( θ ∣ θ n o w ) − λ ( KL ( θ ∣ θ n o w ) − Δ ) s.t λ ≥ 0 \begin{aligned} \text{maxmize}_{\boldsymbol \theta}\quad\text{maxmize}_{\lambda}&\qquad J(\boldsymbol \theta\mid \boldsymbol \theta_{now})-\lambda(\text{KL}(\boldsymbol\theta\mid \boldsymbol \theta_{now})-\Delta)\\ \text{s.t}&\qquad \lambda\geq0 \end{aligned} maxmizeθmaxmizeλs.tJ(θθnow)λ(KL(θθnow)Δ)λ0
从上式可看出拉格朗日乘子 λ \lambda λ Δ \Delta Δ一一对应,所以我们可以通过调整 λ \lambda λ间接控制 Δ \Delta Δ。当给定某一 λ ≥ 0 \lambda\geq0 λ0时(例如 λ = 1 \lambda=1 λ=1),问题可写成
maxmize θ J ( θ ∣ θ n o w ) − λ KL ( θ ∣ θ n o w ) \text{maxmize}_{\theta}\qquad J(\boldsymbol \theta\mid \boldsymbol \theta_{now})-\lambda\text{KL}(\boldsymbol\theta\mid \boldsymbol \theta_{now}) maxmizeθJ(θθnow)λKL(θθnow)
这样我们成功的把有约束问题写成无约束形式,但如何选取 λ \lambda λ的值也是一个问题。我们可以分析一下 Δ \Delta Δ λ \lambda λ的关系。

如果信赖域 Δ \Delta Δ过小(K-L散度过大), KL ( θ ∣ θ n o w ) − Δ ≥ 0 \text{KL}(\boldsymbol\theta\mid \boldsymbol \theta_{now})-\Delta\geq0 KL(θθnow)Δ0,要最大化 J ( θ ∣ θ n o w ) − λ ( KL ( θ ∣ θ n o w ) − Δ ) J(\boldsymbol \theta\mid \boldsymbol \theta_{now})-\lambda(\text{KL}(\boldsymbol\theta\mid \boldsymbol \theta_{now})-\Delta) J(θθnow)λ(KL(θθnow)Δ) λ \lambda λ只能接近0

如果信赖域 Δ \Delta Δ过大(K-L散度过小), KL ( θ ∣ θ n o w ) − Δ ≤ 0 \text{KL}(\boldsymbol\theta\mid \boldsymbol \theta_{now})-\Delta\leq0 KL(θθnow)Δ0,要最大化 J ( θ ∣ θ n o w ) − λ ( KL ( θ ∣ θ n o w ) − Δ ) J(\boldsymbol \theta\mid \boldsymbol \theta_{now})-\lambda(\text{KL}(\boldsymbol\theta\mid \boldsymbol \theta_{now})-\Delta) J(θθnow)λ(KL(θθnow)Δ) λ \lambda λ只能接近 + ∞ +\infty +

所以我们有如下更新规则

d k = KL ( π θ k , π θ ) , λ d_k=\text{KL}\left(\pi_{\theta_k}, \pi_\theta\right) , \lambda dk=KL(πθk,πθ)λ 的更新规则如下:

  1. 如果 d k < δ / 1.5 d_k<\delta / 1.5 dk<δ/1.5 ,那么 λ k + 1 = λ k / 2 \lambda_{k+1}=\lambda_k / 2 λk+1=λk/2
  2. 如果 d k > δ × 1.5 d_k>\delta \times 1.5 dk>δ×1.5 ,那么 λ k + 1 = λ k × 2 \lambda_{k+1}=\lambda_k \times 2 λk+1=λk×2
  3. 否则 λ k + 1 = λ k \lambda_{k+1}=\lambda_k λk+1=λk

其中, δ \delta δ是事先设定的一个超参数,用于限制学习策略和之前一轮策略的差距。

四.PPO-截断

PPO 的另一种形式 PPO-截断(PPO-Clip)更加直接,它在目标函数中进行限制,以保证新的参数和旧的参数的差距不会太大,即:
arg ⁡ max ⁡ θ E S [ E A ∼ π θ n o w ( ⋅ ∣ S ) [ min ⁡ ( π θ ( A ∣ S ) π θ n o w ( A ∣ S ) A π θ n o w ( S , A ) , clip ⁡ ( π θ ( A ∣ S ) π θ n o w ( A ∣ S ) , 1 − ϵ , 1 + ϵ ) A π θ n o w ( S , A ) ) ] ] \underset{\theta}{\arg \max } \mathbb{E}_{S}\left[\mathbb{E}_{A \sim \pi_{\theta_{now}}(\cdot \mid S)}\left[\min \left(\frac{\pi_\theta(A \mid S)}{\pi_{\theta_{now}}(A \mid S)} A^{\pi_{\theta_{now}}}(S, A), \operatorname{clip}\left(\frac{\pi_\theta(A \mid S)}{\pi_{\theta_{now}}(A \mid S)}, 1-\epsilon, 1+\epsilon\right) A^{\pi_{\theta_{now}}}(S, A)\right)\right]\right] θargmaxES[EAπθnow(S)[min(πθnow(AS)πθ(AS)Aπθnow(S,A),clip(πθnow(AS)πθ(AS),1ϵ,1+ϵ)Aπθnow(S,A))]]
其中 A ( S , A ) A(S,A) A(S,A)是优势函数, clip ⁡ ( x , l , r ) : = max ⁡ ( min ⁡ ( x , r ) , l ) \operatorname{clip}(x, l, r):=\max (\min (x, r), l) clip(x,l,r):=max(min(x,r),l) ,即把 x x x 限制在 [ l , r ] [l, r] [l,r] 内。上式中 ϵ \epsilon ϵ 是一个超参数,表示进行截断 (clip) 的范围。如果 A ( s , a ) > 0 A(s, a)>0 A(s,a)>0 ,说明这个动作的价值高于平均,最大化这个式子会增大 π θ ( a ∣ s ) π θ n o w ( a ∣ s ) \frac{\pi_\theta(a \mid s)}{\pi_{\theta_{now}}(a \mid s)} πθnow(as)πθ(as) ,但不会让其超过 1 + ϵ ∘ 1+\epsilon_{\circ} 1+ϵ 反之,如果 A ( s , a ) < 0 A(s, a)<0 A(s,a)<0 ,说明这个动作的价值低于平均,最大化这个式子会减少 π θ ( a ∣ s ) π θ n o w ( a ∣ s ) \frac{\pi_\theta(a \mid s)}{\pi_{\theta_{now}}(a \mid s)} πθnow(as)πθ(as) ,但不会让其小于 1 − ϵ 1-\epsilon 1ϵ

)<0$ ,说明这个动作的价值低于平均,最大化这个式子会减少 π θ ( a ∣ s ) π θ n o w ( a ∣ s ) \frac{\pi_\theta(a \mid s)}{\pi_{\theta_{now}}(a \mid s)} πθnow(as)πθ(as) ,但不会让其小于 1 − ϵ 1-\epsilon 1ϵ

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

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

相关文章

华为ENSP的VLAN原理和配置命令

CSDN 成就一亿技术人&#xff01; 作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; CSDN 成就一亿技术人&#xff01; ————前言———— VLAN&#xff08;Virtual Local Area Network&#xff0c;虚拟局域网&#xff09;是一种在物理网络基…

【回眸】Tessy 单元测试软件使用指南(三)怎么打桩和指针赋值和测试

目录 前言 Tessy 如何进行打桩操作 普通桩 高级桩 手写桩 Tessy单元测试之指针相关测试注意事项 有类型的指针&#xff08;非函数指针&#xff09;&#xff1a; 有类型的函数指针&#xff1a; void 类型的指针&#xff1a; 结语 前言 进行单元测试之后&#xff0c;但凡…

STM32技术打造:智能考勤打卡系统 | 刷卡式上下班签到自动化解决方案

文章目录 一、简易刷卡式打卡考勤系统&#xff08;一&#xff09;功能简介原理图设计程序设计 哔哩哔哩&#xff1a; https://www.bilibili.com/video/BV1NZ421Y79W/?spm_id_from333.999.0.0&vd_sourcee5082ef80535e952b2a4301746491be0 一、简易刷卡式打卡考勤系统 &…

数据在内存的存储(2)【浮点数在内存的存储】

一.浮点数以什么形式存储在内存中 根据根据国际标准IEEE&#xff08;电气和电子工程协会&#xff09;754&#xff0c;任意一个二进制浮点数V都可以存储为这样的形式&#xff1a; V&#xff08;-1&#xff09;^S*M*2^E。 &#xff08;1&#xff09;&#xff08;-1&#xff09;^…

[免费]通义灵码做活动,送礼品,快来薅羊毛!!!

你的编辑器装上智能ai编辑了吗&#xff0c;的确挺好用的。 最近阿里云AI编码搞活动&#xff0c;可以免费体验并且还可以抽盲盒。有日历、马克杯、代金券、等等其他数码产品。 大多数都是日历。 点击链接参与「通义灵码 体验 AI 编码&#xff0c;开 AI 盲盒」 https://develope…

蓝桥杯2023真题-幸运数字

目录 进制转换&#xff1a; 思路 代码 题目链接&#xff1a; 0幸运数字 - 蓝桥云课 (lanqiao.cn) 本题就考的进制转换问题&#xff0c;要将十进制5转换成二进制&#xff0c;通过%2,和/2的交替使用即可完成&#xff0c;所得余数就是转换成的二进制各位的值&#xff0c;转换…

SQLAlchemy操作数据库

数据库是一个网站的基础。 比如 MySQL 、 MongoDB 、 SQLite 、 PostgreSQL 等&#xff0c;这里我们以 MySQL为例进行讲解。 SQLAlchemy 是一个 ORM 框架 我们会以 MySQL SQLAlchemy 组合进行讲解。 在操作数据库操作之前&#xff0c;先确保你已经安装了以下两个插件&#…

继承-练习

T3、编写程序实现乐手弹奏乐器。乐手可以弹奏不同的乐器从而发出不同的声音。可以弹奏的乐器包括二胡、钢琴和琵琶。要求&#xff1a; 定义乐器类Instrument&#xff0c;包括方法makeSound()定义乐器类的子类&#xff1a;二胡Erhu、钢琴Piano和小提琴Violin定义乐手类Musician&…

使用RN输入验证码(四个输入框)

先安装 yarn add react-native-confirmation-code-fieldRN代码 import React, { useState } from react; import { SafeAreaView, Text, StyleSheet, Dimensions } from react-native;import { CodeField, Cursor } from react-native-confirmation-code-field; const width …

Aurora IP的Framing帧接口和Streaming流接口

本文介绍Aurora IP配置时要选择的接口类型以及两种接口类型之前的区别。 Aurora IP接口有两种模式&#xff1a;Framing帧接口&#xff0c;Streaming流接口 目前一直在用的都是Framing帧接口。 Framing帧接口和Streaming流接口的主要区别是什么呢&#xff1f; 顾名思义&#x…

国内用户掌握ChatGPT,你已超越万人!

在数字时代&#xff0c;掌握前沿技术往往意味着拥有更多的机遇和可能。ChatGPT&#xff0c;作为当前最热门的人工智能技术之一&#xff0c;已经证明了其在各个领域的广泛应用价值。但在中国&#xff0c;能熟练使用ChatGPT的人究竟领先了多少人&#xff1f;让我们深入探讨。>…

【Git】日志功能

1. git日志显示 # 显示前3条日志 git log -3# 单行显示 git log --oneline# 图表日志 git log --graph# 显示更改摘要 git log --stat# 显示更改位置 git log --patch 或 git log -p# 查看指定文件的提交历史记录 git log {filename}例子1&#xff1a;单行显示 例子2&#xff…

2024年最新阿里云服务器价格表_CPU内存+磁盘+带宽价格

2024年阿里云服务器租用费用&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核4G服务…

ManageEngine EventLog Analyzer: 功能丰富的日志分析工具

来自 Zoho Corp. 的 ManageEngine EventLog Analyzer 是一个小型应用程序&#xff0c;提供了许多功能。该产品采用无代理方式收集和分析机器生成的日志。该工具可以收集和规范化事件日志和机器数据&#xff0c;并在易于使用的基于 Web 的界面中提供分析、搜索、报告生成和存档等…

华院计算荣获CSDN“创新企业”和“年度创新产品与解决方案”大奖

日前&#xff0c;全国最大的专业开发者社区CSDN发布“2023中国开发者影响力年度榜单”&#xff0c;华院计算凭借其卓越的认知智能引擎平台荣获“创新企业”和“年度创新产品与解决方案”两项大奖。 CSDN 以数据为基础&#xff0c;经过个人或企业提交资料、层层筛选、深入调研、…

【Redis】数据类型、事务执行、内存淘汰策略

目录 数据类型 Redis事务执行步骤 步骤&#xff1a; redis内存淘汰策略 设置内存淘汰策略 1.设置配置文件 2.通过命令设置 数据类型 官网解释 Understand Redis data types | Redis 首先&#xff0c;Redis 的所有键都是字符串,常用的数据类型有 5 种&#xff1a;Strin…

SpringBoot整合WebService

WebService是一个SOA&#xff08;面向服务的编程&#xff09;的架构&#xff0c;它是不依赖于语言&#xff0c;不依赖于平台&#xff0c;可以实现不同的语言间的相互调用&#xff0c;通过Internet进行基于Http协议的网络应用间的交互。 其实WebService并不是什么神秘的东西&…

推荐一款电子翻页书制作软件

随着数字化时代的到来&#xff0c;电子书籍越来越受到人们的喜爱。而一款优秀的电子翻页书制作软件&#xff0c;则能够帮助你轻松制作出专业级的电子书&#xff0c;让你的阅读体验更加丰富多彩。 今天&#xff0c;我们就来为大家推荐一款优秀的电子翻页书制作软件——FLBOOK在线…

数据结构 --- 复杂度概念及计算讲解(时间复杂度,空间复杂度)

今天没有sao话&#xff0c;今天认真学习 一、时间复杂度 1、概念讲解 2、计算讲解 二、空间复杂度 1、概念讲解 2、计算讲解 三、常见复杂度对比 四、完结撒❀ 前言&#xff1a; 经常刷题的人都知道&#xff0c;我们在解决一道题时可能有多个解法&#xff0c;那么如何…

使用EasyYapi插件简化导出yapi接口

安装 &#xff1a; 关键配置&#xff1a; 其中的token在这里拿&#xff1a; 使用&#xff1a; 导出当前Controller下的所有api&#xff1a;使用下图命令可仅导出指定的api: 附&#xff1a;配置部分参考了idea&#xff1a;使用easyYapi插件导出yapi接口