强化学习从基础到进阶-常见问题和面试必知必答[5]::梯度策略、添加基线(baseline)、优势函数、动作分配合适的分数(credit)

news2024/10/6 5:29:11

在这里插入图片描述
【强化学习原理+项目专栏】必看系列:单智能体、多智能体算法原理+项目实战、相关技巧(调参、画图等、趣味项目实现、学术应用项目实现

在这里插入图片描述
专栏详细介绍:【强化学习原理+项目专栏】必看系列:单智能体、多智能体算法原理+项目实战、相关技巧(调参、画图等、趣味项目实现、学术应用项目实现

对于深度强化学习这块规划为:

  • 基础单智能算法教学(gym环境为主)
  • 主流多智能算法教学(gym环境为主)
    • 主流算法:DDPG、DQN、TD3、SAC、PPO、RainbowDQN、QLearning、A2C等算法项目实战
  • 一些趣味项目(超级玛丽、下五子棋、斗地主、各种游戏上应用)
  • 单智能多智能题实战(论文复现偏业务如:无人机优化调度、电力资源调度等项目应用)

本专栏主要方便入门同学快速掌握强化学习单智能体|多智能体算法原理+项目实战。后续会持续把深度学习涉及知识原理分析给大家,让大家在项目实操的同时也能知识储备,知其然、知其所以然、知何由以知其所以然。

声明:部分项目为网络经典项目方便大家快速学习,后续会不断增添实战环节(比赛、论文、现实应用等)

  • 专栏订阅(个性化选择):

    • 强化学习原理+项目专栏大合集-《推荐订阅☆☆☆☆☆》

    • 强化学习单智能体算法原理+项目实战《推荐订阅☆☆☆☆》

    • 强化学习多智能体原理+项目实战《推荐订阅☆☆☆☆☆》

    • 强化学习相关技巧(调参、画图等《推荐订阅☆☆☆》)

    • tensorflow_gym-强化学习:免费《推荐订阅☆☆☆☆》

    • 强化学习从基础到进阶-案例与实践:免费《推荐订阅☆☆☆☆☆》

强化学习从基础到进阶-常见问题和面试必知必答[5]::梯度策略、添加基线(baseline)、优势函数、动作分配合适的分数(credit)

1.核心词汇

  • 策略(policy):在每一个演员中会有对应的策略,这个策略决定了演员的后续动作。具体来说,策略就是对于外界的输入,输出演员现在应该要执行的动作。一般地,我们将策略写成 π \pi π

  • 回报(return):一个回合(episode)或者试验(trial)得到的所有奖励的总和,也被人们称为总奖励(total reward)。一般地,我们用 R R R 来表示它。

  • 轨迹(trajectory):一个试验中我们将环境输出的状态 s s s 与演员输出的动作 a a a 全部组合起来形成的集合称为轨迹,即 τ = { s 1 , a 1 , s 2 , a 2 , ⋯   , s t , a t } \tau=\left\{s_{1}, a_{1}, s_{2}, a_{2}, \cdots, s_{t}, a_{t}\right\} τ={s1,a1,s2,a2,,st,at}

  • 奖励函数(reward function):用于反映在某一个状态采取某一个动作可以得到的奖励分数,这是一个函数。即给定一个状态-动作对 ( s 1 s_1 s1, a 1 a_1 a1) ,奖励函数可以输出 r 1 r_1 r1 。给定 ( s 2 s_2 s2, a 2 a_2 a2),它可以输出 r 2 r_2 r2。 把所有的 r r r 都加起来,我们就得到了 R ( τ ) R(\tau) R(τ) ,它代表某一个轨迹 τ \tau τ 的奖励。

  • 期望奖励(expected reward) R ˉ θ = ∑ τ R ( τ ) p θ ( τ ) = E τ ∼ p θ ( τ ) [ R ( τ ) ] \bar{R}_{\theta}=\sum_{\tau} R(\tau) p_{\theta}(\tau)=E_{\tau \sim p_{\theta}(\tau)}[R(\tau)] Rˉθ=τR(τ)pθ(τ)=Eτpθ(τ)[R(τ)]

  • REINFORCE:基于策略梯度的强化学习的经典算法,其采用回合更新的模式。

2.常见问题汇总

2.1 如果我们想让机器人自己玩视频游戏,那么强化学习中的3个组成部分(演员、环境、奖励函数)具体分别代表什么?

演员做的事情就是操控游戏的摇杆,比如向左、向右、开火等操作;环境就是游戏的主机,负责控制游戏的画面、控制怪物如何移动等;奖励函数就是当执行什么动作、发生什么状况的时候,我们可以得到多少分数,比如击杀一只怪兽得到20分、被对手暴击扣除10分、完成任务得到10分等。

2.2 在一个过程中,一个具体的轨迹{ s 1 , a 1 , s 2 , a 2 s_1 , a_1 , s_2 , a_2 s1,a1,s2,a2}出现的概率取决于什么?

(1)一部分是环境的行为,即环境的函数内部的参数或内部的规则是什么形式的。 p ( s t + 1 ∣ s t , a t ) p(s_{t+1}|s_t,a_t) p(st+1st,at) 这一项代表的是环境,环境这一项通常是无法控制的,因为它是已经客观存在的,或者其形式是提前制定好的。

(2)另一部分是智能体的行为,我们能控制的是 p θ ( a t ∣ s t ) p_\theta(a_t|s_t) pθ(atst) ,即给定一个状态 s t s_t st,演员要采取什么样的动作 a t a_t at 取决于演员的参数 θ \theta θ,所以这部分是我们可以控制的。随着演员动作的不同,每个同样的轨迹,它会因为不同的概率从而表现出不同的行为。

2.3 当我们最大化期望奖励时,应该使用什么方法?

应该使用梯度上升法,因为要让期望奖励越大越好,所以是梯度上升法。梯度上升法在更新参数的时候要添加梯度信息。要进行梯度上升,我们先要计算期望奖励 R ˉ \bar{R} Rˉ 的梯度。我们对 R ˉ \bar{R} Rˉ 取一个梯度,这里只有 p θ ( τ ) p_{\theta}(\tau) pθ(τ) 是与 θ \theta θ 有关的,所以 p θ ( τ ) p_{\theta}(\tau) pθ(τ) 为梯度的部分。

2.4 我们应该如何理解策略梯度的公式呢?

策略梯度的公式如下:

E τ ∼ p θ ( τ ) [ R ( τ ) ∇ log ⁡ p θ ( τ ) ] ≈ 1 N ∑ n = 1 N R ( τ n ) ∇ log ⁡ p θ ( τ n ) = 1 N ∑ n = 1 N ∑ t = 1 T n R ( τ n ) ∇ log ⁡ p θ ( a t n ∣ s t n ) \begin{aligned} E_{\tau \sim p_{\theta}(\tau)}\left[R(\tau) \nabla \log p_{\theta}(\tau)\right] &\approx \frac{1}{N} \sum_{n=1}^{N} R\left(\tau^{n}\right) \nabla \log p_{\theta}\left(\tau^{n}\right) \\ &=\frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T_{n}} R\left(\tau^{n}\right) \nabla \log p_{\theta}\left(a_{t}^{n} \mid s_{t}^{n}\right) \end{aligned} Eτpθ(τ)[R(τ)logpθ(τ)]N1n=1NR(τn)logpθ(τn)=N1n=1Nt=1TnR(τn)logpθ(atnstn)

p θ ( τ ) p_{\theta}(\tau) pθ(τ) 里面有两项, p ( s t + 1 ∣ s t , a t ) p(s_{t+1}|s_t,a_t) p(st+1st,at) 来自环境, p θ ( a t ∣ s t ) p_\theta(a_t|s_t) pθ(atst) 来自智能体。 p ( s t + 1 ∣ s t , a t ) p(s_{t+1}|s_t,a_t) p(st+1st,at) 由环境决定,从而与 θ \theta θ 无关,因此 ∇ log ⁡ p ( s t + 1 ∣ s t , a t ) = 0 \nabla \log p(s_{t+1}|s_t,a_t) =0 logp(st+1st,at)=0 ∇ p θ ( τ ) = ∇ log ⁡ p θ ( a t n ∣ s t n ) \nabla p_{\theta}(\tau)=\nabla \log p_{\theta}\left(a_{t}^{n} | s_{t}^{n}\right) pθ(τ)=logpθ(atnstn)

具体来说:

(1)假设在状态 s t s_t st 时执行动作 a t a_t at,最后发现轨迹 τ \tau τ 的奖励是正的,那我们就要增大这一项的概率,即增大在状态 s t s_t st 时执行动作 a t a_t at 的概率;

(2)反之,在状态 s t s_t st 时执行动作 a t a_t at 会导致轨迹 τ \tau τ 的奖励变成负的,我们就要减小这一项的概率。

2.5 我们可以使用哪些方法来进行梯度提升的计算?

用梯度提升来更新参数,对于原来的参数 θ \theta θ ,可以将原始的 θ \theta θ 加上更新梯度,再乘一个学习率。通常学习率也需要调整,与神经网络一样,我们可以使用 Adam、RMSProp、SGD 等优化器对其进行调整

2.6 进行基于策略梯度的优化的技巧有哪些?

(1)增加基线:为了防止所有奖励都为正,从而导致每一个状态和动作的变换,都会使得每一项变换的概率上升,我们把奖励减去一项 b b b,称之为基线。当减去 b b b 后,就可以让奖励 R ( τ n ) − b R(\tau^n)-b R(τn)b 有正有负。所以如果得到的总奖励 R ( τ n ) R(\tau^n) R(τn) 大于 b b b ,就让它的概率增大。如果总奖励小于 b b b,就算它是正的,值很小也是不好的,就需要让这一项的概率减小。如果奖励 R ( τ n ) R(\tau^n) R(τn) 小于 b b b ,就要让采取这个动作的奖励下降,这样也符合常理。但是使用基线会让本来奖励很大的“动作”的奖励变小,从而降低更新速率。

(2)指派合适的分数:首先,原始权重是整个回合的总奖励。现在改成从某个时间点 t t t 开始,假设动作是在时间点 t t t 被执行的,从时间点 t t t,一直到游戏结束所有奖励的总和大小,才真正代表这个动作是好的还是不好的;接下来我们再进一步,把未来的奖励打一个折扣,我们称由此得到的奖励的和为折扣回报。

(3)综合以上两种技巧,我们将其统称为优势函数,用 A A A 来代表优势函数。优势函数取决于状态和动作,即我们需计算的是在某一个状态 s s s 采取某一个动作 a a a 的时候,优势函数有多大。

(4)优势函数的意义在于衡量假设我们在某一个状态 s t s_t st 执行某一个动作 a t a_t at,相较于其他可能动作的优势。它在意的不是绝对的好,而是相对的好,即相对优势,因为会减去一个基线 b b b A θ ( s t , a t ) A_{\theta}\left(s_{t}, a_{t}\right) Aθ(st,at) 通常可以由一个网络预估出来,这个网络叫作评论员。

2.7 对于策略梯度的两种方法,蒙特卡洛强化学习和时序差分强化学习两种方法有什么联系和区别?

(1)两者的更新频率不同。蒙特卡洛强化学习方法是每一个回合更新一次,即需要经历完整的状态序列后再更新,比如贪吃蛇游戏,贪吃蛇“死了”即游戏结束后再更新。而时序差分强化学习方法是每一步就更新一次,比如贪吃蛇游戏,贪吃蛇每移动一次(或几次)就进行更新。相对来说,时序差分强化学习方法比蒙特卡洛强化学习方法更新的频率更高。

(2)时序差分强化学习方法能够在知道一个小步后就进行学习,相比于蒙特卡洛强化学习方法,其更加快速和灵活。

(3)具体例如:假如我们要优化开车去公司的通勤时间。对于此问题,每一次通勤,我们将到达不同的路口。对于时序差分强化学习方法,其会对每一个经过的路口计算时间,例如在路口 A 就开始更新预计到达路口 B、路口 C ⋯ ⋯ \cdots \cdots ⋯⋯ ,以及到达公司的时间;对于蒙特卡洛强化学习方法,其不会每经过一个路口就更新时间,而是到达最终的目的地后,再修改到达每一个路口和到达公司对应的时间。

2.8 请详细描述REINFORCE算法的计算过程。

首先我们需要根据一个确定好的策略模型来输出每一个可能动作的概率,对于所有动作的概率,我们使用采样方法(或者是随机的方法)选择一个动作与环境进行交互,同时环境会给我们反馈整个回合的数据。将此回合数据输入学习函数中,并根据回合数据进行损失函数的构造,通过Adam等优化器的优化,再更新我们的策略模型。

3.面试必知必答

3.1 友善的面试官:同学来吧,给我手动推导一下策略梯度公式的计算过程。

首先我们的目的是最大化奖励函数,即调整 θ \theta θ ,使得期望回报最大,可以用公式表示如下:

J ( θ ) = E τ ∼ p θ ( τ ) [ ∑ t r ( s t , a t ) ] J(\theta)=E_{\tau \sim p_{\theta(\tau)}}\left[\sum_tr(s_t,a_t)\right] J(θ)=Eτpθ(τ)[tr(st,at)]

其中 τ \tau τ 表示从开始到结束的一条完整轨迹。通常对于最大化问题,我们可以使用梯度上升算法找到最大值,即

θ ∗ = θ + α ∇ J ( θ ) \theta^* = \theta + \alpha\nabla J({\theta}) θ=θ+αJ(θ)

所以我们仅仅需要计算并更新 ∇ J ( θ ) \nabla J({\theta}) J(θ) ,也就是计算奖励函数 J ( θ ) J({\theta}) J(θ) 关于 θ \theta θ 的梯度,也就是策略梯度,计算方法如下:

∇ θ J ( θ ) = ∫ ∇ θ p θ ( τ ) r ( τ ) d τ = ∫ p θ ∇ θ l o g p θ ( τ ) r ( τ ) d τ = E τ ∼ p θ ( τ ) [ ∇ θ l o g p θ ( τ ) r ( τ ) ] \nabla_{\theta}J(\theta) = \int {\nabla}_{\theta}p_{\theta}(\tau)r(\tau) \mathrm{d}{\tau}=\int p_{\theta}{\nabla}_{\theta} \mathrm{log}p_{\theta}(\tau)r(\tau)\mathrm{d}{\tau}=E_{\tau \sim p_{\theta}(\tau)}[{\nabla}_{\theta}\mathrm{log}p_{\theta}(\tau)r(\tau)] θJ(θ)=θpθ(τ)r(τ)dτ=pθθlogpθ(τ)r(τ)dτ=Eτpθ(τ)[θlogpθ(τ)r(τ)]

接着我们继续展开,对于 p θ ( τ ) p_{\theta}(\tau) pθ(τ) ,即 p θ ( τ ∣ θ ) p_{\theta}(\tau|{\theta}) pθ(τθ)

p θ ( τ ∣ θ ) = p ( s 1 ) ∏ t = 1 T π θ ( a t ∣ s t ) p ( s t + 1 ∣ s t , a t ) p_{\theta}(\tau|{\theta}) = p(s_1)\prod_{t=1}^T \pi_{\theta}(a_t|s_t)p(s_{t+1}|s_t,a_t) pθ(τθ)=p(s1)t=1Tπθ(atst)p(st+1st,at)

取对数后为:

l o g p θ ( τ ∣ θ ) = l o g p ( s 1 ) + ∑ t = 1 T l o g π θ ( a t ∣ s t ) p ( s t + 1 ∣ s t , a t ) \mathrm{log}p_{\theta}(\tau|{\theta}) = \mathrm{log}p(s_1)+\sum_{t=1}^T \mathrm{log}\pi_{\theta}(a_t|s_t)p(s_{t+1}|s_t,a_t) logpθ(τθ)=logp(s1)+t=1Tlogπθ(atst)p(st+1st,at)

继续求导:

∇ l o g p θ ( τ ∣ θ ) = ∑ t = 1 T ∇ θ l o g π θ ( a t ∣ s t ) \nabla \mathrm{log}p_{\theta}(\tau|{\theta}) = \sum_{t=1}^T \nabla_{\theta}\mathrm{log} \pi_{\theta}(a_t|s_t) logpθ(τθ)=t=1Tθlogπθ(atst)

代入第3个式子,可以将其化简为:

∇ θ J ( θ ) = E τ ∼ p θ ( τ ) [ ∇ θ l o g p θ ( τ ) r ( τ ) ] = E τ ∼ p θ [ ( ∇ θ l o g π θ ( a t ∣ s t ) ) ( ∑ t = 1 T r ( s t , a t ) ) ] = 1 N ∑ i = 1 N [ ( ∑ t = 1 T ∇ θ l o g π θ ( a i , t ∣ s i , t ) ) ( ∑ t = 1 N r ( s i , t , a i , t ) ) ] \begin{aligned} \nabla_{\theta}J(\theta) &= E_{\tau \sim p_{\theta}(\tau)}[{\nabla}_{\theta}\mathrm{log}p_{\theta}(\tau)r(\tau)] \\ &= E_{\tau \sim p_{\theta}}[(\nabla_{\theta}\mathrm{log}\pi_{\theta}(a_t|s_t))(\sum_{t=1}^Tr(s_t,a_t))] \\ &= \frac{1}{N}\sum_{i=1}^N[(\sum_{t=1}^T\nabla_{\theta}\mathrm{log} \pi_{\theta}(a_{i,t}|s_{i,t}))(\sum_{t=1}^Nr(s_{i,t},a_{i,t}))] \end{aligned} θJ(θ)=Eτpθ(τ)[θlogpθ(τ)r(τ)]=Eτpθ[(θlogπθ(atst))(t=1Tr(st,at))]=N1i=1N[(t=1Tθlogπθ(ai,tsi,t))(t=1Nr(si,t,ai,t))]

3.2 友善的面试官:可以说一下你所了解的基于策略梯度优化的技巧吗?

(1)增加基线:为了防止所有奖励都为正,从而导致每一个状态和动作的变换,都会使得每一个变换的概率上升,我们把奖励减去一项 b b b,称 b b b 为基线。当减去 b b b 以后,就可以让奖励 R ( τ n ) − b R(\tau^n)-b R(τn)b 有正有负。如果得到的总奖励 R ( τ n ) R(\tau^n) R(τn) 大于 b b b ,就让它的概率上升。如果总奖励小于 b b b,就算它是正的,值很小也是不好的,就需要让它的概率下降。如果总奖励小于 b b b ,就要让采取这个动作的奖励下降,这样也符合常理。但是使用基线会让本来奖励很大的“动作”的奖励变小,降低更新速率。

(2)指派合适的分数:首先,原始权重是整个回合的总奖励。现在改成从某个时间点 t t t 开始,假设这个动作是在时间点 t t t 被执行的,那么从时间点 t t t ,一直到游戏结束所有奖励的总和,才真的代表这个动作是好的还是不好的;接下来我们再进一步,把未来的奖励打一个折扣,这里我们称由此得到的奖励的和为折扣回报。

(3)综合以上两种技巧,我们将其统称为优势函数,用 A A A 来代表优势函数。优势函数取决于状态和动作,即我们需计算的是在某一个状态 s s s 采取某一个动作 a a a 的时候,优势函数有多大。

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

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

相关文章

Spring Cloud - Nacos 注册发现、分级模型、配置集群、环境隔离、原理

目录 一、Nacos 安装和配置 二、Nacos 服务注册发现 2.1、将服务注册到 nacos 中 2.2、执行效果 三、Nacos 的服务分级模型及配置 3.1、分级模型 3.2、配置集群 3.3、配置 Nacos 负载均衡策略 3.4、Nacos 服务实例的权重设置 3.5、环境隔离——namespace 四、Nacos注…

真实企业做自动化测试做法,从测试用例到测试报告...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 首先,…

SAP MM 组织结构配置

1.定义公司代码 创建公司代码一般来说是财务去配置,但是我们需要去有一个基本的了解,这样,你才能理清公司代码和MM 组织的关系 配置:SAP IMG Enterprise Structure -》Definition -> Financial Accounting -> Edit, Copy, …

深度学习(26)——YOLO系列(5)

深度学习(26)——YOLO-v7(5) 文章目录 深度学习(26)——YOLO-v7(5)絮絮叨叨1. conv和BN的融合2. 3*3卷积的替换(1)1*1卷积有什么作用?&#xff08…

解决方案 | 照明行业数字化营销CRM平台

“数字中国”作为二十大报告的“关键词”,也成为各行各业的高质量发展的主旋律,历史悠久的中国照明产业也积极拥抱“数字化”,以驱动高质量发展 。作为照明行业的领军企业,某照明行业客户很早就意识到企业数字化转型的重要性&…

Spring事务源码详解-spring原码(二)

上篇文章介绍了事务开启,前面介绍了解析adviors。 spring事务源码详解-spring原码(一)https://blog.csdn.net/ke1ying/article/details/131360060 事务源码 先从缓存里获取,主要是判断循环依赖是否创建动态代理 进去wrapIfNeces…

【MOOC 作业】第3章 传输层

不是标答也不是参考答案 仅从个人理解出发去做题 1、(20分) ‍主机甲和主机乙之间已建立一个 TCP 连接,TCP 最大段长度为 1000 字节,若主机甲的当前拥塞窗口为 5000 字节,在主机甲向主机乙连接发送 2 个最大段后,成功收到主机乙发…

Java微服务金融项目智牛股 项目简介与金融知识介绍及技术特点

项目简介 金融交易平台服务于金融衍生产品, 包含外汇、贵金属、期货、股票。 各产品具有不同属性与交易规则, 本项目对标MT4等大型交易平台, 遵循FIX全球最广泛的金融市场通用协议。 实现从证券注册开户、行情订阅与呈现, 股票撮合…

JAVA 日期类Date SimpleDateFormat Calendar

1、Date日期类 类 Date 表示一个特定的瞬间,精确到毫秒 1.1 Date的构造函数 Date() 分配一个 Date 对象,以表示分配它的时间(精确到毫秒) Date(long date) 分配一个 Date 对象,表示自从标准基准时间起指定时间的毫秒数…

2023最新AI创作系统/ChatGPT商业运营版网站程序源码+支持GPT4+支持ai绘画(MJ)+实时语音识别输入+免费更新版本

2023最新AI创作系统/ChatGPT商业运营版网站程序源码支持ai绘画支持GPT4.0实时语音识别输入文章资讯发布功能用户会员套餐免费更新版本 一、AI创作系统二、系统介绍三、系统程序下载四、安装教程五、主要功能展示六、更新日志 一、AI创作系统 1、提问:程序已经支持G…

论洗碗哥在CSDN摸滚打爬的256个日夜

目录 机缘 收获 成就 憧憬 机缘 创作初心了为了记录一下自己的日常学习过程,方便自己日后去总结,或者遇到类似的问题的时候就可以翻阅自己的文章了。也可以加深自己的印象。其实一开始我是一个不太善于总结的人,机缘之下,听到…

机器学习之PCA算法

目录 PCA算法 PCA目标 PCA原理推导 基于最大可分性推导 基于最近重构误差推导 PCA算法流程 PCA优点 PCA缺点 基于PCA的人脸识别 PCA算法 PCA,即主成分分析(Principal Component Analysis),是一种常用的降维技术&#x…

【博客674】警惕Prometheus 中的重复样本和无序时间戳错误

警惕Prometheus 中的重复样本和无序时间戳错误 1、场景 您的 Prometheus 服务器日志中是否遇到过以下错误? "Error on ingesting out-of-order samples" "Error on ingesting samples with different value but same timestamp" "dupli…

2023最全 Java 高频面试合集,掌握这些你也能进大厂

进大厂是大部分程序员的梦想,而进大厂的门槛也是比较高的,所以这里整理了一份阿里、美团、滴滴、头条等大厂面试大全,对于 Java 后端的朋友来说应该是最全面最完整的面试备战仓库,为了更好地整理每个模块,我也参考了很…

内网隧道代理技术(六)之 PowerCat反弹Shell

PowerCat反弹Shell PowerCat介绍 PowerCat是一个powershell写的tcp/ip瑞士军刀,看一看成ncat的powershell的实现,然后里面也加入了众多好用的功能,如文件上传,smb协议支持,中继模式,生成payload&#xff…

几分钟带你快速了解SpringBoot框架理论知识!

1.什么是SpringBoot SpringBoot其实就是Spring的子项目。它简化了Spring的开发难度,舍弃了一切可以舍弃的xml配置文件,提供了各种启动器,让程序员上手更快,节省了开发时间。 2.SpringBoot的优点 SpringBoot其实就是对Spring的缺…

抖音林客系统定制开发

抖音林客是一款提供旅游攻略和景点推荐的短视频社交平台,主要用户群体为喜欢旅游和分享生活的年轻人。从需求分析角度来看,可以从以下几个方面进行分析: 信息获取需求:抖音林客用户需求获取有关旅游的详细和实用的信息&#x…

Idea快捷键设置(Idea快捷键大全)

目录 友情提醒第一章、IDEA常用快捷键1.1)快捷键:查找/提示类1.2)快捷键:修改代码类1.3)快捷键:光标移动类 第二章、如何修改快捷键2.1)修改快捷键的方法2.2)我修改的快捷键&#xf…

不容错过!科东软件在2023华南国际工博会等你,一起见证科技的力量!

诚挚邀请 2023年6月27-29日,SCIIF华南国际工业博览会即将在深圳国际会展中心(宝安新馆)召开。本届华南工博会汇集大批国内外头部大咖,将呈现一系列世界领先的技术和创新理念,为新型工业发展注入新动力。 科东软件作为…

华为eNSP入门实验,Vlan配置,路由配置,用户模式,链路聚合

文章目录 一、同一交换机下的PC通信二、不交换机下的PC通信三、配置静态路由通信四、路由器rip协议配置五、路由器ospf协议配置六、单臂路由七、通过三层交换机使不同的Vlan能连通八、设备consolo密码模式九、设备consolo用户密码模式(AAA模式)十、Telne…