强化学习的数学原理(1)

news2024/12/28 4:05:25

基本概念

State:在下面的例子中就是指每个位置(location),例如s1、s2、s3…就是一个State,所有State的集合就是State Space(集合空间 S = { s1,s2,s3,s4,s5…,s9 })
在这里插入图片描述

Action:每个状态可采取的行动,就如下面图片的例子,对于任意的Agent,那么其可以有四个Action分别为a1(往上走)、a2(往右走)、a3(往下走)、a4(往左走)、a5(原地不动),我们把所有的Action放在一起就构成了一个Action Space:( A(si) = {a1,a2,a3,a4,a5})
在这里插入图片描述

State transition:当我们采取一个action的时候,Agent从一个State移动到另一个State,这样的以哦个过程就是state transition
第二张图片为什么采取了state transition还依然处于s1的state的呢,就是因为我们使用的上面的表格例子,S1往上走就超过边界,所以往上走还是会停留在原state
在这里插入图片描述
在这里插入图片描述

我们可以使用表格的形式来哦展示出所有的state transition,将每个状态上的action都表现出来,但是在实际使用的情况下比较受限,因为他只能表述确定性的情况,加入我们state是s1,我们使用action是a1,那么我们有可能被弹回s1,也有可能弹回s4,这种多情况是无法表达的
在这里插入图片描述

Policy:会告诉Agent如果我在一个state我因该使用哪个action,绿色的箭头就是Policy,圆圈代表待在原地不动。 path:如图中虚线就是我们状态转移的过程
在这里插入图片描述
一般使用这种条件概率的方式表示Policy,其中派在强化学习当中指的是策略,派就是一个条件概率,它指定了任何一个state下任何一个action他的概率是多少
在这里插入图片描述
不确定情况,每个action都有概率,只不过有些的为0
在这里插入图片描述
表格形式表达策略
在这里插入图片描述

Reward: 首先reward是一个数,一个实数是一个标量,在agent采取了一个action之后会得到这样一个数,如果这个数是一个正数,那么代表我们对这个action是鼓励的;如果数为负数那么代表我们不希望这样的的action发生
如果我们不给reward或者reward设置为0 就是没有punishment,没有punishment在一定程度上就是鼓励
也可以用正数代表punishment,负数代表鼓励
在这里插入图片描述
在实际情况下我们得到的reward打的大小是不确定的,这个时候表格就不再适用了,这时候就可以使用比一般化的方法条件概率来表示
reward考虑的是其state和采取的action,而不是下一个state
在这里插入图片描述

Trajectory and return:是一个state-action-reward的链
return:就是这一个trajectory上所有reward的总和,其作用还可以比较不同策略的优劣
在这里插入图片描述
不同的策略会得到不同的轨迹也会有不同的trajectory和return
在这里插入图片描述
以上两策略的好坏我们可以通过return来进行判断,两种策略都达到目标,但是第二种策略中是进入到了一个惩罚方块里,那么我们可以用return来查看不同测控的优劣
在这里插入图片描述

Discounted return
上面我们讲到的策略中,到达S9之后其action就会选择a5,他的return也会一直+1,这样下去最后的return就会变成无穷大,就会被发散掉
在这里插入图片描述
为了解决上面发散的问题,我们引入了discount rate γ∈ [0,1),discount rate
和return相结合就得到了Discounted return
按照下面的描述我们可以看到可以通过控制γ来控制agent最后学到的策略,如果我们减小γ,那么会让它变得更加近视(会更加注重最近的一些reward),如果变大那么会更加远视(会更加注重长远的reward)
在这里插入图片描述

Episode
Episode一般会伴随terminal states,terminal
states就是下面从S1到S9的一个过程又被称之为一个trial,他的步骤是有限的
在这里插入图片描述
有些任务他是没有terminal states的,就意味着agent和环境的交互会永远的持续下去,这样的任务就是continuing tasks,现实中我们是找不到无线持续下去的任务,但是我们会近似地把时间持续比较长的任务说成是continuing tasks
在我们这个例子中agent到达目标区域后我们是要让agent停在那不动还是要像上面计算Discounted return一样让它在执行策略然后一直停留在S9位置呢,我们有一种统一的方法来描述这种episode和continuing tasks,在后面这里我们不区分他们两个,因为我们把这种episode task 转换成了continuing task,下面是转换的两种方法:
(1)我们把target state认为是一个特殊的absorbing state(我们在设置他的stage transition probability的时候如果当前状态就是target状态那么不论你采取什么action他都会再回到这个状态或者说在这个状态的时候他就没有其他的action,可以修改它的action space为只有停留在原地的action),还要在修改在这之后所得到的reward全部都是0
(2)我们将target state认为是一个普通的状态,他也有策略,如果策略好的化他就一直停留在那里,可以收集正的reward,如果策略不好的话可以跳出来(后面一般都会使用此方法)

Markov decision process(MDP)框架

MDP包含很多要素

  • Sets(集合):State(state space)、Action(action space)、reward
  • Probability distribution:State transition probability:就是我们在S采取一个行动,这个行动从S跳到S` 的概率是多少 p(S`|S,a)
    reward probability:当前我在S采取action为a那么我得到的r的概率是多少p(r|s,a)
  • Policy:我在状态S,采取一个策略这个策略会告诉我采取action为a他的概率是多少Π(a|S)
  • Markov property:memoryless property不考虑历史策略
    在这里插入图片描述

下图 描述的是马尔可夫过程(Markov process)

Markov process 和 Markov decision process 的关系 Markov decision process
中如果decision就是我们的policy确定了,那么这个policy就和整个系统融为一体了,就变成了Markov process

在这里插入图片描述

贝尔曼公式(Bellman equation)

为什么return是重要的呢?
我们可以看到下面从S1出发采用了不同的策略到达我们的目标S4,那我们要如何判断哪个策略是最好的呢,直观上看因为第一个策略没有进入到 forbidden area(s2)因此其是最好的策略,第二种策略进入到了S2是最坏的,第三种策略有一定概率进入到S2是不好不坏的。那我们如何用数学来描述这样的直观结果呢,就可以使用return来进行策略评估
在这里插入图片描述
对策略1(Policy 1)计算return
在这里插入图片描述
对策略2(Policy 2)计算return
在这里插入图片描述
对策略(Policy 3)计算return,一般来说这已经不算是在求return了,因为对于return的定义来说,return是针对一条轨迹来定义的,但是这里面涉及到了两条轨迹,实际上我们计算的是平均值,也可以理解为求expectation,因此这里的return3就是我们后面要介绍的state value
在这里插入图片描述

通过return的大小来比较不同策略的优劣 在这里插入图片描述

计算从不同出发点出发的return,我们可以看到这些return是相互依赖的,这我们称之为Bootstraping
在这里插入图片描述
那这些return相互依赖我们又怎么计算我们所需要的return呢
在这里插入图片描述
公式 V = r + γPV 求出来的解就是我们所需要的return,同时这个公式也就是贝尔曼公式(Bellman equation),但是这只是针对非常简单的deterministic的情况

state value
为了介绍state value需要引入一些符号
对于单步过程,St指的是当前的状态,At指的是在当前状态下我们采取的动作是At,我们得到的下一个reward是R(t+1)有时也会写成Rt,跳到的下一个吧状态是S(t+1),t指的是当前时刻,t+1指的是下一个时刻
在这里插入图片描述
在这些过程当中所有的跳跃都由probability distribution来决定的 在St要采取什么样的动作,是由策略来决定的
在St采取action At要得到什么样的reward是由reward probability决定的
在St采取At要跳到下一个什么状态是由state transition probability决定的
在这里插入图片描述
上面这样一个单步的过程可以推广到一个多部的trajectory,因为R(t+n)是一个随机变量,因此Gt也是一个随机变量
在这里插入图片描述
定义state value Gt是对一个trajectory的discounted return,state
value就是Gt的期望值(expectation、expectation value、mean、average、平均值),state
value的全称是state-value function
在这里插入图片描述

  • VΠ(s)是一个s的一个函数,因此从不同的s出发,我们得到的轨迹不同,那么得到的discounted return也是不同的,我们求出的平均也是不同的
  • 它是一个策略的函数,不同的策略会得到不同的轨迹,不同的轨迹会得到你不同的return,进而又会得到不同的state value
  • state value中的value不仅仅是数值上的value,还可以代表它的一种价值,当一个state value比较大的时候就代表这个状态是比较有价值的,因为从这个状态出发我们会得到更多的return

return 和state value有啥区别和联系?
return是针对当个trajectory,而state value是对多个trajectory得到return再求平均值

下面的例子我们计算三个不同策略从S1出发的state value
在这里插入图片描述

如何推导贝尔曼公式
上面我们已经讲到了state value的概念和作用,那么怎么来计算state
value呢,这就需要使用贝尔曼公式进行计算。 贝尔曼公式描述了不同状态的state value之间的关系

首先我们从一个St出发采取At,得到以下的一个trajectory
在这里插入图片描述
我们可以计算这个trajectory的discounted return
Gt,最终经过化简,我们得到Gt等于最近的reward加上下一个时刻为出发点出发能够得到的return
在这里插入图片描述
根据state value的定义得到以下式子,然后把Gt分成最近reward和将来的reward两个部分,最终我们将其分开就得到两个expectation,下面我们就开始分析这两个expectation
在这里插入图片描述

第一个expectation所表示的就是当前时刻在状态s(St = s)我得到当前的reward(immediate reward)是Rt+1,那么它的mean(期望值)是什么
首先我们在状态s(St = s)可以有多个action可以采取,我们采取action a的概率就是Π(a|s),当我们采取action a我们得到的value就是E[Rt+1 | St = s,At = a]也就是Σp(r|s,a)r (从s出发采取action a得到r
reward的概率就是p(r | s,a)),所以根据expectation的定义就是下面式子中后半部分求和那一项Σp(r|s,a)r

在这里插入图片描述

第二个expectation所表示的是我从当前状态s(St = s),从s出发所得到的下一个时刻的return的mean(期望值Gt+1)
p(s` | s):从当前s出发跳到不同s`的概率 E[Gt+1 | St+1 = s, St+1 = S`]:当前状态是s,下一个状态时s`,计算从下一个状态出发我所得到的return的mean(期望值),因为我们知道下一个状态时s`,我们就不用再关心之前时什么状态,因此也可以化简为 E[Gt+1 | St+1 = s`](马尔可夫性质,没有记忆不关心之前的状态)
E[Gt+1 | St+1 = s`]:表示从s`出发计算之后所能得到的return的平均值那么也就是计算s`的state value所以可以转换成vΠ(s`)
p(s` | s,a)Π(a | s):从s出发有多种不同action可以选择选择其中一个action的概率是Π(a|s),选择的action跳到s`的概率是p(s` |s,a),因此我们可以将p(s` |s)变形成p(s` | s,a)Π(a | s)
在这里插入图片描述
因此由上面的推导贝尔曼公式表达式如下 其描述了不同state value之间的关系 这个式子对状态空间中所有的状态都成立
在这里插入图片描述

  • vΠ(s)和vΠ(s`)是需要计算的state value ,通过bootstrapping计算
  • 概率Π(a|s)是policy,因此贝尔曼公式是依赖于policy的,如果我们能够把state value计算出来实际上我们就是在做policy evaluation,就是去评估这个policy(策略)是好还是坏
  • 另外两个概率p(r|s,a)和p(s`|s,a)就是dynamic model或者叫environment model,这里又分两种情况,一种是我们知道这个model,另一种如果我们不知道model我们任然可以求出来state
    value,但是需要用到model free reinforcement learning算法

通过例子了解贝尔曼公式 下面我们用绿色箭头标注出了策略Π,下面也写出来这个问题中的所有贝尔曼公式
在这里插入图片描述
通过确定上面公式解析中提到的三个概率来确定最终的s1状态的的贝尔曼公式
在这里插入图片描述
按照上面的方法得到s2、s3、s4的贝尔曼公式
在这里插入图片描述
最终求解的结果如下
在这里插入图片描述

如果确定固定的γ = 0.9,那么最后的结果为:
在这里插入图片描述
因为s2、s3、s4离target area近,所以最终他们三个点的价值高,这三个点是值得去走的,s1离target area离target
area比较远因此其价值相对你较低,没有那么值得被走

贝尔曼公式矩阵和向量的形式
下面我们要了解的是怎么样求解贝尔曼公式当我们得到一个贝尔曼公式时,我们可以看到它等式左右和右边都有一个vΠ(s),假如从这一个公式中要求出state value 是不可能的。但是我们知道下面这个公式对所有的状态都是成立的,如果存在n个状态,那么我们就有n个这样的等式,如果我们把这n个等式放在一起我们就得到了一个 matrix-vector form
在这里插入图片描述

怎么得到matrix-vector from
我们将公式中ΣΠ(a|s)和Σp(r|s,a)合并为rΠ(s)
我们将公式中ΣΠ(a|s)和p(s`|s,a)结合就得到了pΠ(s`|s)(从s到s`的概率)也就是图二右边公式等号右边那一项
在这里插入图片描述
在这里插入图片描述
其中上图中rΠ(s)代表我从当前状态出发,所能得到的immediate reward的一个平均值
我们将上面整合的式子转换成matrix-vector from(如下图)
其中vΠ,rΠ是一个向量;[pΠ]ij代表第i行第j列的元素时从si跳到sj的概率,pΠ矩阵也被称为state transition matrix
在这里插入图片描述
例子:
在这里插入图片描述
在这里插入图片描述

使用贝尔曼公式的矩阵和向量形式来求解state value

为什么要求解state value?
给定一个policy我们会列出它的贝尔曼公式,在进一步求解这个贝尔曼公式得到state value,这样一个过程实际上叫做policy evaluation(policy evaluation是强化学习中非常重要,非常基础的工具,它可以评估一个策略的好坏)

如何解决贝尔曼公式结合的matrix-vector form 下面有两种方法
(1)closed-form solution:也就是直接给出state value的解析表达式(如下图),在实际过程中我们通常不会使用,因为里面涉及到需要求矩阵的逆,当状态空间比较大的时候,矩阵的维数也会比较大,求逆的计算量也会比较大,因此实际过程中更多使用迭代的方法
在这里插入图片描述
(2)迭代方法:如下图因为式子中rΠ,γ,pΠ我们都事先知道,我们就可与i事先猜一个v0,求出v1,再将v1带入式子求出v2,这样一直迭代就可以求出最后真实的v0,v1,…,vk序列 ,当k趋向于无穷的时候vk就收敛到了vΠ就是真正的state value
在这里插入图片描述
在这里插入图片描述
vk收敛到vΠ的证明
在这里插入图片描述

例子:这是比较好的policy,但是我们看出即使两个policy是不一样的,但是他们得到的state value 时一样的,因此不同的policy是可能得到相同的state value的
在这里插入图片描述
看起来比较差的策略,很多时候下面两种策略的state value都是负的,也有出现撞墙的情况
在这里插入图片描述

Action value

State value和Action value有什么区别的联系?
State value指的是agent从一个状态出发所得到的average return,Action value指的是它从一个状态出发并且选择了一个action之后所得到的average return

为什么要关注Action value?
在强化学习中的策略中我们会有很多可选的action,那我们需要选择那些action呢,这时候就需要通过action value 来进行判断,action value 大的意味着我选择那个action可以得到更多的reward

action value 的定义:我从当前的状态s(St = s)出发,采取action a(At = a)之后我所得到的return的一个average就是action value
qΠ(s,a)是一个依赖于从哪个状态出发依赖于从这个状态的哪个action来出发的
action value 时依赖于策略Π的,不同的策略会得到不同的action value
在这里插入图片描述

数学上action value 和state value 他们有什么联系
图中的vΠ(s)是state value ,qΠ(s,a)是action value
公式(2)告诉我们如果我们知道action value 那么求平均我们就得到了这个状态的state value
公式(4)告诉我们如果知道了所有状态呢的state value我们就可以求出来所有的action value
在这里插入图片描述
在这里插入图片描述

例子:
策略已经用绿色箭头标出,首先的任务是针对s1写出对于s1的action value
策略告诉我们在s1的时候要往右走,接下来我们在求关于s2的action value那么我们就可以求出
在这里插入图片描述

如何来计算action value
(1)我们先求解了一个贝尔曼公式,然后我们可以从state value 中计算出action value
(2)我们也可以不计算state value 而直接计算action value,例如通过数据的方式,这时就可能不需要依赖模型

最优策略和贝尔曼最优公式

两个概念:optimal state value 、optimal policy
一个工具:贝尔曼最优公式(Bellman optimal equation(BOE))
强化学习的目的:寻找最优策略

先从例子出手,上面讲到的我们可以使用贝尔曼公式计算出State value ,然后我们可任意通过求解出来的State value 计算出 Action value
在这里插入图片描述
在这里插入图片描述
从上面计算的例子我们发现上面的策略其实不是最好的,那么我们怎么去改进这个策略,得到更好的策略呢,这就需要依赖Action value ,首先我们先将上面的策略写成下面图片中的形式(当a = a2往右走的时候它是1,当a != a2的时候等于0),在这个策略下我们已经计算出它的action value 并且我们发现a3的action value是最大的,因此我们需要保证每次我们都采取action value最大的action,这就能保证我们最终的整个策略是最好的,这需要在前一步是最优的情况下进行,因此需要进行迭代,这时候就可以使用贝尔曼最优公式来解决。
在这里插入图片描述

optimal policy 的定义
如果我们优两个策略Π1、Π2,那么他们在每一个状态都有自己的state value,如果对于所有的状态s,Π1得到的state value 都是大于Π2得到的state value,那我们就说Π1是要比Π2要好的
最优:如果一个策略Π*它对任意一个状态相比任意的其他一个策略Π它所得到state value 都要大,我们就是这个Π*是最优的

贝尔曼最优公式(Bellman optimality equation)
对于贝尔曼公式是给定的一个策略Π进行求解,但是对于贝尔曼最优公式我们是不确定策略Π的,我们需要去求解这个策略Π
在这里插入图片描述

在这里插入图片描述

贝尔曼最优公式最大化问题分析
在这里插入图片描述
我们可以看到在贝尔曼最优公式里面等号右边存在一个最优问题(max),并且对于这个最优问题策略Π是我们需要求解的未知量,并且在式子中v(s)也存在于式子两边,也是需要求解的未知量,那么我们怎么用一个式子求解两个未知量呢?可以按照下面的思路来进行求解
在这里插入图片描述
我们可以先固定v在求解其对应的策略Π
在这里插入图片描述
在这里插入图片描述
上面已经你介绍过我们怎么处理maxΠ,因此我们可以将右边求解maxΠ写成下面的式子来表示
在这里插入图片描述

其中的f(v)是一个向量,在这个向量中对应的state s对应的元素就是maxΣΠ(a|s)q(s,a),接下来我们求解贝尔曼最优公式就可以求解v = f(v)就行

在求解式子v = f(v)之前我们先介绍一个contraction mapping theorem

fixed point(不动点):如果在集合X上有一个点x,有一个映射或者函数f,如果x满足f(x) = x,x就被称为一个不动点或者fixed point
在这里插入图片描述
Contraction mapping(contractive function):如果有一个函数被称为contraction mapping,那么它满足下面的不等式(去任意两个点,他们的函数值的差的norm是小于这两个点的norm,并且存在一个因子γ∈(0,1))[就是在一维空间中f(x1)与f(x2)之间的距离比x1与x2之间的距离还要小]
在这里插入图片描述
在这里插入图片描述

contraction mapping theorem
如果f是一个contraction mapping,那么对于式子x = f(x),contraction mapping theorem告诉我们三个重要的结论
(1)Existence:不关心f的表达式究竟是什么,只要是一个contraction mapping 我们就知道他一定存在一个 fixed point满足F(x*) = x*,
(2)Uniqueness:我们还知道这个fixed point 他是唯一存在的
(3)Algorithm:还知道怎样去求解这样一个fixed point ,使用迭代式算法xk+1 = f(xkl)
在这里插入图片描述
在这里插入图片描述

在BOE中应用Contraction property
为了在贝尔曼最优公式中应用contraction mapping theorem,我们首先需要证明贝尔曼公式中的f(v)是一个contraction mapping,其中γ是 discount rate 是小于1的,所以v = f(v)是一个contraction mapping
在这里插入图片描述

贝尔曼最优公式的解的最优性
贝尔曼最优公式是一个特殊的贝尔曼公式
假设v是贝尔曼最优公式的解,可以用我们上面介绍的算法求解出来,Π*是对应v*的一个最优策略
在这里插入图片描述
证明这个贝尔曼最优公式的策略是不是最优的这个state value v
、vΠ*是不是最大的可以使用下面的结论来进行证明
在这里插入图片描述
在这里插入图片描述

贝尔曼最优公式的性质
什么样的因素决定了最优策略,由下图中红色的变量来决定
在这里插入图片描述

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

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

相关文章

openEuler 安装 podman 和 podman compose

在 openEuler 22.03 LTS SP4 中,你可以使用 dnf 包管理器来安装 Podman 和 Podman Compose。openEuler 默认使用 dnf 作为包管理器,所以这是安装软件的首选方式。 关于 openEuler 22.03 LTS SP4 下载地址: https://www.openeuler.org/zh/dow…

昇思MindSpore 25天学习打卡营|day20

GAN图像生成 模型简介 生成式对抗网络(Generative Adversarial Networks,GAN)是一种生成式机器学习模型,是近年来复杂分布上无监督学习最具前景的方法之一。 最初,GAN由Ian J. Goodfellow于2014年发明,并在论文Generative Adve…

Java中HashMap详解:hash原理、扩容机制、线程不安全及源码分析

前言 HashMap 是 Java 中常用的数据结构之一,用于存储键值对。在 HashMap 中,每个键都映射到一个唯一的值,可以通过键来快速访问对应的值,算法时间复杂度可以达到 O(1)。 HashMap 的实现原理是基于哈希表的,它的底层是…

Java语言程序设计——篇四(1)

类和对象 面向对象概述面向过程与面向对象面向对象基本概念面向对象的基本特征面向对象的优势及应用 为对象定义类类的修饰符成员变量成员变量-修饰符 构造方法⭐️成员方法成员方法-修饰符例题讲解 ⚠️理解栈和堆 面向对象概述 两种程序设计方法 结构化程序设计&#xff0c…

方波的傅里叶变换及方波的MATLAB实现

一、傅里叶变换简介 傅里叶变换,表示能将满足一定条件的某个函数表示成三角函数(正弦和/或余弦函数)或者它们的积分的线性组合。傅里叶变换是一种线性的积分变换。它的理论依据是:任何连续周期信号都可以由一组适当的正弦曲线组合…

Mac安装stable diffusion 工具

文章目录 1.安装 Homebrew2.安装 stable diffusion webui 的依赖3.下载 stable diffusion webui 代码4.启动 stable diffusion webui 本体5.下载模型6.这里可能会遇到一个clip-vit-large-patch14报错 参考:https://brew.idayer.com/install/stable-diffusion-webui/…

Unity 优化合集

1️⃣ 贴图优化 1. Read/Write Enable 这个属性勾选后允许你在运行时读取和写入纹理数据,这对于需要实时生成内容或者需要动态修改纹理的场合非常有用但在大部分情况下这是不必要的。如果打开这个属性,会使运行时贴图大小翻倍,内存中会额外…

浅谈C嘎嘎入门基础

看到这篇文章的童鞋或许会有疑惑,这不是之前 已经出过了吗,是的但是之前那篇文章可能不太好理解,因此我再写一篇便于大家理解的文章 那么上一篇文章已经帮大家过渡到C嘎嘎了,那么这篇文章我们继续讲解C嘎嘎的知识点。 C嘎嘎中的引…

牛客:DP25 删除相邻数字的最大分数(动态规划)

文章目录 1. 题目描述2. 解题思路3. 代码实现 1. 题目描述 2. 解题思路 题目的意思是选择某一个数,就会得到这个数 * 它出现的次数的分数,因此为了能快速统计出选择某一个数所能得到的分数,我们可以在输入数据时,使用一个数据来计…

C++的入门基础(二)

目录 引用的概念和定义引用的特性引用的使用const引用指针和引用的关系引用的实际作用inlinenullptr 引用的概念和定义 在语法上引用是给一个变量取别名,和这个变量共用同一块空间,并不会给引用开一块空间。 取别名就是一块空间有多个名字 类型& …

vue3+ECharts实现可视化中国地图

目录 版本问题解决 中国地图实现 版本问题解决 目前echarts的最新版本为5.5.1 echarts在4.9.0版本以后移除了中国地图,所以如果的你的版本高于4.9.0就需要手动导入中国地图。版本低于或者等于4.9.0则不需要导入。 这里我分享一种导入方法: 1.将项目的…

前端JS特效第34波:jQuery支持拖拽图片上传的图片批量上传插件

jQuery支持拖拽图片上传的图片批量上传插件&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>jQuery支持拖拽图片上传的图片批…

J027_递归算法

一、求n的阶乘 n的阶乘&#xff1a;1*2*3*4*...*n package com.itheima.d01_file;public class DiguiTest1 {public static void main(String[] args) {//求n的阶乘System.out.println(f(3));System.out.println(f(4));System.out.println(f(5));}private static int f(int n…

[激光原理与应用-111]:南京科耐激光-激光焊接-焊中检测-智能制程监测系统IPM介绍 - 15 - 常见缺陷与波形特征

目录 前言&#xff1a;激光焊接时的光谱特征 可见光 反射光 红外热辐射光 总结 一、动力电池 - 模组 - BusBar焊接 1.1 概述 1.2 没有缺陷波形&#xff1a;一条焊缝 1.3 保护气缺失 1. 可见光 2. 反射光 3. 红外光 综合分析 1.4 功率衰减 1. 可见光 2. 反射光 …

捷配生产总结-PCB上器件布局不好对SMTDIP的影响

在电子制造领域&#xff0c;PCB&#xff08;印刷电路板&#xff09;的设计至关重要&#xff0c;其中器件的布局更是影响着整个生产流程的效率和质量。特别是对于 SMT&#xff08;表面贴装技术&#xff09;和 DIP&#xff08;双列直插式封装&#xff09;这两种常见的组装工艺&am…

STM32之七:SPI通信

目录 1.SPI通信简介 1.1 主从模式 1.2 4根通信线 1.3 数据传输 2. SPI总线时序及其4种工作模式 2.1 SPI数据移位示意 2.2 SPI四种工作模式 2.2.1 mode 0 &#xff1a;CPOL 0,CPHA0 2.2.2 mode 1&#xff1a; CPOL 0&#xff0c;CPHA 1 2.2.3 mode 2&#xff1a; C…

2024-07-14 Unity插件 Odin Inspector1 —— 插件介绍

文章目录 1 介绍2 模块3 学习目的 1 介绍 ​ Odin Inspector 是 Unity 的一个插件&#xff0c;拥有强大、自定义和用户友好的编辑器&#xff0c;而无需编写任何自定义编辑器代码&#xff0c;使得编程过程中的数据可视化更容易实现。 ​ 具体功能包括&#xff1a; 更舒适美观…

新一代大语言模型 GPT-5 对工作与生活的影响及应对策略

文章目录 &#x1f4d2;一、引言 &#x1f4d2;二、GPT-5 的发展背景 &#x1f680;&#xff08;一&#xff09;GPT-4 的表现与特点 &#x1f680;&#xff08;二&#xff09;GPT-5 的预期进步 &#x1f4d2;三、GPT-5 对工作的影响 &#x1f680;&#xff08;一&#xf…

FreeRTOS学习(1)STM32单片机移植FreeRTOS

一、FreeRTOS源码的下载 1、官网下载 FreeRTOS官方链接 官方下载速度慢&#xff0c;需要翻墙&#xff0c;一般选择第一个 2、直接通过仓库下载 仓库地址链接 同样很慢&#xff0c;甚至打不开网页&#xff0c;也不建议使用这种方法。 3、百度网盘 链接&#xff1a;https:…

ArrayList模拟实现

ArrayList模拟实现 ArrayList 的初步介绍常见操作 ArrayList 的简单模拟实现 ArrayList 的初步介绍 ArrayList也叫做顺序表&#xff0c;底层是一个数组。 在创建顺序表 时就应该规定 里面元素的数据类型&#xff0c;其中不能直接传基本数据类型&#xff0c;例如int、char。需要…