强化学习Reinforcement Learning|Q-Learning|SARSA|DQN以及改进算法
一、强化学习RL
强化学习是机器学习的一个重要的分支,是一种有效的工具,在文献中被广泛用于解决MDP问题。在一个强化学习过程中,一个智能体只能通过和它所处的环境互动学习最优策略。特别地,智能体首先观察自己当前的状态,然后采取行动,并在获得新状态的同时获得即时的奖励。观察信息,即时的奖励和新的状态被用于去调整智能体的策略,这个过程将不断重复,直到智能体的策略接近最优策略。在强化学习中,Q-Learning是最有效的方法并且被文献中广泛使用。
二、Q-Learning算法(model-free, off-policy)
1、简介
在一个MDP模型中,我们想要获得最优的策略,对于智能体去最大化系统的预期长期奖励函数。因此,我们先定义状态值函数
,表示在每个状态s下遵循策略
所得到的期望值。策略
的值函数V通过无界限和折现MDP量化策略的优良性,可以表示为:
因为我们的目的是找到最优的策略,在每个状态的一个最优的动作可以被找到通过最优的值函数
.
如果我们用表示为所有状态动作对的最优的Q函数,然后最优的值函数可以被写为
.现在,问题被简化为寻找Q函数的最优值,即
.
对于所有的状态-动作对,可以通过迭代(iteration)的过程完成。具体来说,Q值的更新按照以下的规则更新:
2、算法描述
入门强化学习的同学就会知道,Q-Learning算法的state-action可以看成是一个键值对,实际上在这个算法中的Q值是利用表格存储起来的,可以称为Q-Table.对应的横轴和纵轴分别为state和action(实际的横纵究竟是state还是action无所谓,一般地,以横轴为action,纵轴为state).
这个更新背后的核心思想就是找到预测的Q值rt(st,at)+*maxQt(st+1,at+1)和它的当前值Qt(s,a)时间差(简称TD). 也就是这样,每次在使用TD方法计算TD-error也就是预测与目标间的误差时,我们需要在learn函数中传入的参数主要有s, a, s', r即可,在上述公式中的maxQt(s',a')获取Q表格中的对应的横坐标为s'的这一行所有的state-action键值对对应的最大Q值即可;相反,下面要介绍的SARSA算法就需要在learn函数中传入参数s, a, r, s', a',因为Q-learning与SARSA算法在计算Q值的公式也不一样。只需要在(4)中,学习率
用于确定新的信息对现有Q值的影响。学习速率可以选择为常数,也可以在学习过程中动态调整。(这些都可以根据自己实际所设定)但是,为了保证Q-learning算法的收敛性,它必须满足假设1。这里就不做过多的关于学习率也就是每次移动的步长做过多的解释。
一旦所有的Q值收敛或达到一定的迭代次数,那么算法将终止。然后这个算法产生最优的策略指示在每个状态下采取的行动,使得对状态空间中的所有状态都是最大的,即
.在步长假设下(即假设1),文献[19]证明了Q-learning算法收敛到最优动作值的概率为1.
值得注意的是,与状态值函数不同,Q函数是一种无模型(model-free)学习算法的例子,它不需要智能体事先知道系统模型参数,例如状态转移模型和奖励模型,来估计状态-动作值对。具体来说,Q函数的核心思想是通过与环境交互过程中获得的样本来近似状态动作对的值。此外,当值函数根据策略π获取所有动作的期望时,Q函数只关注特定状态下的特定动作。因此,使用q函数的学习算法比使用状态值函数的学习算法更简单。然而,从抽样的角度来看,q函数的维数比状态值函数的维数高,因此q函数可能更难获得足够的样本,即状态-动作对(state-action pairs)来学习。因此,如果系统模型是预先可用的,则通常优选状态值函数.
三、SARSA(State Action Reward State Action)算法
1、简介
SARSA是一种在线的Q-learning算法,尽管Q-learning算法可以在不需要了解环境的情况下为智能体找到最优的策略,但该算法以离线的方式工作(offline)。特别是算法1只有在所有的Q值收敛后才能得到最优策略。因此,本节提出了另一种在线(online)学习算法,即SARSA算法,它允许代理/智能体以在线方式接近最优策略。
与Q-learning算法不同,SARSA算法是一种在线算法,它允许智能体在每个时间步实时选择最优动作,而无需等待算法收敛。在Q-learning算法中,无论应用哪种策略,策略都是根据可用操作的最大奖励来更新的,即off-policy方法。相比之下,SARSA算法与环境交互,并直接从所采取的动作action(即策略上的方法)更新策略。注意SARSA算法从五元组Q(s, a, r, s',a')更新Q值。
2、算法描述
初始化 Q(s,a) 对所有状态s和动作afor episode in episodes:s = 初始化状态while not terminal_state:a = ε-greedy探索(根据当前Q值表)s_prime, r, done = 执行动作aa_prime = ε-greedy探索(针对下一个状态s_prime)new_Q = Q(s,a) + α * (r + γ * Q(s_prime, a_prime) - Q(s,a))update Q(s,a) with new_Qs = s_prime
下面,介绍一个技巧(tip): eligibility trace(资格迹),
资格迹e(s,a)用于跟踪状态-动作对的“资格”,即它们在当前回合中被访问的频率。它为最近的状态-动作对赋予更高的权重,使得这些对在学习过程中更重要。1、这种机制使得我们能够在获得奖励时,快速更新之前的 Q 值,从而加速学习过程。2、通过结合 TD 误差和资格迹,更新 Q 表格的过程变得更加平滑和稳定。资格迹的引入减少了对单一状态-动作对的过度调整,帮助算法在学习过程中保持稳定性。3、资格迹允许算法在学习过程中有效利用历史信息。当智能体在某个状态采取了动作并获得奖励时,资格迹会使得与该状态-动作对相关的 Q 值得到更新,而不仅仅是当前状态-动作对。这使得智能体能够更好地处理延迟奖励的问题。
资格迹的值会随着时间的推移而衰减,允许智能体在学习时考虑过去的状态-动作对。也就是SARSA()算法,
资格轨迹是由Q-Table复制而来的,因此在对其做处理时,主要包括两种方法,第一种方法是
# Method 1:
# self.eligibility_trace.loc[s, a] += 1
#意味着每一次访问该状态动作对s-a时,资格轨迹都会增加。
# Method 2:
self.eligibility_trace.loc[s, :] *= 0
self.eligibility_trace.loc[s, a] = 1
# 在此方法中,以当前状态s为基准的资格迹会被重置为 0,仅在当前状态 s 和动作 a 的位置上设置为 1。这意味着只有当前的状态-动作对在资格迹中被考虑。
最后,更新Q表格并且衰减
# 更新Q-tables
self.q_table += self.lr * error * self.eligibility_trace
# 衰减
self.eligibility_trace *= self.gamma * self.lambda_
四、Deep Q-Learning算法
1、简介
当状态空间和动作空间都很小时,Q-learning算法可以有效地获得最优策略。然而,在实践中,对于复杂的系统模型,这些空间通常很大。因此,Q-learning算法可能无法找到最优策略。因此,引入Deep Q -Learning(DQL)算法来克服这一缺点。直观地说,DQL算法实现了一个Deep Q-Network(DQN),即DNN,而不是Q表来推导出Q∗(s, a)的近似值,如图4(c)所示。
如[21]所述,当使用非线性函数逼近器时,强化学习算法获得的平均奖励可能不稳定甚至发散。这源于这样一个事实,即q值的微小变化可能极大地影响策略(即当Q值发生变化时,agent会选择不同的action,从而改变其行为策略)。因此,数据分布和Q值与目标值R + γ maxa Q(s',a')之间的相关性是变化的(即在训练过程中,数据的分布会随着agent的策略而变化,这种策略的变化会导致收集到的experience/transition在统计特性上有所不同)。为了解决这个问题,可以使用两种机制,即经验重放和目标Q-network.
- 经验回放机制(Experience replay mechanism):该算法首先初始化一个重放内存D,即内存池,其中转换(st, at, rt, st+1),即经验,随机生成,例如通过使用
(贪心)策略。然后,算法随机从D中选择转换的样本(即minibatch小批量)来训练DNN。训练后的DNN获得的q值将用于获得新的经验,即转换,然后这些经验将存储在内存池D中。这种机制允许DNN通过同时使用新旧经验来更有效地训练。此外,通过使用经验重放,转换更加独立和均匀分布,从而可以消除观测值之间的相关性。
简而言之,就是说有一个回放缓存的地方,将每次与环境交互所生成的transition(st, at, rt, st+1)都保存在缓存中,随后每一次都采用小批量样本数据训练智能体,这样用于训练的数据可能包含之前的也可能包含新生成的数据,不但会使得训练更高效,还会增加数据的多样性,进一步会导致降低训练过程中的过拟合问题。
- 固定目标Q网络(Fixed target Q-network):在训练过程中,q值会发生偏移。因此,如果使用一组不断变化的值来更新Q-network,则值估计可能会失控。这导致了算法的不稳定性。为了解决这个问题,使用目标Q-network来频繁但缓慢地更新主Q-networks的值(也就是网络的参数在每隔一定步数后才能成为著网络的参数)。这样可以显著降低目标和估计q值之间的相关性,从而稳定算法。
简而言之,就是会采用两个Q网络,原本的网络成为Q-network,用于估计Q值;又新增加了一个Q网络,称为Q-target网络,Q-target并不会自己更新,而是采用超参数N,每走N轮之后,就会将Q-network的网络参数复制给Q-target,这样也就是一小段轮次的样本会对应同一个训练目标。
举一个简单的例子,把训练神经网络比喻为射击游戏,如果Q-target每次都移动的话,那就相当于打移动靶子,每射击一次靶子就会移动一次,相比于打固定的靶子,无疑增加了训练的难度。相反,增加了Q-target之后,就相当于每隔一定时间靶子动一次,在这段时间范围内射击靶子都不会动,这样无疑会提高射击的稳定性。
2、算法描述
上述即为使用TD编写的DQN算法伪代码,在最基本的DQL算法中加入了经验回放缓存以及固定目标网络的机制,极大的提高了算法的性能,这里要注意,在实际写代码时,一定要注意好把估计Q值的网络参数复制给目标网络,若未加,对于网络的稳定性确实有很大的影响。(亲身经历)
3、改进部分
首先,我要阐述一点,就是说,我们学习改进部分要知道为什么要改进,以及改进后相比原来有什么特点(优点和缺点)。
1、Double Deep Q-Learning(双深度Q-learning)
第一种方法
在一些随机环境中,由于对动作值的过高估计,Q-learning算法表现不佳。这些高估是由引入的正偏差造成的,因为Q-learning使用最大动作值作为最大预期动作值的近似值,如Eq.(4)所示。主要的原因就是相同的样本被用来决定哪个动作是最好的,即期望回报最高,并且同样的样本又被用于估计状态-动作值(state-action value)。因此为了克服Q-learning算法的过估计问题,作者引入了一个方法,使用两个Q值函数Q1和Q2,去同时选择并且估计状态动作值。
特别是,动作的选择仍然取决于在线权重(online),这意味着就像Q-learning学习一样,我们仍然根据当前的值估计贪心策略的值,即
。然而第二组权重
用于公平的评估该策略的价值。第二组权重可以通过交换
和
的角色来对称的更新。受此思想的启发,[25]中的作者随后使用双深度Q-Network (DDQN)开发了双深度Q-Learning (DDQL)模型[26],其损失函数更新如下:
与Double Q-learning不同的是,将第二个网络的权值θ2替换为目标网络的权值θ'来评估当前贪心策略,如Eq.(8)所示。从DQN开始,对目标网络的更新保持不变,并且保持在线网络的周期性副本。由于DDQL的有效性,最近引入了DDQL的一些应用,以解决多通道无线网络中的动态频谱接入问题[27]和异构网络中的资源分配问题[28]。
综上,简单总结一下本方法的思路,其实就是又增加了一个网络称为Target Network,原本的Q-network用于寻找最大Q值对应的贪心策略的动作action,然后再使用Target Network估计这一时刻t下的st,at所对应的正确的Q值,这样的话,即使原本Q值被估计了,也不一定会在Target Network中有最大的Q值,可以有效地避免Q值过估计的情况,目标Q值的公式如下:
.
第二种方法
首先,也是采用两个Q-network,起到互相监督的作用,但这是两个异构的网络,由于它们之间的网络参数有所不同,那么对于同一个动作的评估也会有做不同。我们选取评估出来的较小值来计算目标,这样就能避免一个网络出现的Q值过高的情况发生了,公式如下,
.
2、Deep Q-Learning With Prioritized Experience Replay (优先级经验回放)
经验重放机制允许强化学习的智能体记住和重用经验,即从过去的转换(transition)。特别是,从重放存储器D中均匀地采样转换(transition)。然而,这种方法只是以与代理最初经历的相同频率重播转换,而不管它们的重要性如何。
因此,[29]的作者开发了一个优先考虑经验的框架,以便更频繁地重播重要的转换,从而更有效地学习。理想情况下,我们希望更频繁地对那些可以从中学习到很多东西的转换进行采样(Sample)。一般来说,具有优先经验重放(Prioritized Experience Replay,PER)的DQL以与最后遇到的绝对误差(absolute error)相关的概率对转换进行采样[29]。新的转换以最高优先级插入重放缓冲区,提供对最近转换的偏好。请注意,随机过渡也可能受到青睐,即使对它们知之甚少。通过对许多Atari游戏的实际实验,作者证明了在49个游戏中有41个游戏中,使用PER的DQL优于使用统一重播的DQL。然而,只有当我们能够在重放内存D中找到并定义重要经验(experience)时,才适合执行此解决方案。
3、 Dueling Deep Q-Learning(决斗深度Q-learning)
Q-learning算法(即算法1)中使用的Q值,即Q(s, a),表示在给定状态下采取某种行动的效果。一个动作在给定状态下的值实际上可以分解为两个基本值。第一个值是状态值函数,即V (s),用于估计处于特定状态s的重要性。第二个值是动作值函数,即A(a),用于估计选择一个动作a与其他动作相比的重要性。因此,Q值函数可以用两个基本值函数表示为:Q(s, a) = V (s) + A(a).
由于在许多的MDPs中,没有必要同时估计两个值,即Q函数Q(s,a)的动作值和状态值。例如,在许多赛车游戏中当且仅当智能体遇到障碍或敌人时,向左向右移动才有意义。受此思想的启发,作者在[30]中引入了使用两个完全连通层的流,即两个序列,而不是使用具有完全连通层的单个序列来实现DQN的思想。这两个流的构造使得它们能够对动作和状态值函数的单独估计,即V(s)和A(a)。最后,这两个流被组合以生成单个输出Q(s,a),如下所示:
其中,和
分别为V(s;
)和A(s,a';
)的参数。这里,|A|代表的是动作空间的大小,即动作空间中包含的动作总数。然后以类似于(7)的方式推导损失函数。通过仿真,作者表明,所提出的决斗DQN在57个学习到的Atari游戏中,有50个的性能优于DDQN[26]。然而,[30]的仿真结果表明提出的决斗架构显然只对具有大动作空间(large action spaces)的MDPs有利。对于较小的状态空间,决斗DQL的性能甚至不如双DQL。
4、 Asynchronous Multi-Step Deep Q-Learning(异步多步深度Q-Learning)
大多数Q-learning方法(如DQL和决斗DQL)都依赖于经验回放方法。然而,这种方法有几个缺点。例如,每个实际的交互(interaction)会使用更多的内存(memory)和计算资源(computation resources),并且还需要离线策略学习算法,根据旧的策略生成的数据更新。 这限制了DQL的应用。因此,作者在[31]中引入了一种使用多个智能体并行训练DNN的方法。特别地,作者提出了一种同时利用多个智能体的异步梯度体面更新的训练过程。与训练与环境交互的单个智能体不同,多个智能体同时与各自版本的环境env交互。经过一定的时间步长timestep后,来自智能体agent的累积梯度更新应用于全局模型,即DNN。这些更新是异步的,没有锁。此外,为了权衡策略梯度中的偏差和方差,作者采用n步更新方法[1]来更新奖励函数。特别地,截断的n步奖励函数可以定义为。因此,每个智能体agent的替代损失将由以下公式得出:
针对1步Q-learning、1步SARSA、n步Q-learning等不同的强化学习方法,分析了所提出的异步多步学习DQL对训练速度和质量的影响。它们表明异步更新对策略和值更新具有稳定作用。此外,所提出的方法在雅达利游戏上的性能优于当前最先进的算法,而在单个多核CPU而不是GPU上训练的时间只有一半。因此,异步DQL的一些最新应用已经开发出来,用于解决无线系统中的切换控制问题[32]。
5、 Distributional Deep Q-Learning(分布式深度Q-Learning)
上述所有方法都使用Bellman方程来近似未来奖励的期望值。然而,如果环境本质上是随机的,并且未来的奖励遵循多模态分布,那么基于期望值选择行动可能不会导致最优结果。例如,我们知道一个数据包在无线网络中的预期传输时间是20分钟。然而,这个信息可能没有那么有意义,因为它可能在大多数时候高估了传输时间。例如,期望传输时间是根据正常传输(无碰撞)和干扰传输(有碰撞)计算的。虽然干扰传输很少发生,但是需要花费大量的时间。因此,在大多数情况下,对期望传输的估计被高估了。这使得估计对DQL算法没有用处。
因此,[33]中的作者引入了一种使用分布强化学习的解决方案,根据q值函数的分布而不是期望来更新q值函数。其中,设Z(s, a)为从状态s出发,执行动作a,遵循当前策略得到的返回,则Q(s, a) = E[Z(s, a)]。这里,Z代表未来奖励的分布,不再像q值那样是一个标量。得到Bellman方程的分布形式:Z(s, a) = r + γZ(s', a')。尽管所提出的分布式深度q学习被证明在许多雅达利2600游戏(57款游戏中的45款)上,它的性能优于传统的DQL[21],它的性能很大程度上依赖于分布函数Z。如果Z定义良好,那么分布式深度q学习的性能比DQL的性能要重要得多。否则,它的性能甚至比DQL还差。
6、 Deep Q-Learning With Noisy Nets(基于噪声网络的深度Q-learning)
在[34]中,作者介绍了Noisy Net,这是一种神经网络,其偏差和权重在训练过程中通过噪声的参数函数进行迭代扰动。这个网络基本上是将高斯噪声添加到网络的最后一层(全连接的,fully-connected)。该噪声的参数可以在训练过程中由模型调整,这允许智能体决定何时以及以何种比例将不确定性引入其权重。特别地,为了实现有噪声网络,我们首先用随机化的动作值函数代替γ-贪心策略。然后,将值网络的全连通层参数化为一个噪声网络,其中参数取自每重放一步后的噪声网络参数分布。对于重放,当前有噪声的网络参数样本在批处理中保持固定。由于DQL对每个动作步骤都进行一步优化,因此在每个动作之前都会对噪声网络参数进行重新采样。
通过实验结果,作者证明,通过在DNN中加入高斯噪声层,传统DQL[21]、dueling DQL[30]和异步DQL[31]的性能可以显著提高,适用于广泛的Atari游戏。然而,噪声对深度DQL算法性能的影响在文献中仍存在争议,因此分析噪声层的影响需要进一步研究。
7、Rainbow Deep Q-Learning(彩虹深度Q-learning)
在[35]中,作者提出了一种解决方案,将上述七种解决方案(包括DQL)的所有优点集成到一个学习代理中,称为Rainbow DQL。特别是,该算法首先定义了基于异步多步分布式DQL的损失函数。然后,作者将多步分布损失与双q学习结合起来,利用根据q网络选择的st+n中的贪心行为作为自举行为a * t+n,并利用目标网络对其进行评估。
在标准的比例优先重放[29]技术中,使用绝对td误差来确定转换的优先级。这里,时隙的td误差是在该时隙估计的误差。然而,在提出的Rainbow DQL算法中,所有分布式Rainbow变体都通过Kullbeck-Leibler (KL)损失对转换进行优先级排序,因为这种损失可能对有噪声的随机环境更具鲁棒性。或者,dnn的决斗架构在[30]中提出。最后,为了减少独立噪声变量的数量,使用noisenet层[35]替换所有线性层。通过仿真,作者证明了这是最先进的技术,在57个Atari 2600游戏中,它比文献中几乎所有当前的DQL算法都要好。
相关文章:

强化学习Reinforcement Learning|Q-Learning|SARSA|DQN以及改进算法
一、强化学习RL 强化学习是机器学习的一个重要的分支,是一种有效的工具,在文献中被广泛用于解决MDP问题。在一个强化学习过程中,一个智能体只能通过和它所处的环境互动学习最优策略。特别地,智能体首先观察自己当前的状态…...

【HarmonyOS NEXT开发】如何设置水平/垂直方向的左/居中/右对齐——RelativeContainer的AlignRules设置
文章目录 【HarmonyOS NEXT开发】如何设置水平/垂直方向的左/居中/右对齐——RelativeContainer的AlignRules设置RelativeContainer 和 AlignRules 的关系AlignRules 语法详解 【HarmonyOS NEXT开发】如何设置水平/垂直方向的左/居中/右对齐——RelativeContainer的AlignRules设…...

java之认识异常
在 Java 中,异常(Exception)用于处理程序运行时出现的错误或异常情况。Java 的异常处理机制基于 try, catch, finally 和 throw 关键字。 1.异常的分类: 1.1:检查型异常(CheckedException): 定义:程序在…...
JSON处理工具类
JSON处理工具类 import org.json.JSONArray; import org.json.JSONObject;import java.util.ArrayList; import java.util.List;/*** JSON处理工具类*/ public class JsonUtils {/****将json字符串转为map* param json* return java.util.Map<java.lang.String, java.lang.O…...

2022高教社杯全国大学生数学建模竞赛C题 问题一(2) Python代码演示
目录 1.2 结合玻璃的类型,分析文物样品表面有无风化化学成分含量的统计规律数据预处理绘图热力图相关系数图百分比条形图箱线图小提琴图直方图KED图描述性统计分析偏度系数峰度系数其它统计量1.2 结合玻璃的类型,分析文物样品表面有无风化化学成分含量的统计规律 数据预处理 …...
ARACom Proxy Class API 概念
1. Proxy Class 概述 生成方式:Proxy Class 是从 AutoSar 元模型的服务接口描述中生成的,ara::com 标准化了其接口,AP 产品供应商的工具链会生成实现该接口的代理实现类。 命名空间:ara::com 期望代理相关的工件在命名空间 “pro…...

【Scala入门学习】基本数据类型和变量声明
1. 基本数据类型 scala 的基本类型有 9种: Byte、Char、Short、Int、Long、Float、Double、Boolean、Unit Scala中没有基本数据类型的概念,所有的类型都是对象。 AnyVal:代表所有基本类型。 AnyRef:代表所以引用类型ÿ…...
C#基础(13)结构体
前言 随着函数的讲解完成,我想你已经初步有了写一些复杂逻辑功能的能力,但是我们会发现其实在我们大部分实际开发情况中,很多我们需要写的变量可能不只有一个属性。 他可能有很多变量,那这时候我们如果要把这些变量集中到一个东…...

Excel图片批量插入单元格排版处理插件【图片大师】
为了方便大家在图片的插入排版的重复工作中解放出来,最近发布了一款批量插入图片的插件,欢迎大家下载,免费试用。 这是图片的文件夹: 主要功能如下: 1,匹配单元格名称的多张图批量插入到一个单元格 该功能支持设置图…...

应用性能优化实践(二)提升应用启动和响应速度
一、提升应用启动和响应速度的方法 1、冷启动过程简介 应用启动时,后台无该应用的进程,需要创建新的进程,这种启动方式叫冷启动。 2、使用异步加载 使用异步加载可以在后台线程中处理耗时操作,从而提升应用响应速度。 3、延迟加载…...
接口测试系列文章专题
在你眼中什么是接口 HTTP协议 什么是接口测试 接口测试之工具 fiddler工具的原理 fiddler工具界面详解 fiddler工具的基本使用 fiddler使如何对手机app进行抓包的呢 fiddler手机app抓包教程 Charles自定义接口返回的数据内容 常用接口工具postman的基本使用方式 pos…...

Unity Hub自动安装指定版本Unity的Android开发环境
Unity开发Android环境要求SDK、DNK、JDK、Gradle版本都要对才能发布APK,自己去配置很容易出错。Unity Hub可以自动安装指定版本Unity的Android开发环境。 1.安装国内用的UnityHub(我这里用的3.3.2-c6) 2.找到对应的Unity版本 3.点击【从Unit…...

从0开始学ARM
1. ARM模式和寄存器 1.1 ARM处理器工作模式 Cortex系列之前的ARM处理器工作模式一共有7种。 1.1.1 工作模式 Cortex系列的ARM处理器工作模式有8种,多了1个monitor模式,如下图所示: ARM之所以设计出这么多种模式出来,就是为了…...
每日一题——第九十四题
// SortNumInFile.cpp : 此文件包含 “main” 函数。程序执行将在此处开始并结束。 // 题目:将一个文本文件number.txt中的数字按照从小到大排列后,重新写入到该文件中,要求排序前和排序后都输出该文件的内容。该文件中共有20个整数…...

Linux 开发工具(vim、gcc/g++、make/Makefile)+【小程序:进度条】-- 详解
目录 一、Linux软件包管理器 - yum(ubuntu用apt代替yum)1、Linux下安装软件的方式2、认识 yum3、查找软件包4、安装软件5、如何实现本地机器和云服务器之间的文件互传 二、Linux编辑器 - vim1、vim 的基本概念2、vim 下各模式的切换3、vim 命令模式各命令…...

后续学习规划 ----含我个人的学习路线,经历及感受
目前的基础 开发相关(最重要) 1.Java SE 从入门到起飞 2.Java Web开发 3.苍穹外卖 以上三个是和开发相关的基础。 我是按照书写的顺序学习的,有需要的朋友可以参考。 计算机相关 其他的话,都是比较久远的了。隔得时间一年半…...

Skytower
一、安装配置靶机 下载地址: SkyTower: 1 ~ VulnHub 下载之后解压发现是VirtualBox格式的 我们下载一个VirtualBox,这是官网 Downloads – Oracle VirtualBox 安装到默认路径就 打开后点击注册 选择解压后的vbox文件 然后点击左上角管理 点击导出虚拟电脑&…...

成型的程序
加一个提示信息 加上python 常用的包 整个程序打包完 250M 安装 960MB matplot numpy pandas scapy pysearial 常用的包 (pyvisa)… … 啥都有 Python 解释器组件构建 要比 lua 容易的多 (C/Rust 的组件库)...

卡尔曼滤波中Q和R与噪声的关系
卡尔曼滤波 一种用于估计系统状态的递归滤波器,通过融合传感器测量和系统模型,提供系统状态的最优估计。 Q和R是什么 在卡尔曼滤波中,Q和R分别表示过程噪声和测量噪声的协方差矩阵。 Q Q Q矩阵(过程噪声协方差矩阵)…...

sicp每日一题[2.10]
Exercise 2.10 Ben Bitdiddle, an expert systems programmer, looks over Alyssa’s shoulder and comments that it is not clear what it means to divide by an interval that spans zero. Modify Alyssa’s code to check for this condition and to signal an error if i…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...

九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...