【强化学习】强化学习算法 - 马尔可夫决策过程
马尔可夫决策过程 (Markov Decision Process, MDP)
1. MDP 原理介绍
马尔可夫决策过程 (MDP) 是强化学习 (Reinforcement Learning, RL) 中用于对序贯决策 (Sequential Decision Making) 问题进行数学建模的标准框架。它描述了一个智能体 (Agent) 与环境 (Environment) 交互的过程,其中智能体的目标是最大化其在一段时间内获得的总奖励。
MDP 假设环境具有马尔可夫性质 (Markov Property),即未来的状态和奖励只依赖于当前的状态和智能体采取的动作,而与过去的状态或动作历史无关。
一个 MDP 通常由以下五个核心要素组成,表示为一个五元组 ( S , A , P , R , γ ) (S, A, P, R, \gamma) (S,A,P,R,γ):
-
状态集合 (State Space, S S S):
- 表示智能体可能处于的所有不同情况或配置的集合。状态可以是离散的(例如棋盘格的位置)或连续的(例如机器人的关节角度)。这里我们主要关注离散状态空间。
- S t S_t St 表示智能体在时间步 t t t 所处的状态。
-
动作集合 (Action Space, A A A):
- 表示智能体在每个状态下可以采取的所有可能行为的集合。动作也可以是离散的(例如游戏中按键)或连续的(例如控制油门)。有时动作集合依赖于状态,记为 A ( s ) A(s) A(s)。
- A t A_t At 表示智能体在时间步 t t t 选择的动作。
-
状态转移概率 (Transition Probability Function, P P P):
- P ( s ′ ∣ s , a ) = P r ( S t + 1 = s ′ ∣ S t = s , A t = a ) P(s' | s, a) = Pr(S_{t+1}=s' | S_t=s, A_t=a) P(s′∣s,a)=Pr(St+1=s′∣St=s,At=a)。
- 它定义了在状态 s s s 下采取动作 a a a 后,转移到下一个状态 s ′ s' s′ 的概率。这体现了环境的动态性,可能包含随机性。
- 对于所有 s ∈ S , a ∈ A ( s ) s \in S, a \in A(s) s∈S,a∈A(s),必须满足 ∑ s ′ ∈ S P ( s ′ ∣ s , a ) = 1 \sum_{s' \in S} P(s' | s, a) = 1 ∑s′∈SP(s′∣s,a)=1。
-
奖励函数 (Reward Function, R R R):
- 定义了智能体在特定状态下采取特定动作后获得的即时奖励。有几种常见的定义方式:
- R ( s , a , s ′ ) R(s, a, s') R(s,a,s′):在状态 s s s 采取动作 a a a 并转移到状态 s ′ s' s′ 时获得的奖励。
- R ( s , a ) = E [ R t + 1 ∣ S t = s , A t = a ] = ∑ s ′ P ( s ′ ∣ s , a ) R ( s , a , s ′ ) R(s, a) = E[R_{t+1} | S_t=s, A_t=a] = \sum_{s'} P(s' | s, a) R(s, a, s') R(s,a)=E[Rt+1∣St=s,At=a]=∑s′P(s′∣s,a)R(s,a,s′):在状态 s s s 采取动作 a a a 后期望获得的即时奖励。这是更常用的形式。
- R ( s ) R(s) R(s):仅与进入状态 s s s 相关联的奖励。
- 奖励函数 R R R 定义了问题的目标。智能体的目的是最大化累积奖励。 R t + 1 R_{t+1} Rt+1 是在时间步 t + 1 t+1 t+1 获得的奖励。
- 定义了智能体在特定状态下采取特定动作后获得的即时奖励。有几种常见的定义方式:
-
折扣因子 (Discount Factor, γ \gamma γ):
- γ ∈ [ 0 , 1 ] \gamma \in [0, 1] γ∈[0,1]。它是一个用于衡量未来奖励相对于当前奖励重要性的参数。
- γ \gamma γ 接近 0 时,智能体更关注即时奖励(短视)。
- γ \gamma γ 接近 1 时,智能体更关注长期累积奖励(远视)。
- γ < 1 \gamma < 1 γ<1 通常也确保了无限时间范围内的累积奖励(回报)是有限的。
马尔可夫性质 (Markov Property)
这是 MDP 的核心假设: P ( S t + 1 , R t + 1 ∣ S t , A t , S t − 1 , A t − 1 , . . . , S 0 , A 0 ) = P ( S t + 1 , R t + 1 ∣ S t , A t ) P(S_{t+1}, R_{t+1} | S_t, A_t, S_{t-1}, A_{t-1}, ..., S_0, A_0) = P(S_{t+1}, R_{t+1} | S_t, A_t) P(St+1,Rt+1∣St,At,St−1,At−1,...,S0,A0)=P(St+1,Rt+1∣St,At)。这意味着,系统下一时刻的状态和获得的奖励,仅取决于当前的状态 S t S_t St 和当前采取的动作 A t A_t At,与之前的历史状态和动作无关。
目标
智能体的目标是找到一个策略 (Policy) π \pi π,该策略定义了在每个状态 s s s 下选择动作 a a a 的方式(通常是概率分布 π ( a ∣ s ) = P r ( A t = a ∣ S t = s ) \pi(a|s) = Pr(A_t=a | S_t=s) π(a∣s)=Pr(At=a∣St=s)),以最大化期望累积折扣奖励 (Expected Cumulative Discounted Reward),也称为回报 (Return) 或 价值 (Value)。
从时间步 t t t 开始的回报定义为:
G t = R t + 1 + γ R t + 2 + γ 2 R t + 3 + . . . = ∑ k = 0 ∞ γ k R t + k + 1 G_t = R_{t+1} + \gamma R_{t+2} + \gamma^2 R_{t+3} + ... = \sum_{k=0}^\infty \gamma^k R_{t+k+1} Gt=Rt+1+γRt+2+γ2Rt+3+...=k=0∑∞γkRt+k+1
价值函数 (Value Functions)
为了评估策略的好坏,引入了价值函数:
- 状态价值函数 (State-Value Function) V π ( s ) V^\pi(s) Vπ(s): 从状态 s s s 开始,遵循策略 π \pi π 所能获得的期望回报。
V π ( s ) = E π [ G t ∣ S t = s ] = E π [ ∑ k = 0 ∞ γ k R t + k + 1 ∣ S t = s ] V^\pi(s) = E_\pi[G_t | S_t=s] = E_\pi\left[\sum_{k=0}^\infty \gamma^k R_{t+k+1} | S_t=s\right] Vπ(s)=Eπ[Gt∣St=s]=Eπ[k=0∑∞γkRt+k+1∣St=s] - 动作价值函数 (Action-Value Function) Q π ( s , a ) Q^\pi(s, a) Qπ(s,a): 在状态 s s s 采取动作 a a a,然后遵循策略 π \pi π 所能获得的期望回报。
Q π ( s , a ) = E π [ G t ∣ S t = s , A t = a ] = E π [ ∑ k = 0 ∞ γ k R t + k + 1 ∣ S t = s , A t = a ] Q^\pi(s, a) = E_\pi[G_t | S_t=s, A_t=a] = E_\pi\left[\sum_{k=0}^\infty \gamma^k R_{t+k+1} | S_t=s, A_t=a\right] Qπ(s,a)=Eπ[Gt∣St=s,At=a]=Eπ[k=0∑∞γkRt+k+1∣St=s,At=a]
贝尔曼方程 (Bellman Equations)
价值函数满足递归关系,称为贝尔曼方程,它们是大多数 RL 算法的基础。
- 贝尔曼期望方程 (Bellman Expectation Equation for V π V^\pi Vπ):
V π ( s ) = ∑ a π ( a ∣ s ) ∑ s ′ P ( s ′ ∣ s , a ) [ R ( s , a , s ′ ) + γ V π ( s ′ ) ] V^\pi(s) = \sum_{a} \pi(a|s) \sum_{s'} P(s'|s,a) [R(s,a,s') + \gamma V^\pi(s')] Vπ(s)=a∑π(a∣s)s′∑P(s′∣s,a)[R(s,a,s′)+γVπ(s′)]
(若使用 R ( s , a ) R(s,a) R(s,a),则为: V π ( s ) = ∑ a π ( a ∣ s ) ( R ( s , a ) + γ ∑ s ′ P ( s ′ ∣ s , a ) V π ( s ′ ) ) V^\pi(s) = \sum_{a} \pi(a|s) (R(s,a) + \gamma \sum_{s'} P(s'|s,a) V^\pi(s')) Vπ(s)=∑aπ(a∣s)(R(s,a)+γ∑s′P(s′∣s,a)Vπ(s′))) - 贝尔曼期望方程 (Bellman Expectation Equation for Q π Q^\pi Qπ):
Q π ( s , a ) = ∑ s ′ P ( s ′ ∣ s , a ) [ R ( s , a , s ′ ) + γ ∑ a ′ π ( a ′ ∣ s ′ ) Q π ( s ′ , a ′ ) ] Q^\pi(s, a) = \sum_{s'} P(s'|s,a) [R(s,a,s') + \gamma \sum_{a'} \pi(a'|s') Q^\pi(s', a')] Qπ(s,a)=s′∑P(s′∣s,a)[R(s,a,s′)+γa′∑π(a′∣s′)Qπ(s′,a′)]
(若使用 R ( s , a ) R(s,a) R(s,a),则为: Q π ( s , a ) = R ( s , a ) + γ ∑ s ′ P ( s ′ ∣ s , a ) V π ( s ′ ) = R ( s , a ) + γ ∑ s ′ P ( s ′ ∣ s , a ) ∑ a ′ π ( a ′ ∣ s ′ ) Q π ( s ′ , a ′ ) ) Q^\pi(s, a) = R(s,a) + \gamma \sum_{s'} P(s'|s,a) V^\pi(s') = R(s,a) + \gamma \sum_{s'} P(s'|s,a) \sum_{a'} \pi(a'|s') Q^\pi(s', a')) Qπ(s,a)=R(s,a)+γ∑s′P(s′∣s,a)Vπ(s′)=R(s,a)+γ∑s′P(s′∣s,a)∑a′π(a′∣s′)Qπ(s′,a′)))
强化学习的目标是找到最优策略 π ∗ \pi_* π∗,使得所有状态的价值 V π ∗ ( s ) V^{\pi_*}(s) Vπ∗(s) 或所有状态动作对的价值 Q π ∗ ( s , a ) Q^{\pi_*}(s, a) Qπ∗(s,a) 最大化。对应的价值函数称为最优价值函数 V ∗ ( s ) V_*(s) V∗(s) 和 Q ∗ ( s , a ) Q_*(s, a) Q∗(s,a),它们满足贝尔曼最优方程 (Bellman Optimality Equations)。
2. MDP 建模/实现步骤
将一个实际问题建模为 MDP,通常涉及以下步骤。这并不是一个具体的编程实现,而是定义问题的数学框架:
- 定义状态空间 S S S: 确定能够充分描述问题状态的所有变量和它们的可能取值。状态需要满足马尔可夫性质。选择合适的状态表示至关重要。
- 定义动作空间 A A A: 确定智能体在每个状态下可以采取的所有动作。
- 定义状态转移概率 P ( s ′ ∣ s , a ) P(s'|s, a) P(s′∣s,a): 描述环境的动态。对于每个状态 s s s 和动作 a a a,确定转移到下一个状态 s ′ s' s′ 的概率。这通常是建模中最困难的部分,可能基于物理定律、规则或数据估计。
- 定义奖励函数 R ( s , a ) R(s, a) R(s,a) 或 R ( s , a , s ′ ) R(s, a, s') R(s,a,s′): 设计奖励信号以引导智能体实现目标。奖励应该反映任务的即时成功或失败。例如,目标达成给予正奖励,危险状态给予负奖励,普通移动给予小的负奖励(鼓励效率)。
- 选择折扣因子 γ \gamma γ: 根据任务是有限期还是无限期,以及对未来奖励的重视程度来选择 γ \gamma γ。
完成建模后:
- 如果 MDP 的模型( P P P 和 R R R)已知,可以使用动态规划 (Dynamic Programming) 方法(如价值迭代 Value Iteration 或策略迭代 Policy Iteration)来精确计算最优价值函数和最优策略。
- 如果 MDP 的模型未知(这是更常见的情况),则需要使用强化学习算法(如 Q-Learning, SARSA, DQN, Actor-Critic 等),通过智能体与环境的交互(采样)来学习最优策略。
3. MDP 示例:简单网格世界 (Grid World)
假设有一个 3x3 的网格世界。
+---+---+---+
| | | G | (0,0) (0,1) (0,2)
+---+---+---+
| | W | | (1,0) (1,1) (1,2)
+---+---+---+
| S | | | (2,0) (2,1) (2,2)
+---+---+---+
- S (Start): 智能体的起始位置 (2,0)。
- G (Goal): 目标位置 (0,2),到达后获得奖励。
- W (Wall): 墙壁 (1,1),无法进入。
- 空格: 可以移动的普通格子。
MDP 组件定义:
-
状态空间 S S S: 每个格子的坐标 ( r , c ) (r, c) (r,c),其中 r ∈ { 0 , 1 , 2 } , c ∈ { 0 , 1 , 2 } r \in \{0, 1, 2\}, c \in \{0, 1, 2\} r∈{0,1,2},c∈{0,1,2}。共 9 个状态。状态 (1,1) 是障碍物。状态 (0,2) 是目标状态(可以设为终止状态)。
-
动作空间 A A A: 在每个非终止状态,智能体可以尝试向四个方向移动:{上 (Up), 下 (Down), 左 (Left), 右 (Right)}。
-
状态转移概率 P ( s ′ ∣ s , a ) P(s'|s, a) P(s′∣s,a):
- 确定性环境: 假设移动是确定的。
- 如果从状态 s = ( r , c ) s=(r, c) s=(r,c) 尝试动作 a a a,目标格子 s ′ = ( r ′ , c ′ ) s'=(r', c') s′=(r′,c′) 在网格内且不是墙壁 (1,1),则 P ( s ′ ∣ s , a ) = 1 P(s'|s, a) = 1 P(s′∣s,a)=1,其他 P ( s ′ ′ ∣ s , a ) = 0 P(s''|s,a)=0 P(s′′∣s,a)=0。
- 如果目标格子 s ′ s' s′ 超出边界或撞墙 (1,1),则智能体停留在原地,即 P ( s ∣ s , a ) = 1 P(s|s, a) = 1 P(s∣s,a)=1。
- 如果当前状态 s s s 是目标状态 G (0,2),可以设定 G 为终止状态,任何动作都停留在 G (或转移到一个特殊的终止状态)。
- 随机性环境 (可选): 假设有 80% 的概率按预期方向移动,各有 10% 的概率向预定方向的左侧或右侧移动(撞墙或边界则停留在原地)。例如,在 (1,0) 选择 ‘Up’:
- 80% 概率到达 (0,0)。
- 10% 概率向左滑,撞边界,停留在 (1,0)。
- 10% 概率向右滑,撞墙 (1,1),停留在 (1,0)。
- 因此 P ( ( 0 , 0 ) ∣ ( 1 , 0 ) , ’Up’ ) = 0.8 P((0,0)|(1,0), \text{'Up'}) = 0.8 P((0,0)∣(1,0),’Up’)=0.8, P ( ( 1 , 0 ) ∣ ( 1 , 0 ) , ’Up’ ) = 0.2 P((1,0)|(1,0), \text{'Up'}) = 0.2 P((1,0)∣(1,0),’Up’)=0.2。
- 确定性环境: 假设移动是确定的。
-
奖励函数 R ( s , a ) R(s, a) R(s,a) 或 R ( s , a , s ′ ) R(s, a, s') R(s,a,s′):
- 到达目标状态 G (0,2): R = + 10 R = +10 R=+10。
- 每次移动(到达非目标状态): R = − 0.1 R = -0.1 R=−0.1 (鼓励尽快到达目标)。
- 撞墙或边界(停留在原地): R = − 1 R = -1 R=−1 (轻微惩罚)。
- (另一种设计:只有到达目标状态 G 时获得 R = + 1 R=+1 R=+1,其他所有转移奖励为 0)。
-
折扣因子 γ \gamma γ: 例如, γ = 0.9 \gamma = 0.9 γ=0.9。
目标: 找到一个策略 π ( a ∣ s ) \pi(a|s) π(a∣s),使得从状态 S (2,0) 出发,到达 G (0,2) 的期望累积折扣奖励最大化。这通常意味着找到一条避开墙壁、最快到达目标的路径。
通过动态规划(如果 P , R P, R P,R 已知)或强化学习算法(如果未知或需要通过交互学习),可以计算出每个状态的最佳动作,形成最优策略。例如,在 (2,0) 最优动作可能是 ‘Up’,在 (1,0) 最优动作可能是 ‘Up’ 或 ‘Right’ (取决于随机性和奖励设计),最终引导智能体走向 (0,2)。
相关文章:
【强化学习】强化学习算法 - 马尔可夫决策过程
马尔可夫决策过程 (Markov Decision Process, MDP) 1. MDP 原理介绍 马尔可夫决策过程 (MDP) 是强化学习 (Reinforcement Learning, RL) 中用于对序贯决策 (Sequential Decision Making) 问题进行数学建模的标准框架。它描述了一个智能体 (Agent) 与环境 (Environment) 交互的…...
数据结构【二叉搜索树(BST)】
二叉搜索树 1. 二叉搜索树的概念2. 二叉搜索树的性能分析3.二叉搜索树的插入4. 二叉搜索树的查找5. 二叉搜索树的删除6.二叉搜索树的实现代码7. 二叉搜索树key和key/value使用场景7.1 key搜索场景:7.2 key/value搜索场景: 1. 二叉搜索树的概念 二叉搜索…...
振动临近失效状态,怎么频谱会是梳子?
这是一个破坏性试验的终末期振动波形。左边时域,右边频域。这是咋回事,时域看起来原本很正常的冲击信号,怎么频域是那个鬼样子。 同一组波形,放大后的频域 - 低频部分: 一个解释:...
橡胶制品行业质检管理的痛点 质检LIMS如何重构橡胶制品质检价值链
橡胶制品广泛应用于汽车、医疗、航空等领域,其性能稳定性直接关联终端产品的安全性。从轮胎耐磨性测试到密封件耐腐蚀性验证,每一项检测数据都是企业参与市场竞争的核心筹码。然而,传统实验室管理模式普遍面临设备调度混乱、检测流程追溯断层…...
【CTFSHOW_Web入门】命令执行
文章目录 命令执行web29web30web31web32web33web34web35web36web37web38web39web40web41web42web43web44web45web46web47web48web49web50web51web52web53web54web55web56web57web58web59web60web61web62web63web64web65web66web67web68web69web70web71web72web73web74web75web7…...
三维底座+智能应用,重构城市治理未来
在“数字中国”战略的引领下,住房和城乡建设领域正迎来一场深刻的数字化转型浪潮。2024年《“数字住建”建设整体布局规划》的发布,明确提出以“CIM”(城市信息模型)为核心,构建城市三维数字底座,推动住建行…...
养生:塑造健康生活的良方
养生是一场贯穿生活的自我关爱行动,从饮食、运动、睡眠到心态调节,每一个环节都对健康有着深远影响。以下为你带来全面且实用的养生策略。 饮食养生:科学搭配,呵护肠胃 合理规划三餐,遵循 “早营养、午均衡、晚清淡”…...
docker 镜像的导出和导入(导出完整镜像和导出容器快照)
一、导出原始镜像 1. 使用 docker save 导出完整镜像 适用场景:保留镜像的所有层、元数据、标签和历史记录,适合迁移或备份完整镜像环境。 操作命令 docker save -o <导出文件名.tar> <镜像名:标签>示例:docker save -o milvu…...
NestJS 框架深度解析
框架功能分析 NestJS 是一个基于 Node.js 的渐进式框架,专为构建高效、可扩展的服务器端应用程序而设计。其核心理念结合了 面向对象编程(OOP)、函数式编程(FP) 和 函数式响应式编程(FRP)&…...
游戏引擎学习第267天:为每个元素添加裁剪矩形
仓库已满:https://gitee.com/mrxiao_com/2d_game_6 新仓库:https://gitee.com/mrxiao_com/2d_game_7 回顾并为今天的内容定下基调 我们今天的主要目标是对游戏的调试“Top List”进行改进,也就是用来显示游戏中耗时最多的函数或模块的性能分析列表。昨天我们已经实…...
基于阿里云DataWorks的物流履约时效离线分析
基于阿里云DataWorks的物流履约时效离线分析2. 数仓模型构建 ORC和Parquet区别: 压缩率与查询性能 压缩率 ORC通常压缩率更高,文件体积更小,适合存储成本敏感的场景。 Parquet因支持更灵活的嵌套结构,压缩率略…...
web 自动化之 selenium 元素四大操作三大切换等待
文章目录 一、元素的四大操作二、三大切换&等待1、切换窗口:当定位的元素不在当前窗口,则需要切换窗口2、切换iframe:当定位的元素在frame/iframe,则需要切换 一、元素的四大操作 1、输入 2、点击 3、获取文本 4、获取属性 import time…...
前端取经路——性能优化:唐僧的九道心经
大家好,我是老十三,一名前端开发工程师。性能优化如同唐僧的九道心经,是前端修行的精髓所在。在本文中,我将为你揭示从网络传输到渲染优化的九大关键技术,涵盖HTTP协议、资源加载策略、缓存控制等核心难题。通过这些实…...
前端工程化和性能优化问题详解
选自己熟悉的内容当作重难点,最好是前端相关的 以下是面向前端面试官介绍前端工程化和性能优化问题的结构化回答框架,结合行业标准和实战经验进行整合: 一、前端工程化核心解析 定义与目标 前端工程化是通过工具链和规范化流程,将…...
【应急响应】- 日志流量如何分析?
【应急响应】- 日志流量如何下手?https://mp.weixin.qq.com/s/dKl8ZLZ0wjuqUezKo4eUSQ...
8b10b编解码仿真
一、基本概念 8B/10B编码(8-bit to 10-bit encoding)是一种将8位数据(包括数据字符和控制字符)转换为10位符号(Symbol)的编码技术,由IBM工程师Al Widmer和Peter Franaszek于1983年提出。其核心思…...
软件工程之面向对象分析深度解析
前文基础: 1.软件工程学概述:软件工程学概述-CSDN博客 2.软件过程深度解析:软件过程深度解析-CSDN博客 3.软件工程之需求分析涉及的图与工具:软件工程之需求分析涉及的图与工具-CSDN博客 4.软件工程之形式化说明技术深度解…...
常见标签语言的对比
XML、JSON 和 YAML 是常见的数据序列化格式 相同点 结构化数据表示 三者均支持嵌套结构,能描述复杂的数据层级关系(如对象、数组、键值对)。跨平台兼容性 均为纯文本格式,可被多种编程语言解析,适用于跨系统数据交换…...
【Linux】环境变量(图文)
目录 一、main函数的参数解释: 1、argc和argc的解释 2、为什么要这样设置? 3、注意: 4、命令行计算器: 二、认识环境变量 三、见见环境变量 1、执行一个程序的前提 2、指令:echo $PATH 3、为什么系统自带的指令…...
基于OpenCV的人脸识别:EigenFaces算法
文章目录 引言一、概述二、代码解析1. 准备工作2. 加载训练图像3. 设置标签4. 准备测试图像5. 创建和训练识别器6. 进行预测7. 显示结果 三、代码要点总结 引言 人脸识别是计算机视觉领域的一个重要应用,今天我将通过一个实际案例来展示如何使用OpenCV中的EigenFac…...
跟我学C++中级篇——STL容器的查找对比
一、C标准库的查找 在C的STL中,对容器或相关序列的查找中,有两种方式,一种是std::find,另外一种是std::search。而且在它们的基础上,还衍生出std::find_if、std::find_if_not、std::find_end等和std::search_n、range…...
解构C++高级命名空间:构建空间作用域·控制兼容
前引:C作为C语言的继承者,也是其掘墓人。在编程语言的演化长河中,C始终游走在【兼容】与【革新】的路上。C程序员眼中(高效直接)的全局函数,对于C开发者来说是【命名空间污染的炸弹】,如果C未发…...
怎么判断是不是公网IP?如何查看自己本地路由器是内网ip还是公网?
在网络世界中,IP 地址如同每台设备的 “门牌号”,起着至关重要的标识作用。而 IP 地址又分为公网 IP 和私网 IP,准确判断一个 IP 属于哪一类,对于网络管理、网络应用开发以及理解网络架构等都有着重要意义。接下来,我们…...
微服务中 本地启动 springboot 无法找到nacos配置 启动报错
1. 此处的环境变量需要匹配nacos中yml配置文件名的后缀 对于粗心的小伙伴在切换【测试】【开发】环境的nacos使用时会因为这里导致项目总是无法启动成功...
android-ndk开发(11): 安装 repo 命令
1. 长话短说 mkdir ~/soft/bin curl -L https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo chmod x repo~/.pathrc 添加: export PATH$PATH:~/soft/bin2. 短话长说 repo 的官方介绍页面: https://gerrit.googlesource.com/git-repo/ repo 的官方下载地…...
【设计模式】GoF设计模式之策略模式(Strategy Pattern)
设计模式之策略模式 Strategy Pattern V1.0核心概念角色代码示例程序运行结果代码讲解 适用范围 V1.0 核心概念 策略模式是一种行为型设计模式,其核心思想是业务类执行某个动作时,可以使用该动作的不同的实现,并在程序运行中可以切换使用该…...
QT6(35)4.8定时器QTimer 与QElapsedTimer:理论,例题的界面搭建,与功能的代码实现。
(112) (113)模仿随书老师给的源代码搭建的, LCD 显示的部分不一样 : (114)以下开始代码完善: 关联定时器的信号与槽函数 : (115)…...
用Python监控金价并实现自动提醒!附完整源码
💂 个人网站:【 摸鱼游戏】【神级代码资源网站】【星海网址导航】💻香港大宽带-4H4G 20M只要36/月👉 点此查看详情 在日常投资中,很多朋友喜欢在一些平台买点黄金,低买高卖赚点小差价。但黄金价格实时波动频繁…...
加密领域 AI Agent 的崛起:DeFAI 如何重塑金融
原文:https://polkadot.com/blog/defai-crypto-ai-agents-explained/ 编译:OneBlock 一些创新大肆宣扬,另一些则在后台默默酝酿,不断迭代,直到它们突然无处不在,去中心化的金融系统也不例外。DeFi 解锁了…...
电位器如何接入西门子PLC的模拟量输入
1.设计思考 我现在手上有一个三线10kΩ的滑动变阻器,想让其当作模拟量接入西门子PLC中,外部改变电阻,PLC程序中能看到对应的阻值或电压,这样可以练习模拟量输入这个知识点! 2.了解模拟量的种类 模拟量一般有电压型和…...
发那科机器人5(异常事件和程序备份加载+ROBOGUIDE离线仿真)
发那科机器人5(异常事件和程序备份加载+ROBOGUIDE离线仿真) 一,异常事件和程序备份加载1,常见异常事件2,零点复归介绍3,程序备份-加载(未整理)二,`ROBOGUIDE`离线仿真1,仿真软件简介及安装步骤(未整理)2,机器人==导入与工具==与==工件添加==2.1,机器人导入(未整…...
第二章 如何安装KEIL5和新建工程
单芯片解决方案,开启全新体验——W55MH32 高性能以太网单片机 W55MH32是WIZnet重磅推出的高性能以太网单片机,它为用户带来前所未有的集成化体验。这颗芯片将强大的组件集于一身,具体来说,一颗W55MH32内置高性能Arm Cortex-M3核心…...
【Lattice FPGA 开发】Diamond在线调试Reveal逻辑乱跳的解决
在Vivado中在always块中写逻辑时如果出现always块中的异步复位敏感词在块内部未使用的情况,如下例的rst: always (posedge clk or posedge rst) begin if(~tx_sense_flag)o_rd_adr < d1;else if((o_rd_adr d94) & (bit_cnt d7))o_rd_adr <…...
跨浏览器自动化测试的智能生成方法
一、背景与挑战:跨浏览器测试为什么“难”? 在现代Web应用开发中,跨浏览器兼容性是用户体验的底线保障。面对Chrome、Firefox、Safari、Edge乃至IE、移动浏览器等多种运行环境,开发者与测试人员常面临: 相同DOM在不同…...
docker操作镜像-以mysql为例
Docker安装使用-CSDN博客 docker操作镜像-以mysql为例 当安装一个新的镜像时可以登录https://hub.docker.com/直接搜索想要安装的镜像,查看文档 1)拉取镜像 docker pull mysql 或者 docker pull mysql:版本号 然后直接跳到第4)步即可 2…...
【Yolo精读+实践+魔改系列】Yolov3论文超详细精讲(翻译+笔记)
前言 前面咱们已经把 YOLOv1 和 YOLOv2 的老底都给掀了,今天轮到 YOLOv3 登场,这可是 Joseph Redmon 的“封神之作”。讲真,这哥们本来是搞学术的,结果研究的模型被某些军方拿去“整点活”——不是做人是做武器的那种活。于是他一…...
【Python从入门到精通】--‘@‘符号的作用
在Python中,符号主要有三种用途:装饰器(Decorator)、矩阵乘法运算符(Python 3.5)以及类型提示中的修饰符(如typing)。 目录 1.--装饰器(Decorator) 2.--矩…...
git命令积累(个人学习)
如何将docx文件不上传? 创建或编辑 .gitignore 文件 打开 .gitignore 文件,添加以下内容来忽略所有 .docx 文件: *.docx清除已追踪的 .docx 文件 git rm --cached "*.docx"这将从 Git 仓库中删除 .docx 文件,但不会删…...
【人工智能核心技术全景解读】从机器学习到深度学习实战
目录 🌍 前言🏛️ 技术背景与价值💔 当前技术痛点🛠️ 解决方案概述👥 目标读者说明 🧠 一、技术原理剖析📊 核心概念图解💡 核心作用讲解🔧 关键技术模块说明⚖️ 技术选…...
android-ndk开发(10): use of undeclared identifier ‘pthread_getname_np‘
1. 报错描述 使用 pthread 获取线程名字, 用到 pthread_getname_np 函数。 交叉编译到 Android NDK 时链接报错 test_pthread.cpp:19:5: error: use of undeclared identifier pthread_getname_np19 | pthread_getname_np(thread_id, thread_name, sizeof(thr…...
CAP理论:分布式系统的权衡
CAP理论:分布式系统的权衡 引言一、CAP理论的核心定义二、CAP的权衡逻辑:如何选择?三、CAP的常见误区与澄清四、CAP的实际应用场景与技术实现五、现代分布式系统对CAP的突破与演进六、CAP理论的设计建议总结 引言 在分布式系统的设计与实践中…...
【软件设计师:软件工程】11.项目管理
一、项目管理内容 项目管理是通过规划、组织、协调资源,在有限时间与预算内实现特定目标的过程,核心是平衡范围、时间、成本、质量四大要素,确保项目成功交付。 1.核心内容 项目启动目标定义:明确项目范围、交付成果及成功标准。可行性分析:评估技术、经济与风险可行性…...
遗传算法求解异构车队VRPTW问题
这里写目录标题 染色体编码设计:两种染色体编码方式一、客户排列 分割点(Giant Tour Split)1. 示例编码与解码2. 采用 客户排列 分割点 设计的特点3. 编码实现(基于Python) 二、使用整体聚类局部路由(cl…...
区块链内容创作全攻略:海报、白皮书与视频的视觉化革命
区块链内容创作全攻略:海报、白皮书与视频的视觉化革命 ——2025年去中心化叙事的技术密码与商业实践 一、区块链海报设计:视觉叙事与用户心智占领 区块链海报需在3秒内抓住观众注意力,同时传递技术内核与商业价值。核心设计法则包括&#x…...
windows的rancherDesktop修改镜像源
您好!要在Windows系统上的Rancher Desktop中修改Docker镜像源(即设置registry mirror),您需要根据Rancher Desktop使用的容器运行时(containerd或dockerd)进行配置。用户提到“allowed-image”没有效果&…...
从零开始了解数据采集(二十四)——工业4.0讲解
在全球制造业加速变革的今天,“工业4.0”成为了一个炙手可热的词汇。从德国的概念提出,到我国的积极实践,这场技术与产业的深度融合正推动制造业迈向智能化、数字化的新时代。对于企业而言,这是一次不可多得的机遇,更是…...
Java复习笔记-基础
Java复习笔记 一、什么是JDK、JRE、JVM二、Keyword-关键字三、variable-变量浮点数类型-float和double字符类型-char基本数据类型变量间运算规则基本数据类型与 String 的运算和 四、逻辑运算符五、流程控制语句关于if else 和 switchfor循环while循环do while循环 六、Array-数…...
用递归实现各种排列
为了满足字典序的输出,我采用了逐位递归的方法(每一位的所能取到的最小值都大于前一位) 1,指数型排列 #include<bits/stdc.h> using ll long long int; using namespace std; int a[10];void printp(int m) {for (int h …...
基于Stable Diffusion XL模型进行文本生成图像的训练
基于Stable Diffusion XL模型进行文本生成图像的训练 flyfish export MODEL_NAME"stabilityai/stable-diffusion-xl-base-1.0" export VAE_NAME"madebyollin/sdxl-vae-fp16-fix" export DATASET_NAME"lambdalabs/naruto-blip-captions"acceler…...
SHA系列算法
SHA1系列算法 SHA(Secure Hash Algorithm,安全散列算法)是一组加密哈希算法,用于确保数据完整性和提供消息摘要功能。SHA算法由美国国家安全局(NSA)设计,并由国家标准与技术研究院(…...