当前位置: 首页 > news >正文

二、智能体强化学习——深度强化学习核心算法

2.1 DQN 系列及其改进

2.1.1 背景与动机

在经典强化学习中(如 Q-Learning),如果状态空间动作空间非常大乃至连续,那么用一个表格来存储 Q ( s , a ) Q(s,a) Q(s,a) 不再可行。为了解决该问题,可以使用神经网络来逼近 Q Q Q 函数,这就是 深度 Q 网络(Deep Q-Network,DQN) 的核心思想。

  • 论文起源:DQN 由 DeepMind 团队提出(Mnih et al., 2013 & 2015),利用卷积神经网络来从原始像素(如 Atari 游戏画面)中学习特征,并输出各动作的 Q 值,大幅度提升了在 Atari 游戏上的表现。
  • 核心要点
    • 用一个神经网络 Q ( s , a ; θ ) Q(s,a;\theta) Q(s,a;θ) 近似 Q 值;
    • 通过最小化时序差分 (TD) 误差来更新 θ \theta θ

Q 函数的神经网络逼近

对于离散动作环境,网络的输出层通常有 ∣ A ∣ |\mathcal{A}| A 个神经元,每个输出对应一个动作的 Q 值 Q ( s , a ) Q(s,a) Q(s,a)。输入为状态 s s s(可能是图像或其他向量),通过多层感知机 (MLP) 或卷积神经网络 (CNN) 获取特征后输出 Q 值。


2.1.2 DQN 原理与伪代码

(1) 关键改进:Experience Replay 与 Target Network

  1. Experience Replay(经验回放)

    • 将 Agent 与环境交互得到的经验 ( s , a , r , s ′ ) (s, a, r, s') (s,a,r,s) 存储在一个 Replay Buffer 中;
    • 每次训练时,从该 Buffer 中随机采样一个批量(mini-batch)数据进行梯度更新;
    • 好处
      • 让样本分布更加独立同分布 (i.i.d.),打破连续时间步样本的相关性;
      • 提高数据效率,能够反复使用历史数据进行训练。
  2. Target Network(目标网络)

    • DQN 中存在“自举 (bootstrapping)”:在更新 Q 值时,需要用到下一时刻的 Q 值;
    • 如果使用同一个网络同时执行动作选择和目标计算,可能导致训练不稳定;
    • 解决方案:维持一个“目标网络” Q ^ ( s , a ; θ − ) \hat{Q}(s,a;\theta^-) Q^(s,a;θ),周期性(或软更新)将在线网络的参数 θ \theta θ 复制到 θ − \theta^- θ
    • 当计算 TD 目标时,用的是目标网络的 Q 值,不随在线网络每次更新而变化过快。

(2) DQN 的核心更新公式

对于某条经验 ( s , a , r , s ′ ) (s, a, r, s') (s,a,r,s),DQN 的 TD 目标 (Target) 为
y = r + γ max ⁡ a ′ Q ^ ( s ′ , a ′ ; θ − ) \LARGE y = r + \gamma \max_{a'} \hat{Q}(s', a'; \theta^-) y=r+γamaxQ^(s,a;θ)
其中 Q ^ \hat{Q} Q^ 是目标网络。DQN 的损失函数为
L ( θ ) = E ( s , a , r , s ′ ) ∼ D [ ( y − Q ( s , a ; θ ) ) 2 ] \LARGE L(\theta) = \mathbb{E}_{(s,a,r,s')\sim \mathcal{D}} \Big[ \big( y - Q(s,a;\theta) \big)^2 \Big] L(θ)=E(s,a,r,s)D[(yQ(s,a;θ))2]
通过反向传播对 θ \theta θ 做梯度下降,最小化此均方误差。

(3) DQN 伪代码示例

以下是一段简化的伪代码流程:

Initialize Q network with random weights θ
Initialize target network with the same weights θ^- ← θ
Initialize replay buffer Dfor episode in 1 to max_episodes:s = env.reset()done = Falsewhile not done:# 1. epsilon-greedy 策略if random() < epsilon:a = random actionelse:a = argmax(Q(s, ·; θ))# 2. 与环境交互s_next, r, done, info = env.step(a)# 3. 存储经验D.append((s, a, r, s_next, done))# 4. 训练if len(D) > batch_size:# 4.1 从 D 中随机采样batch = sample(D, batch_size)(s_batch, a_batch, r_batch, s_next_batch, done_batch) = transform(batch)# 4.2 计算目标 yy = r_batch + γ * max(Q(s_next_batch, a'; θ^-), axis=1) * (1 - done_batch)# 4.3 计算当前 Q(s,a;θ),并最小化均方误差loss = MSE(Q(s_batch, a_batch; θ), y)do gradient descent on θ# 5. 每隔 C 步更新目标网络if step % C == 0:θ^- ← θ# 状态前移s = s_next# 6. 衰减 epsilonepsilon = max(epsilon_min, epsilon * epsilon_decay)

2.1.3 DQN 的改进算法

  1. Double DQN

    • 在计算 max ⁡ a ′ Q ( s ′ , a ′ ) \max_{a'} Q(s',a') maxaQ(s,a) 时会产生过估计问题;
    • Double Q-Learning 思想:将动作选择动作评估分别在两个网络中完成:
      a ∗ = arg ⁡ max ⁡ a ′ Q ( s ′ , a ′ ; θ ) , y = r + γ Q ^ ( s ′ , a ∗ ; θ − ) \LARGE \begin{array}{l} a^* = \arg\max_{a'}Q(s',a';\theta), \\ y = r + \gamma \hat{Q}\big(s', a^*; \theta^-\big) \end{array} a=argmaxaQ(s,a;θ),y=r+γQ^(s,a;θ)
    • 这样能够有效减小 Q 值的过估计偏差。
  2. Dueling DQN

    • 将网络拆分为状态价值函数 V ( s ) V(s) V(s)优势函数 A ( s , a ) A(s,a) A(s,a) 两个分支:
      Q ( s , a ) = V ( s ) + A ( s , a ) − 1 ∣ A ∣ ∑ a ′ A ( s , a ′ ) \LARGE Q(s,a) = V(s) + A(s,a) - \frac{1}{|\mathcal{A}|}\sum_{a'}A(s,a') Q(s,a)=V(s)+A(s,a)A1aA(s,a)
    • 能让网络更好地学习状态本身的价值,在某些情况下提升训练效率。
  3. 优先级回放(Prioritized Replay)

    • 经验回放中,TD 误差较大的样本往往更有学习价值;
    • 给每条经验分配一个“优先级” p i = ∣ δ i ∣ + ϵ p_i = | \delta_i | + \epsilon pi=δi+ϵ δ i \delta_i δi 为 TD 误差);
    • 采样时,根据 p i p_i pi 的大小进行加权随机采样,让高 TD 误差样本被更多关注;
    • 注意需对更新进行重要性采样修正 (IS weights),以保证无偏性。
  4. Rainbow DQN

    • Double DQNDueling DQN优先级回放NoisyNetCategorical DQN 等多种改进技术结合在一起,进一步增强效果。

2.2 Policy Gradient 系列

在 Q-Learning 类方法中,我们先估计 Q 值,然后通过贪心或近贪心选择动作;而策略梯度方法则直接对策略函数 π θ ( a ∣ s ) \pi_\theta(a|s) πθ(as) 参数化并通过梯度上升来最大化期望回报。这类方法对连续动作空间尤其有效。

2.2.1 基本策略梯度(REINFORCE)

(1) 思想概述

  • 策略 π θ ( a ∣ s ) \pi_\theta(a|s) πθ(as) 是一个可微分的函数(如神经网络),输出在状态 s s s 时选择动作 a a a 的概率;
  • 目标:最大化期望回报
    J ( θ ) = E τ ∼ π θ [ ∑ t = 0 T r t ] \LARGE J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta} \left[ \sum_{t=0}^{T} r_t \right] J(θ)=Eτπθ t=0Trt
    其中 τ \tau τ 表示整个轨迹 e p i s o d e episode episode
  • 核心:利用梯度上升 θ ← θ + α ∇ θ J ( θ ) \theta \leftarrow \theta + \alpha \nabla_\theta J(\theta) θθ+αθJ(θ)

(2) REINFORCE 算法公式

对策略梯度的一个常见推导是:
∇ θ J ( θ ) = E τ ∼ π θ [ ∑ t = 0 T ∇ θ log ⁡ π θ ( a t ∣ s t ) ⋅ G t ] \LARGE \nabla_\theta J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta} \left[ \sum_{t=0}^{T} \nabla_\theta \log \pi_\theta(a_t|s_t) \cdot G_t \right] θJ(θ)=Eτπθ t=0Tθlogπθ(atst)Gt
其中 G t G_t Gt 是从时刻 t t t 开始的折扣回报(Return)。在实现中,常见做法是采样多个完整的episode,计算每个时间步的 log ⁡ π θ ( a t ∣ s t ) \log \pi_\theta(a_t|s_t) logπθ(atst) 累积,再加权更新。

(3) REINFORCE 的特点

  • 优点:实现简单;可以处理连续或离散动作空间;适用于高维输出;
  • 缺点:方差大,收敛速度慢;需要对整条轨迹进行采样。

2.2.2 Actor-Critic 框架

为了降低纯策略梯度方法的高方差,在更新策略时引入价值函数的基线(Baseline)。这就带来了Actor-Critic框架。

  1. Actor:表示策略网络 π θ ( a ∣ s ) \pi_\theta(a|s) πθ(as),输出动作概率(或连续动作的均值、方差等);
  2. Critic:表示价值网络 V ω ( s ) V^\omega(s) Vω(s) Q ω ( s , a ) Q^\omega(s,a) Qω(s,a),用来评价当前策略的好坏。

(1) 基本思想

  • 策略梯度中,如果我们用 G t − b t G_t - b_t Gtbt 来取代 G t G_t Gt,只要 b t b_t bt 与动作无关,就不改变无偏性,可降低方差;
  • 常见做法: b t b_t bt 用价值函数 V ω ( s t ) V^\omega(s_t) Vω(st) 近似;
  • 这样,Critic 网络去学习一个状态价值函数或动作价值函数;Actor 在更新时参考 Critic 给出的基线或优势函数,减小更新的方差。

(2) A2C / A3C

  • A2C(Advantage Actor-Critic):使用“优势函数” A ( s t , a t ) = Q ( s t , a t ) − V ( s t ) A(s_t,a_t) = Q(s_t,a_t) - V(s_t) A(st,at)=Q(st,at)V(st) 来衡量某个动作相对平均水平的好坏;
  • A3C(Asynchronous Advantage Actor-Critic):多线程/多进程异步采样,每个线程都有自己的 Actor 和 Critic,与环境交互并计算梯度,再将梯度同步到全局参数中;
  • 优点:并行采样,效率更高;在当年的硬件条件下显著加速了训练。

(3) Actor-Critic 伪代码示例(单线程简化)

Initialize Actor πθ, Critic Vω
for episode in 1 to max_episodes:s = env.reset()done = Falsewhile not done:# 1. 从策略网络中采样动作a = sample from πθ(a|s)s_next, r, done, info = env.step(a)# 2. Critic 计算 TD 误差 δV_s =(s)V_s_next =(s_next) if not done else 0δ = r + γ * V_s_next - V_s# 3. 更新 CriticL_critic = δ^2ω ← ω - α_critic ∇ω L_critic# 4. 更新 ActorL_actor = - δ * log πθ(a|s)   # 这是一种简化形式θ ← θ - α_actor ∇θ L_actors = s_next

2.3 高级算法

对于更复杂的场景,如连续动作高维动作的控制,我们需要更先进的算法来保证训练的稳定性和效率。下面介绍几种主流算法:DDPG、TD3、PPO、SAC。

2.3.1 DDPG(Deep Deterministic Policy Gradient)

(1) 适用场景与思路

  • 场景:连续动作空间(如机器人关节控制)。
  • 核心思想:结合 Actor-Critic 思路,Actor 输出确定性动作(而非动作分布),Critic 学习 Q ω ( s , a ) Q^\omega(s,a) Qω(s,a)
  • 学习目标:最小化 Critic 给出的负 Q 值,让 Actor 朝着“使 Q 值更高的方向”更新。

(2) 算法要点

  1. Actor 网络 μ θ ( s ) \mu_\theta(s) μθ(s) ,输入状态输出一个确定性动作;
  2. Critic 网络 Q ω ( s , a ) Q^\omega(s,a) Qω(s,a),输入状态-动作,输出对应 Q 值;
  3. Replay Buffer + Target Network(类似 DQN)减少不稳定性;
  4. 更新
    • Critic 更新:最小化 TD 误差
      L ( ω ) = ( r + γ Q ω ( s ′ , μ θ ( s ′ ) ) − Q ω ( s , a ) ) 2 \LARGE L(\omega) = \big(r + \gamma Q^\omega(s', \mu_\theta(s')) - Q^\omega(s,a)\big)^2 L(ω)=(r+γQω(s,μθ(s))Qω(s,a))2
    • Actor 更新:基于策略梯度
      ∇ θ J ≈ E [ ∇ a Q ω ( s , a ) ∣ a = μ θ ( s ) ∇ θ μ θ ( s ) ] \LARGE \nabla_\theta J \approx \mathbb{E}\left[\nabla_a Q^\omega(s,a)\big|_{a=\mu_\theta(s)} \nabla_\theta \mu_\theta(s)\right] θJE[aQω(s,a) a=μθ(s)θμθ(s)]
    • 同步目标网络的做法与 DQN 类似。

(3) 优势与局限

  • 优势:适合连续动作;在一些机器人控制场景有良好表现;
  • 局限:训练不稳定;对超参数和初始化较敏感;容易陷入局部最优或碰到多步预测误差累积。

2.3.2 TD3(Twin Delayed DDPG)

  • 目的:解决 DDPG 中 Critic 的过估计问题训练不稳定
  • 双 Critic:类似 Double DQN 的思想,两个独立的 Critic 网络取最小 Q 值作为目标,降低过估计;
  • 延迟更新:Actor 网络的参数更新频率低于 Critic,先让 Critic 更充分地学习;
  • 目标平滑:在下一个状态动作上加噪声,以减少因函数不平滑引起的过高估计;
  • 综合这些改进,使 TD3 在连续控制任务上比 DDPG 更鲁棒。

2.3.3 PPO(Proximal Policy Optimization)

(1) 算法动机

  • 场景:On-policy 策略梯度算法,兼具易实现、稳定和高效的特性;
  • 问题:直接进行策略梯度更新,步长较大时会毁掉之前学到的策略,引发不稳定。
  • 解决:PPO 在更新时约束新旧策略的差异,不使策略迭代步太大。

(2) 算法核心

  • 使用**剪切(clipping)**的目标函数,限制更新幅度;
  • 定义概率比
    r t ( θ ) = π θ ( a t ∣ s t ) π θ old ( a t ∣ s t ) \LARGE r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_\text{old}}(a_t|s_t)} rt(θ)=πθold(atst)πθ(atst)
    然后在优化时将其裁剪在一定范围内(如 [1- ϵ \epsilon ϵ, 1+ ϵ \epsilon ϵ]);
  • 这样可以兼顾
    • 收益提升(策略改进)
    • 稳定性(不让新旧策略差别过大)

(3) 实践效果

  • PPO 是当前深度强化学习中最常用的 on-policy 算法之一;
  • 实现和调参相对友好,在 MuJoCo 或许多学术竞赛任务中表现出色。

2.3.4 SAC(Soft Actor-Critic)

(1) 核心理念:熵正则化

  • SAC 是一种 off-policy 的 Actor-Critic 算法;
  • 目标不仅是最大化回报,还要最大化策略的熵(entropy),鼓励策略尽量保持随机,以提升探索能力、提高鲁棒性;
  • 通过在目标中加入熵项 α H ( π ( ⋅ ∣ s ) ) \alpha \mathcal{H}(\pi(\cdot|s)) αH(π(s)),来平衡“高回报”与“高熵”之间的关系。

(2) 算法结构

  1. Actor:输出动作分布参数(高斯分布的均值、方差);
  2. Critic:有两个 Q 网络(双 Critic),取较小值来抑制过估计;
  3. 温度系数 α \alpha α:控制熵奖励权重,可以固定或自适应调参;
  4. off-policy:从 Replay Buffer 采样。

(3) 优势

  • 稳定收敛:利用双 Critic + 目标平滑 + 熵正则;
  • 高探索:让策略在训练前期保持足够随机,减少早期陷入局部最优;
  • 在许多连续控制任务中性能优异,且收敛更稳定。

总结与对比

算法特点适用场景优缺点
DQN离散动作;用 NN 逼近 Q 值;Experience Replay & Target NetworkAtari、离散控制易实现;对离散动作较好;对连续动作需改进;存在过估计等问题
Double DQNDQN 改进,解决过估计与 DQN 相同减小过估计,训练更稳定
Dueling DQN拆分状态价值和优势函数与 DQN 相同对无关动作时能更好提取状态价值
Prioritized Replay根据 TD 误差进行优先级采样与 DQN 相同数据利用率高,但需重要性采样修正
Policy Gradient (REINFORCE)直接对策略参数化,梯度上升可处理离散或连续动作实现简单;方差大,收敛慢
Actor-Critic (A2C/A3C)策略网络 + 价值网络,降低方差常用在并行、多线程场景训练速度快,易于扩展;可能仍有不稳定
DDPG基于 Actor-Critic,用确定性策略处理连续动作机器人控制、模拟仿真等连续任务适合连续动作;易陷入不稳定,需 carefully 调参
TD3双 Critic + 延迟更新 + 目标平滑,改进 DDPG与 DDPG 同更鲁棒,减少过估计;实现稍复杂
PPOOn-policy,使用剪切损失保证策略改进稳定机器人、游戏等多种场景易实现、效果好;在学术及工业上均较常用
SACOff-policy,熵正则化,鼓励探索连续动作、高维控制收敛稳定,探索充分;在许多基准任务中效果出色

通过上表,我们可以看到离散动作环境通常用 DQN 系列(或 Policy Gradient 的离散版),而连续动作环境往往使用 DDPG/TD3/PPO/SAC 等。具体选择哪种算法,一般需要根据环境特征数据采集方式(on-policy 或 off-policy)、以及对稳定性采样效率的要求做综合考量。


总结

  1. DQN 系列:适用于离散动作。DQN 引入 Experience Replay、Target Network,后续演化出 Double DQN、Dueling DQN、优先级回放、Rainbow 等。
  2. Policy Gradient 系列:适用于离散或连续动作,直接对策略进行参数化:
    • 基本策略梯度(REINFORCE)概念最简单,但方差大;
    • Actor-Critic 引入价值函数基线,降低方差,衍生出 A2C/A3C 等多线程并行方式。
  3. 高级算法
    • DDPG、TD3:典型的 off-policy Actor-Critic,用于连续动作;
    • PPO:on-policy 策略梯度,带剪切损失,稳定性好;
    • SAC:off-policy,双 Critic + 熵正则,探索充分、表现稳定。

掌握了深度强化学习主流算法的基本原理、核心公式和核心实现细节,并能够在常见基准环境(如 OpenAI Gym、Atari、MuJoCo 等)上独立训练和测试这些算法。这为后续在多智能体强化学习人机协作指挥决策等更复杂场景的扩展奠定了坚实基础。

相关文章:

二、智能体强化学习——深度强化学习核心算法

2.1 DQN 系列及其改进 2.1.1 背景与动机 在经典强化学习中&#xff08;如 Q-Learning&#xff09;&#xff0c;如果状态空间或动作空间非常大乃至连续&#xff0c;那么用一个表格来存储 Q ( s , a ) Q(s,a) Q(s,a) 不再可行。为了解决该问题&#xff0c;可以使用神经网络来逼…...

Mysql--架构篇--存储引擎InnoDB(内存结构,磁盘结构,存储结构,日志管理,锁机制,事务并发控制等)

MySQL是一个多存储引擎的数据库管理系统&#xff0c;支持多种不同的存储引擎。每种存储引擎都有其独特的特性、优势和适用场景。选择合适的存储引擎对于优化数据库性能、确保数据完整性和满足业务需求至关重要。 注&#xff1a;在同一个Mysql的数据库中&#xff0c;对于不同的表…...

JVM实战—13.OOM的生产案例

大纲 1.每秒仅上百请求的系统为何会OOM(RPC超时时间设置过长导致QPS翻几倍) 2.Jetty服务器的NIO机制如何导致堆外内存溢出(S区太小 禁NIO的显式GC) 3.一次微服务架构下的RPC调用引发的OOM故障排查实践(MAT案例) 4.一次没有WHERE条件的SQL语句引发的OOM问题排查实践(使用MA…...

client-go 的 QPS 和 Burst 限速

1. 什么是 QPS 和 Burst &#xff1f; 在 kubernetes client-go 中&#xff0c;QPS 和 Burst 是用于控制客户端与 Kubernetes API 交互速率的两个关键参数&#xff1a; QPS (Queries Per Second) 定义&#xff1a;表示每秒允许发送的请求数量&#xff0c;即限速器的平滑速率…...

使用docker-compose安装Redis的主从+哨兵模式

必看 本文是一主二从一哨兵模式&#xff1b;其余的单机/集群/多哨兵模式的话&#xff0c;不在本文... 本文的环境主要是&#xff1a;应用app在本地&#xff0c;redis在云服务器上&#xff1b; 图解 图如下&#xff1a;这个图很重要&#xff1b; 之所以要这样画图&#xff0…...

数据结构(Java版)第七期:LinkedList与链表(二)

专栏&#xff1a;数据结构(Java版) 个人主页&#xff1a;手握风云 一、链表的实现&#xff08;补&#xff09; 接上一期&#xff0c;下面我们要实现删除所有值为key的元素&#xff0c;这时候有的老铁就会想用我们上一期中讲到的remove方法&#xff0c;循环使用remove方法&#…...

ant-design-vue 1.X 通过id获取a-input组件失败

1.ant-design-vue 1.X 问题描述 当我在a-form组件中&#xff0c;以v-decorator指令绑定表单组件时&#xff0c;无法根据我设置的verify-code-input获取元素 <a-input type"text" id"verify-code-input" class"paIpt":placeholder"$t(…...

Flutter:吸顶效果

在分页中&#xff0c;实现tab吸顶。 TDNavBar的screenAdaptation: true, 开启屏幕适配。 该属性已自动对不同手机状态栏高度进行适配。我们只需关注如何实现吸顶。 view import package:ducafe_ui_core/ducafe_ui_core.dart; import package:flutter/material.dart; import p…...

MATLAB语言的数据类型

MATLAB语言的数据类型详解 MATLAB&#xff08;矩阵实验室&#xff09;是一种广泛应用于科学计算、数据分析、算法开发及模型构建的高性能语言和环境。MATLAB的强大之处不仅在于其丰富的数学工具和可视化功能&#xff0c;还有其灵活多变的数据类型。这篇文章将详细介绍MATLAB中…...

priority_queue优先队列

目录 1. 最短路径算法&#xff08;Dijkstra算法&#xff09; 应用场景&#xff1a; 优先队列的作用&#xff1a; 2. 最小生成树算法&#xff08;Prim算法&#xff09; 应用场景&#xff1a; 优先队列的作用&#xff1a; 3. 哈夫曼编码&#xff08;Huffman Coding&#x…...

HarmonyOS 鸿蒙Next 预览pdf文件

HarmonyOS 鸿蒙Next 预览pdf文件 1、使用filePreview 2、使用web组件 在线pdf&#xff08;网址是直接下载的&#xff0c;不是直接可以预览的&#xff09;&#xff0c;先下载再预览 import media from ohos.multimedia.media;import web_webview from ohos.web.webview;import …...

vscode开启调试模式,结合Delve调试器调试golang项目详细步骤

1.前期准备 (1).在vs code中的扩展程序中搜索并安装Go扩展程序 (2).安装 Delve 调试器 go install github.com/go-delve/delve/cmd/dlvlatest (3).打开vs code的命令面板&#xff0c;输入Go: Install/Update Tools&#xff0c;并单击该命令执行&#xff0c;安装或更新Go语…...

身份鉴权(PHP)(小迪网络安全笔记~

免责声明&#xff1a;本文章仅用于交流学习&#xff0c;因文章内容而产生的任何违法&未授权行为&#xff0c;与文章作者无关&#xff01;&#xff01;&#xff01; 附&#xff1a;完整笔记目录~ ps&#xff1a;本人小白&#xff0c;笔记均在个人理解基础上整理&#xff0c;…...

【git】-初始git

一、什么是版本控制&#xff1f; 二、Git的安装 三、掌握Linux常用命令 四、Git基本操作 1、提交代码 2、查看历史提交 3、版本回退 一、什么是版本控制&#xff1f; 版本控制是一种用于记录文件或项目内容变化的系统。它通过版本标识和版本历史记录来管理不同版本&#…...

CSS 盒模型

盒模型 CSS盒模型是网页布局的核心概念之一&#xff0c;它描述了网页元素的物理结构和元素内容与周围元素之间的关系。根据W3C规范&#xff0c;每个HTML元素都被视为一个矩形盒子&#xff0c;这个盒子由以下四个部分组成&#xff1a; 内容区&#xff08;Content area&#xff…...

[0405].第05节:搭建Redis主从架构

Redis学习大纲 一、3主3从的集群配置&#xff1a; 1.1.集群规划 1.分片集群需要的节点数量较多&#xff0c;这里我们搭建一个最小的分片集群&#xff0c;包含3个master节点&#xff0c;每个master包含一个slave节点&#xff0c;结构如下&#xff1a; 2.每组是一主一从&#x…...

6 分布式限流框架

限流的作用 在API对外互联网开放的情况下&#xff0c;是无法控制调用方的行为的。当遇到请求激增或者黑客攻击的情况下&#xff0c;会导致接口占用大量的服务器资源&#xff0c;使得接口响应效率的降低或者超时&#xff0c;更或者导致服务器宕机。 限流是指对应用服务进行限制…...

sosadmin相关命令

sosadmin命令 以下是本人翻译的官方文档&#xff0c;如有不对&#xff0c;还请指出&#xff0c;引用请标明出处。 原本有个对应表可以跳转的&#xff0c;但是CSDN的这个[](#)跳转好像不太一样&#xff0c;必须得用html标签&#xff0c;就懒得改了。 sosadmin help 用法 sosadm…...

关于大数据的基础知识(四)——大数据的意义与趋势

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于大数据的基础知识&#xff08;四&a…...

【EI,Scopus检索 | 往届均已检索见刊】第四届智能系统、通信与计算机网络国际学术会议(ISCCN 2025)

重要信息&#xff1a; 大会官网&#xff1a;更多详情【论文投稿】 截稿时间&#xff1a;以官网信息为准 大会时间&#xff1a;2025年2月21-23日 接受/拒稿通知&#xff1a;投稿后3-5个工作日内 收录检索&#xff1a;EI&#xff0c;Scopus 出版信息&#xff1a; 本会议所有…...

smplx blender插件笔记

目录 liunx安装&#xff1a; liunx安装&#xff1a; pip install smplx 这个创建模型报错 SMPL_blender_addon...

【算法】移除元素

今天讲的是力扣题目的题解&#xff1a; 力扣题目&#xff1a; 72.移除元素 题目描述&#xff1a; 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不…...

【后端面试总结】设计一个分布式锁需要考虑哪些东西

分布式锁是我们在分布式场景中经常用到的一种技术&#xff0c;在后端面试中也是出镜率很高&#xff0c;那么我们设计分布式锁的时候应该从那几方面去考虑呢 实现分布式锁需要考虑的点 设置超时时间 设置超时时间的目的是为了避免这个场景&#xff1a;进程A拿了锁&#xff0c…...

awr报告无法生成:常见案例与解决办法

awr报告无法生成:常见案例与解决办法 STATISTICS_LEVEL设置过低数据库打开状态不对主库隐含参数设置错误MMON子进程被SuspendSYS模式统计信息过期WRH$_SQL_PLAN表数据量太大AWR绑定变量信息收集超时撞上数据库Bug 9040676STATISTICS_LEVEL设置过低 STATISTICS_LEVEL设置为BAS…...

Hadoop 生态之 kerberos

参考链接 https://winway.github.io/2022/04/02/kerberos-ranger/ https://ieevee.com/tech/2016/06/22/ranger-2.html kerberos解决”who are you“的问题 ranger解决”what you can do“的问题 LDAP 轻型目录访问协议&#xff08;英文&#xff1a;Lightweight Director…...

【文件I/O】文件持久化

这篇文章详细讲解的是 理解在Linux操作系统中输入/输出&#xff08;I/O&#xff09;编程与文件操作的关系。 在计算机编程中&#xff0c;输入/输出编程&#xff08;I/O 编程&#xff09; 是一个重要的概念&#xff0c;指的是通过程序与外部世界&#xff08;如用户输入、文件、…...

USB学习——基本概念

文章目录 USB&#xff08;Universal Serial Bus&#xff09;概述USB系统的描述USB总线传输方式USB的拓扑结构 USB的连接模型USB控制器及分类USB描述符USB 端点USB枚举过程USB 四种传输类型USB 事务批量传输(Bulk)中断传输(Interrupt)等时传输(Isochronous)控制传输(Control)端点…...

python-leetcode-三数之和

15. 三数之和 - 力扣&#xff08;LeetCode&#xff09; class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:nums.sort() # 排序n len(nums)res []for i in range(n):# 剪枝&#xff1a;如果当前数 > 0&#xff0c;三数之和不可能为 0if nums[i]…...

springboot整合拦截器

1.首先创建拦截器类&#xff1a; package com.example.interceptor;import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.sp…...

B树与B+树:数据库索引的秘密武器

想象一下&#xff0c;你正在构建一个超级大的图书馆&#xff0c;里面摆满了各种各样的书籍。B树和B树就像是两种不同的图书分类和摆放方式&#xff0c;它们都能帮助你快速找到想要的书籍&#xff0c;但各有特点。 B树就像是一个传统的图书馆摆放方式&#xff1a; 1. 书籍摆放&…...

wordpress 农场模板/搜索引擎竞价推广的优势

网络作文教学设计作为一无名无私奉献的教育工作者&#xff0c;编写教学设计是必不可少的&#xff0c;教学设计一般包括教学目标、教学重难点、教学方法、教学步骤与时间分配等环节。优秀的教学设计都具备一些什么特点呢&#xff1f;下面是小编收集整理的网络作文教学设计&#…...

做网站前端和平面配合/班级优化大师下载安装

一、什么是linux? Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。伴随着互联网的发展,Linux得到了来自全世界软件爱好者、组织、公司的支持。它除了在服务器操作系统方面保持着强劲的发展势头以外,…...

seo案例网站建设哪家好/网推接单平台

嵌入式Linux基础教程(第2版)基本信息原书名&#xff1a;Embedded Linux Primer:A Practical Real-World Approach, Second Edition 原出版社&#xff1a; Pearson Education 作者&#xff1a; (美)Christopher Hallinan [作译者介绍] 译者&#xff1a; 周鹏 丛书名&#xff1a;…...

最专业的网站建设组织/搜索引擎优化seo多少钱

initWithFrame&#xff1a; 通过代码创建UI控件的时候就会调用&#xff1b; initWithCoder&#xff1a;从文件中解析一个对象的时候就会调用这个方法&#xff0c;也就是说无论是通过代码还是xib&#xff0c;程序运行的时候都会调用这个方法&#xff1b; awakeFromNib&#xff…...

深圳网站公司招聘信息/全国免费信息发布平台

https://www.cnblogs.com/lantingji/p/5853790.html 1、新建一个ATL Project。 2、建议将 Project Property 中 Linker – General - “Register Output” 设为 no&#xff0c;C/C - “Code Generation” - “Runtime Library” 设为 /MTd。 3、在 Solution Explorer 中右键 A…...

标签 wordpress/长春网站建设

摘要&#xff1a; C实现求解给定文本中以指定字符开头和结尾的子串数量的三种算法 难度&#xff1a; 初级。 一、 问题描述&#xff1a; 求解给定文本text 中以字符 A 开头&#xff0c; 字符B 结尾的子串数量。例如&#xff0c;文本ABCAAB 中以A开头B结尾的子串分别为…...