【强化学习】#7 基于表格型方法的规划和学习
主要参考学习资料:《强化学习(第2版)》[加]Richard S.Suttion [美]Andrew G.Barto 著
文章源文件:https://github.com/INKEM/Knowledge_Base
本章更是厘清概念厘到头秃,如有表达不恰当之处还请多多指教——
概述
- 环境的分布模型用于规划,样本模型用于学习,许多算法在规划和学习之间可以进行迁移。
- Dyna架构引入模型学习,将与规划相关的间接强化学习与学习代表的直接强化学习集成起来。
- 优先遍历根据贝尔曼误差判断价值估计更新的优先级进行顺序更新。
- 期望更新考虑所有可能发生的转移,采样更新考虑采样得到的单个转移样本。
- 轨迹采样是一种基于同轨策略分布的采样更新。
- 实时动态规划是一种基于轨迹采样的异步动态规划。
- 后台规划独立于环境交互进行,而决策时规划针对环境交互的当前状态进行规划。
- 预演算法是一种基于蒙特卡洛控制的决策时规划算法。
- 蒙特卡洛树搜索是一种使用树策略进行迭代式树展开的预演算法。
- 利用启发式函数指导搜索方向,显著减少计算量的优化搜索方法被称为启发式搜索。
目录
- 模型和规划
- Dyna
- Dyna-Q
- Dyna-Q+
- 优先遍历
- 期望更新与采样更新
- 轨迹采样
- 实时动态规划
- 决策时规划
- 预演算法
- 蒙特卡洛树搜索
在我们讨论过的强化学习方法中,既有具备环境模型的方法,例如动态规划,也有不具备环境模型的方法,例如蒙特卡洛方法和时序差分方法,这些方法分别被称为基于模型和无模型的强化学习方法。基于模型的方法主要依赖规划,而无模型的方法主要依赖学习。除此之外,这些强化学习方法都是表格型的,它们都用表格(数组或字典)存储状态或“状态-动作”二元组的价值。上一章我们将时序差分方法和蒙特卡洛方法用 n n n步方法统一了起来,本章我们的目标是将基于模型的方法和无模型的方法整合起来。
模型和规划
环境的模型是一个智能体可以用来预测环境对其动作的反应的任何事物。给定一个状态和一个动作,作为环境的反应结果,模型能产生后继状态和下一个收益的预测。如果模型是随机的,那么后继状态和下一个收益就有好几种可能。一些模型不仅能给出所有可能的结果,还能给出它们的完整概率分布,这种拥有环境全局信息的模型被称为分布模型;另一些模型无法给出结果的概率分布,而是一个黑箱,它只能利用状态和动作采样出一种可能的结果,并通过多次采样估计分布,这种只掌握来自环境的部分样本的模型被称为样本模型。分布模型仅适用于能够高效、精确地掌握环境特性的情况,而其余计算十分复杂或无法求解的环境特性则只能使用样本模型。所谓无模型的强化学习方法本质上是依赖样本模型的,但它仅将样本模型视为一个数据生成器,或者说是与真实环境交互的桥梁,无法进行解析。而基于模型的方法准确来说则是基于分布模型的。
模型的作用是产生经验。给定一个开始状态和动作,一个样本模型生成一个可能的转移,而分布模型会根据发生的概率产生所有可能的转移。给定一个开始状态和一个策略,一个样本模型可以生成一幕事件,而一个分布模型可以生成所有可能的幕和它们发生的概率。
规划是以环境模型为输入,并生成或改进与其进行交互的策略计算过程。
模型 → 规划 策略 模型\overset{规划}{\rightarrow}策略 模型→规划策略
在人工智能中有两种不同的规划方法。第一种是状态空间规划,即在状态空间中寻找最优策略或实现目标的最优决策路径,每个动作都会引发状态之间的转移,价值函数的定义和计算都是基于状态的;第二种是方案空间规划,即在已有的方案空间中进行搜索和优化,为此我们要将策略表示为参数化函数。方案空间规划很难有效地应用于随机性序列决策问题,而这是强化学习的重点,所以不会在本系列中进一步讨论。
所有的状态空间规划算法有两个基本的思想:
- 利用计算价值函数作为改善策略的关键中间步骤。
- 通过基于模拟经验的回溯操作来计算价值函数。
模型 → 模拟经验 → 回溯 价值函数 → 策略 模型\rightarrow模拟经验\overset{回溯}\rightarrow价值函数\rightarrow策略 模型→模拟经验→回溯价值函数→策略
所有状态空间规划方法都适用于上图这种结构,只是它们所做的回溯操作、执行操作的顺序以及回溯的信息被保留的时间有所不同。
现在我们可以将开头提到的基于模型的和无模型的方法分别依赖的规划和学习统一起来。规划和学习的核心都是通过回溯操作评估价值函数,不同之处在于规划利用分布模型仿真出的模拟经验,学习利用环境产生的真实经验,这种差异进一步导致了许多其他的差异。但是除此之外,规划和学习在结构上是通用的,这意味着许多思想和算法可以在规划和学习之间迁移,例如从分布模型中仿真的模拟经验也能像真实经验作为学习方法的输入。将 Q Q Q学习的流程迁移到分布模型上,利用对分布模型的采样作为 Q Q Q方法的经验输入,我们得到了随机采样单步表格型Q规划算法,其流程如下:
Dyna
Dyna-Q
利用分布模型采样的优点是无需真实交互成本,可并行生成大量数据加速训练,但如果分布模型的建立存在误差,也会传播到策略中;由样本模型从真实环境中采样的优点是数据直接反映真实环境,无模型偏差,但数据获取成本高。而Dyna-Q是一种整合了分布模型与样本模型、规划与学习的特性,交替使用模型采样和环境采样的架构,使得二者的优缺点得到了良好的互补。
Dyna-Q的核心思想是,对一个智能体来说,经验可以扮演两个角色,它能用来改进模型,或是直接更新价值函数和策略。前者称为模型学习,后者则称为直接强化学习。改进后的模型则通过规划影响价值函数和策略,这种与规划相关的方式称为间接强化学习。下图展示了经验、模型、价值和策略之间的可能关系:
直接强化学习类似于试错学习和被动的反应式决策,而间接强化学习则代表了原理认知和主动的预谋性规划。
Dyna-Q的模型学习方法也是基于表格的,并且假设环境是确定的。在每次转移 S t , A t ← R t + 1 , S t + 1 S_t,A_t\leftarrow R_{t+1},S_{t+1} St,At←Rt+1,St+1之后,模型在它的表格中会为 S t , A t S_t,A_t St,At建立条目,记录环境在这种情况下产生的转移结果的预测值 R t + 1 , S t + 1 R_{t+1},S_{t+1} Rt+1,St+1。规划过程中,算法将随机从模型之前学习到的“状态-动作”二元组进行采样并返回历史观测值。除此之外,Dyna-Q的规划方法是上一节给出的随机采样单步表格型 Q Q Q规划方法,直接强化学习方法是单步表格型 Q Q Q学习(即时序差分学习一章中的 Q Q Q学习)。
上图展示了一般的Dyna架构。从概念上讲,规划、动作执行、模型学习和直接强化学习在Dyna的智能体中是并行进行的,但在串行计算机中我们需要指定它们的发生顺序。动作执行、模型学习和直接强化学习过程只需要很少的计算,而规划则需要计算密集的迭代过程,因此我们在每次循环中先执行前者,最后将剩余的计算用于规划。表格型Dyna-Q算法的伪代码如下,其中 M o d e l ( s , a ) Model(s,a) Model(s,a)基于“状态-动作”二元组 ( s , a ) (s,a) (s,a)预测后继状态和收益:
由此可见,模拟规划的过程就相当于记住之前的经验并重复利用,将一次真实交互的数据用于多次更新,减少冗余探索和重复试错。利用从真实环境中交互获得的样本构建分布模型来进行规划,和依赖交互进行学习相比,是一种节省交互成本、提升数据利用率和计算效率的手段,这在诸如机器人控制、自动驾驶这类真实交互成本高的场景中是很适用的。
Dyna-Q+
Dyna-Q假设环境是确定的,此时模型总是被填充完全正确的信息。但在更多时候我们没有这么幸运,以下这些原因都会导致模型错误:
- 随机环境中只有数量有限的样本会被观察到。
- 模型用于近似环境的函数泛化能力较差。
- 环境发生改变且新的动态特性尚未被观察到。
当模型错误时,规划过程就可能计算出次优的策略。
在某些情况下,规划计算出的次优策略能使得Dyna-Q很快发现并修正模型错误,例如环境变化导致原始最优策略的回报大大降低,模型能很快沿着策略所在路径感知到自身信息和环境不匹配,进而修正错误。但如果这种变化对原始最优策略没有影响,而是产生了原始最优策略之外的捷径,那么Dyna-Q将很难摆脱对原始最优策略的依赖去探索更优的策略。
这个例子中的问题是试探与开发困境的另一种版本。在规划中,试探意味着尝试那些可能改善模型的动作,开发意味着以当前模型的最优方式来执行动作。我们希望智能体通过试探发现环境的变化,但又不希望试探得太多使得平均性能大大降低,因而很难找到一个完美又实用的解决方案。
Dyna-Q+采用的启发式方法在一定程度上克服了这种问题。Dyna-Q+的智能体会对每一个“状态-动作”二元组进行跟踪,记录它自上一次在与环境进行真实交互以来已经过了多少时刻。时间越长,我们就越有理由推测这个二元组相关的环境动态特性会产生变化,也即关于它的模型是不正确的。
为了鼓励测试长期未出现过的“状态-动作”二元组,一个和未出现时间相关的“额外收益”将会提供给智能体。如果模型记录的单步转移收益为 r r r,而这个转移在 τ \tau τ时刻内没有尝试,那么在更新时就会采用 r + κ τ r+\kappa\sqrt\tau r+κτ的收益,其中 κ \kappa κ是一个比较小的正数。这会鼓励智能体不断试探所有可访问的状态转移,甚至使用一长串的动作完成这种试探。
优先遍历
对于上一节介绍的Dyna智能体,模拟经验中的转移是从所有先前经历过的每个“状态-动作”二元组中随机均匀采样得到的。均匀采样通常不是最好的,如果模拟转移和价值函数更新集中在某些特定的“状态-动作”二元组上,则规划可能会高效得多,根据某种更新迫切性的度量对更新进行优先级排序便是优先遍历的基本思想。
直观地考虑,我们可以认为以下情况的“状态-动作”二元组是值得优先遍历的:
- 其更新对策略具有较大的影响(例如接近目标或危险的收益显著的状态)
- 其价值估计的误差较大
符合这两种情况的动“状态-动作”二元组,其价值估计在遍历后往往会产生较大的变化量,回顾 Q Q Q函数的更新公式
Q ( S t , A t ) ← Q ( S t , A t ) + α [ R t + 1 + γ max a Q ( S t + 1 , a ) − Q ( S t , A t ) ] Q(S_t,A_t)\leftarrow Q(S_t,A_t)+\alpha[R_{t+1}+\gamma\underset a\max Q(S_{t+1},a)-Q(S_t,A_t)] Q(St,At)←Q(St,At)+α[Rt+1+γamaxQ(St+1,a)−Q(St,At)]
则其优先级可以用 α \alpha α后的部分来表示
p r i o r i t y ( S t , A t ) = ∣ R t + 1 + γ max a Q ( S t + 1 , a ) − Q ( S t , A t ) ∣ priority(S_t,A_t)=|R_{t+1}+\gamma\underset a\max Q(S_{t+1},a)-Q(S_t,A_t)| priority(St,At)=∣Rt+1+γamaxQ(St+1,a)−Q(St,At)∣
该优先级衡量标准也称为贝尔曼误差。贝尔曼误差越大,当前估计值越不准确,则应该尽快更新。反之则当前估计值已接近最优,可稍后更新。通常我们会设定一个阈值 θ \theta θ,只有贝尔曼误差超过 θ \theta θ时,估计值的更新才会按优先级进入优先遍历队列。
除此之外,如果智能体在与环境交互时将一个“状态-动作”二元组 ( s , a ) (s,a) (s,a)放入优先遍历队列,那么我们也可以推断,在规划中,对 ( s , a ) (s,a) (s,a)的估计更新后,以 s s s为可能的后继状态的“状态-动作”二元组 ( s ˉ , a ˉ ) (\bar s,\bar a) (sˉ,aˉ)的贝尔曼误差将会受到影响,因此可以立刻对所有 ( s ˉ , a ˉ ) (\bar s,\bar a) (sˉ,aˉ)评估优先级,判断它们是否要在当前轮规划中得到更新,这样就无需等到下一次与环境交互时再考虑了。
在确定性环境下的优先遍历算法的伪代码如下:
但是当环境随机时,优先遍历将采用期望更新,这可能会浪费大量计算来处理低概率的转移。
期望更新与采样更新
目前我们关注的单步更新方法主要在三个维度上有所区分:
- 更新状态价值还是动作价值
- 估计任意给定策略的价值还是最优策略的价值
- 采用期望更新还是采样更新
期望更新会考虑所有可能发生的转移,而采样更新仅仅考虑采样得到的单个转移样本。
在没有分布模型的情况下,进行期望更新是不可能的,我们只能使用采样更新作为其替代方法。但是拥有分布模型也不意味着期望更新就比采样更新更适合,期望更新肯定会产生更好的估计,因为它们不会受到采样误差的影响,但是它们也需要更多的计算,而计算往往是规划过程中的限制性资源。要正确评估期望更新和采样更新的相对优势,我们必须控制不同的计算量需求。
以 Q Q Q函数的更新为例,在实践中,价值函数更新操作所需的计算量通常由需要 Q Q Q函数评估的“状态-动作”二元组的数量决定。对于一个特定的初始二元组 ( s , a ) (s,a) (s,a),设 b b b是分支因子(即对于所有可能的后继状态 s ′ s' s′,模型估计的概率 p ^ ( s ′ ∣ s , a ) > 0 \hat p(s'|s,a)>0 p^(s′∣s,a)>0的数目),则这个二元组的期望更新需要的计算量大约是采样更新的 b b b倍。
在具有许多“状态-动作”二元组的大尺度问题中,期望更新往往会消耗非常长的时间,这种情况下我们最好先进行若干次采样更新,而不是直接进行期望更新。那么在相同的计算量下,进行期望更新和进行 b b b倍次数的采样更新哪个效果更好?
上图展示了在不同分支因子 b b b下,期望更新和采样更新的估计误差对计算次数的函数变化。其中估计误差是对一个“状态-动作”二元组的价值估计误差,对一个可能后继状态的动作价值估计取最大值视为一次计算。采样更新每次计算都会更新估计,而期望更新只有计算完所有 b b b个可能后继状态才会更新估计。我们假设所有 b b b个后继状态等概率发生,初始估计误差为 1 1 1,后继状态的价值是正确的。则期望估计在 b b b次计算后误差才降至 0 0 0,而采样更新则很快就能改善估计,且随着 b b b值的增大,采样更新仅采样了一小部分就收敛到了和期望更新差不多的效果。在这种情况下,采样更新会使得误差以比例系数 b − 1 b t \sqrt{\frac{b-1}{bt}} btb−1减小,其中 t t t是已经进行过的采样更新次数。这表明,对于拥有很大的随机分支因子并要求对大量状态价值准确求解的问题,采样更新可能比期望更新要好。
轨迹采样
为了更高效地分配状态更新过程中的算力,我们介绍了优先遍历,但优先遍历的期望更新仍可能带来复杂的计算量。
对于一个控制问题,其目标是找到最优策略,而不是像预测问题一样评估给定的策略。这时可能存在一些状态,来自任何初始状态的任何最优策略都无法到达它们,例如下棋时,大部分无规律的棋局通常不会出现。对于这些不相关的状态,我们就不需要指定最优动作。我们需要的是最优部分策略,即策略对于相关的状态是最优的,而对于不相关的状态可以指定任意的甚至是未定义的动作。而轨迹采样可以很好地筛选出需要得到更新的相关状态。
轨迹采样相当于有模型版本的蒙特卡洛方法,如同我们引入随机采样单步表格型Q规划的方式一样,它是一种学习方法到规划方法的迁移,利用模型产生的模拟经验而不是与环境交互的真实经验作为算法的输入。轨迹采样借助模拟生成经验来进行回溯更新。给定一组初始状态,样本动作由当前策略给出,样本状态转移和收益则都由模型给出,模型将持续模拟仿真直到终止状态。
从另一个角度讲,轨迹采样是一种基于同轨策略分布给出,即状态被采样更新的概率分布由在对应策略在任务中的执行情况决定。聚焦于同轨策略分布可能是有益的,因为这使得空间中大量不重要的区域被忽略。但这也可能是有害的,因为这使得空间中某些相同的旧区域一次又一次地被更新。
我们在同一个任务下对二者的效果进行比较。对 ∣ S ∣ |\mathcal S| ∣S∣个状态中的每个状态,有两个可能的动作,每个动作都导致 b b b种后继状态中的一个。针对每个“状态-动作”二元组,分支因子 b b b相同,而 b b b种后继状态的概率分布不同。每一次转移的期望收益从一个标准高斯分布中采样得到,在所有转移中,跳到终止状态结束整幕交互的概率为 0.1 0.1 0.1。
上图展示了在不同 b b b和 ∣ S ∣ |\mathcal S| ∣S∣下,同轨策略分布(on-policy)和均匀分布(uniform)超过200次试验的平均结果,二者迭代的策略均为 ϵ \epsilon ϵ-贪心策略( ϵ = 0.1 \epsilon=0.1 ϵ=0.1)。由此可见,同轨策略分布在初始阶段规划速度更快,但长期看却变化迟缓, b b b越小、 ∣ S ∣ |\mathcal S| ∣S∣越大时这个效应就越强。这是因为在短期内根据同轨策略分布进行采样有助于聚焦于接近初始状态的后继状态,而长期下,通常发生的各种状态都已经有了正确的估计值,对它们采样的效益是较低的。尽管上述结果不能形成一般性的结论,但它们确实表明,根据同轨策略分布的采样对于大尺度问题可能具有很大的优势。
实时动态规划
实时动态规划(RTDP)是动态规划(DP)价值迭代算法的同轨策略轨迹采样版本。传统DP需要在每一轮中对所有状态进行更新,而RTDP是异步DP的一个例子,其对状态的更新顺序是由模拟轨迹中状态被访问的顺序决定的。
轨迹采样给RTDP带来的是,对于满足某些合理条件的特定类型的问题,RTDP可以保证找到相关状态下的最优策略,而无须频繁访问每个状态,甚至可以完全不访问某些状态。事实上,在某些问题上,只需要访问一小部分状态,这对于大尺度状态集的问题来说可能是一个很大的优势,因为它们的单次遍历也是不可行的。
使得RTDP可以收敛于对所有相关状态的最优策略的前提条件如下:
- 每个目标状态的初始值(初始价值估计)为零。
- 存在至少一个策略,保证从任何初始状态都能够达到目标状态。
- 从非目标状态跳出的转移(或者说在到达目标状态前的每次状态转移)所对应的收益都严格为负。
- 所有初始值都大于等于其最优值(由于上一个条件,可以通过简单地将所有初始值设置为零来满足)。
决策时规划
本章目前讨论的以动态规划和Dyna为代表的方法所采取的规划方式为后台规划。后台规划在非交互时段进行,按照独立于环境交互的更新方式,用模型生成模拟数据用以优化策略或价值函数。
规划过程的另一种运行方式是在与环境交互的过程中遇到状态 S t S_t St之后才开始并完成规划,其计算后将返回一个动作 A t A_t At。智能体执行动作 A t A_t At后转移到状态 S t + 1 S_{t+1} St+1,而下一轮规划过程也将从 S t + 1 S_{t+1} St+1开始并返回 A t + 1 A_{t+1} At+1,以此类推。这种与环境交互相关,聚焦于特定状态的规划被称为决策时规划。
在决策时规划中,智能体与环境交互并不依赖于固定的策略,而是根据当前状态随机应变。决策时规划会以当前状态 S t S_t St为起点,对每个候选动作 a a a模拟多条轨迹并根据每一步的收益计算它们的折扣回报,选择回报值最高的动作返回。如果模拟轨迹只计算 S t S_t St之后未到达终止状态的 n n n步回报,则最后一个状态的价值估计将来源于预训练策略或价值网络(例如棋局胜率)。一轮规划过程结束之后,其存储的规划结果将被丢弃,下一时刻的状态将重新被评估。
后台规划的计算资源利用率高,策略具有全局一致性,但其无法快速适应环境突变,且可能浪费计算在无关状态上。决策时规划实时适配当前状态,策略具有高灵活性,因而适用于复杂多变的环境,但需要考虑计算延迟带来的实时性问题。
预演算法
预演算法是一种将预训练策略 π \pi π,也叫预演策略,应用到智能体与环境交互当中的决策时规划算法。一个有效的预演算法可以在预演策略的基础上修正的局部缺陷,增强动态适应性,进而提升其实时表现。
预演算法的核心思想是动态规划一章中介绍的策略改进定理:
预演算法会生成一系列拟改进的预演策略 π ′ \pi' π′,并通过 n n n步时序差分(或蒙特卡洛)方法评估它们的 q π ( s , π ′ ( s ) ) q_\pi(s,\pi'(s)) qπ(s,π′(s)),从而选择更优的动作。具体而言,针对当前状态 S t S_t St,预演算法将由随机生成的状态转移生成一系列模拟轨迹,即对 S t S_t St采样一系列候选动作(包括预训练策略 π \pi π会选择的动作),每个候选动作产生相应的状态转移之后将继续遵循 π \pi π模拟 n n n步轨迹,并计算其多次模拟的 n n n步回报平均值作为 Q ^ ( S t , a ) \hat Q(S_t,a) Q^(St,a),最终选择模拟轨迹回报最高的动作 a ∗ a^* a∗。当每个候选动作模拟的次数足够多时, Q ^ ( S t , a ) \hat Q(S_t,a) Q^(St,a)将逼近 q π ( s , a ) q_\pi(s,a) qπ(s,a),这相当于在局部范围(当前状态的有限个动作)内对 π \pi π进行了隐式的策略改进。
由此可见,一个更好的策略改进意味着评估更多的动作以包含最优动作、模拟更多的步数以逼近真实回报、模拟更多的次数以逼近真实价值,也就意味着耗费更多的事件,平衡这些因素在任何预演算法的应用中都是很重要的。不过由于回报的计算是相互独立的,因此可以在多个独立的处理器上并行地进行多次模拟。当模拟效果足够逼近时,预演算法甚至在可以不需要预训练策略及其价值估计,或者说采用随机策略的情况下,只依赖模拟返回的结果也能拥有较好的实时表现。
蒙特卡洛树搜索
为了提升预演算法的效率,我们需要对模拟轨迹的采样生成方法进行设计。蒙特卡洛树搜索(MCTS)通过迭代式树展开,可以高效寻找最优动作。
一个基本版的MCTS的每一次迭代中包括下面四个步骤:
- ①选择(Selection):从根节点出发,根据树策略选择子节点,直到遇到未完全展开(存在未尝试的动作)的节点或叶节点。
- 树策略可以是 ϵ \epsilon ϵ-贪心策略,但一个更常用的选择是基于置信度上界(UCB)的动作选择,在多臂赌博机一章中提到。UCB对动作的潜力进行评估,平衡了试探与开发。这里采用的一种基本策略如下:
- A = ˙ a r g m a x a ( Q i N i + c ln N p N i ) \displaystyle A\dot=\underset a{\mathrm{argmax}}\left(\frac{Q_i}{N_i}+c\sqrt{\frac{\ln N_p}{N_i}}\right) A=˙aargmax(NiQi+cNilnNp)
- 其中 Q i Q_i Qi为节点 i i i的累计回报, N i N_i Ni为节点 i i i的访问次数, N p N_p Np为父节点的访问次数, c c c为探索系数(通常设为 2 \sqrt2 2)。
- ②扩展(Expansion):若当前节点未完全展开,则选择一个新动作 a a a,扩展一个新子节点 s ′ s' s′。
- 新增节点的初始值为 Q i = 0 , N i = 0 Q_i=0,N_i=0 Qi=0,Ni=0。
- ③模拟(Simulation):从新节点 s ′ s' s′出发,使用预演策略模拟至终止状态,记录其回报 G G G。
- ④回溯(Backup):将模拟回报 G G G反向传播到路径上的所有节点,更新其统计量。
- Q i ← Q i + G Q_i\leftarrow Q_i+G Qi←Qi+G
- N i ← N i + 1 N_i\leftarrow N_i+1 Ni←Ni+1
在一定的迭代次数后,MCTS将根据累计回报的平均值返回最优动作。
像这种通过引入启发式函数指导搜索方向,显著减少计算量的优化搜索方法被称为启发式搜索。在MCTS中,启发式函数为UCB,而在优先遍历中,启发式函数为贝尔曼误差。包括异步DP、Dyna-Q+也以启发式搜索为核心思想。决策时规划由于对实时性的高要求,广泛应用了启发式搜索来大幅减少搜索空间,提升计算效率。
相关文章:

【强化学习】#7 基于表格型方法的规划和学习
主要参考学习资料:《强化学习(第2版)》[加]Richard S.Suttion [美]Andrew G.Barto 著 文章源文件:https://github.com/INKEM/Knowledge_Base 本章更是厘清概念厘到头秃,如有表达不恰当之处还请多多指教—— 概述 环境…...

EasyRTC嵌入式音视频通信SDK一对一音视频通信,打造远程办公/医疗/教育等场景解决方案
一、方案概述 数字技术发展促使在线教育、远程医疗等行业对一对一实时音视频通信需求激增。传统方式存在低延迟、高画质及多场景适配不足等问题,而EasyRTC凭借音视频处理、高效信令交互与智能网络适配技术,打造稳定低延迟通信,满足基础通信…...
Linux/aarch64架构下安装Python的Orekit开发环境
1.背景 国产化趋势越来越强,从软件到硬件,从操作系统到CPU,甚至显卡,就产生了在国产ARM CPU和Kylin系统下部署Orekit的需求,且之前的开发是基于Python的,需要做适配。 2.X86架构下安装Python/Orekit开发环…...

网络安全-等级保护(等保) 3-2-1 GB/T 28449-2019 第6章 方案编制活动
################################################################################ GB/T 28449-2019《信息安全技术 网络安全等级保护测评过程指南》是规定了等级测评过程,是纵向的流程,包括:四个基本测评活动:测评准备活动、方案编制活…...
Oracle Enqueue Names
Oracle Enqueue Names Enqueue(排队锁)是Oracle数据库中用于协调多进程并发访问共享资源的锁机制。 This appendix lists Oracle enqueues. Enqueues are shared memory structures (locks) that serialize access to database resources. They can be…...

【免费使用】剪Y专业版 8.1/CapCut 视频编辑处理,素材和滤镜
—————【下 载 地 址】——————— 【本章下载一】:https://pan.xunlei.com/s/VOQxk38EUe3_8Et86ZCH84JsA1?pwdkp7h# 【本章下载二】:https://pan.quark.cn/s/388008091ab4 【本章下载三】:https://drive.uc.cn/s/d5ae5c725637…...
【DCGMI专题1】---DCGMI 在 Ubuntu 22.04 上的深度安装指南与原理分析(含架构图解)
目录 一、DCGMI 概述与应用场景 二、Ubuntu 22.04 系统准备 2.1 系统要求 2.2 环境清理(可选) 三、DCGMI 安装步骤(详细图解) 3.1 安装流程总览 3.2 分步操作指南 3.2.1 系统更新与依赖安装 3.2.2 添加 NVIDIA 官方仓库 3.2.3 安装数据中心驱动与 DCGM 3.2.4 服务…...
道德经总结
道德经 《道德经》是中国古代伟大哲学家老子所著,全书约五千字,共81章,分为“道经”(1–37章)和“德经”(38–81章)两部分。 《道德经》是一部融合哲学、政治、人生智慧于一体的经典著作。它提…...

实现rpc通信机制(待定)
一、概述 (1)rpc(remote procedure call, 远程接口调用),就像在本地调用函数一样,是应用组成服务内部分布式的基础功能。应用场景是在内网中的计算,比如:(a) 为上传的一张图片加水印、…...
MATLAB 2023b 配电柜温度报警系统仿真
MATLAB 2023b 配电柜温度报警系统仿真 下面是一个配电柜温度报警系统的MATLAB仿真代码,包含温度监测、断路器控制和声光报警功能。 classdef ElectricalPanelTemperatureAlertSystem < handleproperties% 系统参数TemperatureThreshold = 94; % 温度阈值(摄氏度)Simulati…...

代码随想录打卡|Day45 图论(孤岛的总面积 、沉没孤岛、水流问题、建造最大岛屿)
图论part03 孤岛的总面积 代码随想录链接 题目链接 视频讲解链接 思路:既然某个网格在边界上的岛屿不是孤岛,那么就把非 孤岛的所有岛屿变成海洋,最后再次统计还剩余的岛屿占据的网格总数即可。 dfs: import java.util.Scanner…...

SpringCloud实战:使用Sentinel构建可靠的微服务熔断机制
上篇文章简单介绍了SpringCloud系列Gateway的基本用法以及Demo搭建,今天继续讲解下SpringCloud Gateway实战指南!在分享之前继续回顾下本次SpringCloud的专题要讲的内容: 本教程demo源码已放入附件内 技术准备 读者须知: 本教程…...

张 Prompt Tuning--中文数据准确率提升:理性与冲动识别新突破
Prompt Tuning–中文数据准确率提升:理性与冲动识别新突破 中文数据,准确率 数据标签三类:冲动21,理性21,(中性设为理性40:说明prompt 修正的有效性) 测试数据:冲动4,理性4,中性设为理性10 为了可视化做了 词嵌入 空间的相似文本计算,但是实际当loss 比较小的时…...
MySQL 中 information_schema.processlist 使用原理
一、概念篇:深入理解 processlist 1.1 什么是 information_schema.processlist information_schema.processlist 是 MySQL 提供的一个非常重要的系统视图,它展示了当前 MySQL 服务器中所有正在运行的线程(连接)信息。这个视图对…...
微信小程序学习基础:从入门到精通
文章目录 第一章:微信小程序概述1.1 什么是微信小程序1.2 小程序与原生APP、H5的区别1.3 小程序的发展历程与现状 第二章:开发环境搭建2.1 注册小程序账号2.2 安装开发者工具2.3 开发者工具界面介绍2.4 第一个小程序项目 第三章:小程序框架与…...
如何使用redis做限流(golang实现小样)
在实际开发中,限流(Rate Limiting)是一种保护服务、避免接口被恶意刷流的常见技术。常用的限流算法有令牌桶、漏桶、固定窗口、滑动窗口等。由于Redis具备高性能和原子性操作,常常被用来实现分布式限流。 下面给出使用Golang结合Redis实现简单限流的几种常见方式(以“固定…...
lanqiaoOJ 4185:费马小定理求逆元
【题目来源】 https://www.lanqiao.cn/problems/4185/learning/ 【题目描述】 给出 n,p,求 。其中, 指存在某个整数 0≤a<p,使得 na mod p1,此时称 a 为 n 的逆元,即 。数据保证 p 是质数且 n mod p≠0…...
深度剖析ZooKeeper
1. ZooKeeper架构总览 ZooKeeper 是一个分布式协调服务,广泛用于分布式系统中的配置管理、命名服务、分布式锁和领导选举等场景。以下是对 ZooKeeper 架构、通信机制、容错处理、数据一致性与可靠性等方面的详细剖析。 一、ZooKeeper 主从集群 ZooKeeper 采用 主从…...

深入解析 MySQL 中的 SHOW_ROUTINE 权限
目录 前言 权限作用 授权方法 MySQL8.0.20以上 MySQL8.0.20以下 总结 前言 SHOW_ROUTINE 是 MySQL 中用于控制用户查看存储过程和函数定义的权限。拥有该权限的用户可以通过 SHOW CREATE PROCEDURE 和 SHOW CREATE FUNCTION 等语句查看存储过程和函数的详细定义ÿ…...

电脑网络如何改ip地址?ip地址改不了怎么回事
在日常使用电脑上网时,我们有时会遇到需要更改IP地址的情况,比如访问某些受限制的网站、解决网络冲突问题,或者出于隐私保护的需求。然而,许多用户在尝试修改IP地址时可能会遇到各种问题,例如IP地址无法更改、修改后无…...

打开小程序提示请求失败(小程序页面空白)
1、小程序代码是商城后台下载的还是自己编译的 (1)要是商城后台下载的,检查设置里面的域名是不是https的 (2)要是自己编译的,检查app.js里面的接口域名是不是https的,填了以后有没有保存 注&a…...
C语言速成12之指针:程序如何在内存迷宫里找宝藏?
程序员Feri一名12年的程序员,做过开发带过团队创过业,擅长Java、鸿蒙、嵌入式、人工智能等开发,专注于程序员成长的那点儿事,希望在成长的路上有你相伴!君志所向,一往无前! 0. 前言:程序如何在内存迷宫里找宝藏? 想象内存是一个巨…...

一张纸决定的高度
从我捧起《格局》这个本书开始,转眼间两个月过去了。 回头望一望,好似还在昨天。 这两个月,心态在变,前进的方向在变,但唯一不变的就是每天晚上睡前,留给自己十分钟的读书时光。 我也从来没想过…...

IP查询基础介绍
IP 查询原理 IP 地址是网络设备唯一标识,IP 查询通过解析 IP 地址获取地理位置、运营商等信息。目前主流的 IPv4(32 位)与 IPv6(128 位)协议,前者理论提供约 43 亿地址,后者地址空间近乎无限。…...

常见的gittee开源项目推荐
https://gitee.com/macrozheng/mall https://doc.ruoyi.vip/ https://eladmin.vip/ https://gitee.com/dromara/RuoYi-Cloud-Plus https://gitee.com/dromara/RuoYi-Vue-Plus https://gitee.com/ZhongBangKeJi/crmeb_java...

日常效率工具【Tools】【持续更新】
日常效率工具【Tools】 VScodevscode原理(居然和Chrome同源)Chromium(Chrome开源版)node.js:让JavaScript可以运行在wab之外的环境 配置文件setting.jesn vscode快捷键万事不求人(Ctrl K,Ctrl S)vscode修改光标所在行的背景色Gene…...
PyTorch中TensorBoardX模块与torch.utils.tensorboard模块的对比分析
文章目录 说明1. 模块起源与开发背景2. 功能特性对比3. 安装与依赖关系4. 性能与使用体验5. 迁移与兼容性策略6. 最佳实践与建议7. 未来展望8. 结论实际相关信息推荐资源 说明 TensorBoard:独立工具,只需安装tensorboard。TensorFlow:非必需…...

数据结构与算法——链式二叉树
链式二叉树 遍历方式与其规则代码的实现递归的复习前,中,后序遍历的实现二叉树结点个数二叉树叶子结点个数二叉树第k层结点个数二叉树的深度/高度二叉树查找值为x的结点二叉树销毁层序遍历 遍历方式与其规则 前序遍历:访问根结点的操作发⽣在…...

Android12 launcher3修改App图标白边问题
Android12 launcher3修改App图标白边问题 1.前言: 今天在Android12 Rom定制客制化系统应用时发现改变系统App图标的形状会出现一个问题,那就是图标被缩小了,没有显示完整,有一个白边,这在普通的App开发很少遇到&…...

【iOS】分类、扩展、关联对象
分类、扩展、关联对象 前言分类扩展扩展和分类的区别关联对象key的几种用法流程 总结 前言 最近的学习中笔者发现自己对于分类、扩展相关知识并不是很熟悉,刚好看源码类的加载过程中发现有类扩展与关联对象详解。本篇我们来探索一下这部分相关知识,首先…...