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

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 等)上独立训练和测试这些算法。这为后续在多智能体强化学习人机协作指挥决策等更复杂场景的扩展奠定了坚实基础。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

day02-前端Web-JavaScript

目录 1. JS介绍2. 引入方式2.1 介绍2.2 演示 3. 基础语法3.1 书写规范3.2 变量3.2.1 let3.2.2 const3.2.3 注意 3.3 数据类型3.4 运算符3.4.1 运算符3.4.2 类型转换 3.5 流程控制语句 4. 函数4.1 格式一4.2 格式二 5. JS对象5.1 基本对象5.1.1 Array对象5.1.1.1 语法格式5.1.1.…

有收到腾讯委托律师事务所向AppStore投诉带有【水印相机】主标题名称App的开发者吗

近期&#xff0c;有多名开发者反馈&#xff0c;收到来自腾讯科技 (深圳) 有限公司委托北京的一家**诚律师事务所卞&#xff0c;写给AppStore的投诉邮件。 邮件内容主要说的是&#xff0c;腾讯注册了【水印相机】这四个字的商标&#xff0c;所以你们这些在AppStore上的app&…

2024年度漏洞态势分析报告,需要访问自取即可!(PDF版本)

2024年度漏洞态势分析报告&#xff0c;需要访问自取即可!(PDF版本),大家有什么好的也可以发一下看看

moviepy 将mp4视频文件提取音频mp3 - python 实现

DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(free)” -------------------------------------------------------------…

算法(二)——一维差分、等差数列差分

文章目录 一维差分、等差数列差分一维差分例题&#xff1a;航班预订统计 等差数列差分例题&#xff1a;三步必杀例题&#xff1a;Lycanthropy 一维差分、等差数列差分 一维差分 差分解决的是 区间修改&#xff08;更新&#xff09;问题&#xff0c;特别是多次区间修改问题&…

深度学习笔记11-优化器对比实验(Tensorflow)

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目录 一、导入数据并检查 二、配置数据集 三、数据可视化 四、构建模型 五、训练模型 六、模型对比评估 七、总结 一、导入数据并检查 import pathlib,…

FreeROTS学习 内存管理

内存管理是一个系统基本组成部分&#xff0c;FreeRTOS 中大量使用到了内存管理&#xff0c;比如创建任务、信号量、队列等会自动从堆中申请内存&#xff0c;用户应用层代码也可以 FreeRTOS 提供的内存管理函数来申请和释放内存 FreeRTOS 内存管理简介 FreeRTOS 创建任务、队列…

【设计模式】介绍常见的设计模式

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 ✨ 介绍一下常见的设计模式✨ Spring 中常见的设计模式 这期内容主要是总结一下常见的设计模式&#xff0c;可…

6 分布式限流框架

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

【动态规划篇】欣赏概率论与镜像法融合下,别出心裁探索解答括号序列问题

本篇鸡汤&#xff1a;没有人能替你承受痛苦&#xff0c;也没有人能拿走你的坚强. 欢迎拜访&#xff1a;羑悻的小杀马特.-CSDN博客 本篇主题&#xff1a;带你解答洛谷的括号序列问题&#xff08;绝对巧解&#xff09; 制作日期&#xff1a;2025.01.10 隶属专栏&#xff1a;C/C题…

数据库高安全—角色权限:权限管理权限检查

目录 3.3 权限管理 3.4 权限检查 书接上文数据库高安全—角色权限&#xff1a;角色创建角色管理&#xff0c;从角色创建和角色管理两方面对高斯数据库的角色权限进行了介绍&#xff0c;本篇将从权限管理和权限检查方面继续解读高斯数据库的角色权限。 3.3 权限管理 &#x…

深入浅出负载均衡:理解其原理并选择最适合你的实现方式

负载均衡是一种在多个计算资源&#xff08;如服务器、CPU核心、网络链接等&#xff09;之间分配工作负载的技术&#xff0c;旨在优化资源利用率、提高系统吞吐量和降低响应时间。负载均衡的实现方式多种多样&#xff0c;以下是几种常见的实现方式&#xff1a; 1. 硬件负载均衡&…

Training-free regional prompting for diffusion transformers

通过语言模型来构建位置关系的,omnigen combine来做位置生成,其实可以通过大模型来做,不错。 1.introduction 文生图模型在准确处理具有复杂空间布局的提示时仍然面临挑战,1.通过自然语言准确描述特定的空间布局非常困难,特别是当对象数量增加或需要精确的位置控制时,2.…

麦田物语学习笔记:背包物品选择高亮显示和动画

如题,本篇文章没讲动画效果 基本流程 1.代码思路 (1)先用点击事件的接口函数去实现,点击后反转选择状态(isSelected),以及设置激活状态(SetActive),并且还需要判断该格子是否为空,空格子是点不动的,完成后以上后,出现的问题是高亮应该是有且仅有一个格子是高亮的,而现在可以让…

Linux:深入了解fd文件描述符

目录 1. 文件分类 2. IO函数 2.1 fopen读写模式 2.2 重定向 2.3 标准文件流 3. 系统调用 3.1 open函数认识 3.2 open函数使用 3.3 close函数 3.4 write函数 3.5 read函数 4. fd文件描述符 4.1 标准输入输出 4.2 什么是文件描述符 4.3 语言级文件操作 1. 文件分类…

数据结构:栈(Stack)和队列(Queue)—面试题(一)

目录 1、括号匹配 2、逆波兰表达式求值 3、栈的压入、弹出序列 4、最小栈 1、括号匹配 习题链接https://leetcode.cn/problems/valid-parentheses/description/ 描述&#xff1a; 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] …

51单片机(一) keil4工程与小灯实验

直接开始 新建一个工程 在这里插入图片描述 添加文件 另存为 添加文件到组 写下一个超循环系统代码 调整编译项编译 可以在工程目录找到编译好的led_fst.hex 自行烧写到各自的开发板。 会看到什么都没有。 现在定义一个GPIO端口与小灯的连接&#xff0c;再点亮小灯…

基于 Python 和 OpenCV 的人脸识别上课考勤管理系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Vue2:el-table中的文字根据内容改变颜色

想要实现的效果如图,【级别】和【P】列的颜色根据文字内容变化 1、正常创建表格 <template><el-table:data="tableData"style="width: 100%"><el-table-column prop="id" label="ID"/> <el-table-column …

案例研究:UML用例图中的结账系统

在软件工程和系统分析中&#xff0c;统一建模语言&#xff08;UML&#xff09;用例图是一种强有力的工具&#xff0c;用于描述系统与其用户之间的交互。本文将通过一个具体的案例研究&#xff0c;详细解释UML用例图的关键概念&#xff0c;并说明其在设计结账系统中的应用。 用…