Q学习(Q-Learning)详解

在这里插入图片描述

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:机器学习分享专栏
✨特色专栏:国学周更-心性养成之路
🥭本文内容:Q学习(Q-Learning)详解

文章目录

    • 引言
    • 一、基本原理
      • 1. 强化学习的基本概念
      • 2. Q值的定义
      • 3. Q学习的目标
      • 4. 学习过程
      • 5. 收敛性
    • 二、数学模型
      • 1. 状态空间和动作空间
      • 2. Q值函数
      • 3. 贝尔曼方程
      • 4. Q值更新公式
      • 5. 收敛性
      • 6. 策略提取
    • 三、实现步骤
      • 1. 环境设置
      • 2. 初始化Q值表
      • 3. 选择策略
      • 4. 循环迭代
      • 5. 终止条件
      • 6. 策略提取
    • 四、应用场景
      • 1. 游戏AI
      • 2. 机器人控制
      • 3. 推荐系统
    • 结论

引言

  在人工智能的快速发展中,强化学习作为一种重要的学习范式,逐渐引起了广泛的关注。它通过与环境的交互来学习最优策略,使得智能体能够在复杂的决策问题中做出有效的选择。其中,Q学习(Q-Learning)作为一种经典的无模型强化学习算法,以其简单易懂和高效的特性,成为了研究者和工程师们的热门选择。

  Q学习的核心在于通过学习一个Q值函数来评估在特定状态下采取某个动作的价值,从而指导智能体在环境中进行决策。无论是在游戏、机器人控制,还是在金融交易和推荐系统等领域,Q学习都展现出了强大的应用潜力。

  本文将深入探讨Q学习的基本原理、数学模型、实现步骤以及其在实际中的应用场景,旨在为读者提供一个全面的理解,帮助他们在相关领域的研究和实践中更好地应用这一技术。

一、基本原理

Q学习是一种基于值的强化学习算法,旨在通过与环境的交互来学习最优策略。其基本原理可以从以下几个方面进行详细阐述:

1. 强化学习的基本概念

强化学习的核心在于智能体(Agent)、环境(Environment)、状态(State)、动作(Action)和奖励(Reward)。智能体通过在环境中采取动作来影响状态,并根据环境反馈的奖励来调整其行为。强化学习的目标是最大化智能体在与环境交互过程中获得的累积奖励。

  • 智能体:执行动作并学习的主体。
  • 环境:智能体所处的外部系统,智能体通过与环境交互来学习。
  • 状态:环境的具体情况,描述了智能体所处的情境。
  • 动作:智能体在特定状态下可以选择的行为。
  • 奖励:智能体在执行动作后从环境中获得的反馈,通常是一个数值,表示该动作的好坏。

2. Q值的定义

Q学习的核心是Q值(Action-Value Function),它表示在特定状态下采取某个动作所能获得的期望回报。Q值的定义为:

Q ( s , a ) = E [ R t ∣ S t = s , A t = a ] Q(s, a) = \mathbb{E}[R_t | S_t = s, A_t = a] Q(s,a)=E[RtSt=s,At=a]

其中:

  • Q ( s , a ) Q(s, a) Q(s,a):在状态 s s s下采取动作 a a a的Q值。
  • R t R_t Rt:在时间步 t t t获得的奖励。

Q值函数的目标是通过学习来估计在每个状态下采取每个动作的长期回报。

3. Q学习的目标

Q学习的目标是学习一个最优的Q值函数,即找到一个策略,使得在每个状态下选择的动作能够最大化未来的累积奖励。最优Q值函数通常用 Q ∗ ( s , a ) Q^*(s, a) Q(s,a)表示,满足以下贝尔曼方程:

Q ∗ ( s , a ) = E [ R t + γ max ⁡ a ′ Q ∗ ( S t + 1 , a ′ ) ∣ S t = s , A t = a ] Q^*(s, a) = \mathbb{E}[R_t + \gamma \max_{a'} Q^*(S_{t+1}, a') | S_t = s, A_t = a] Q(s,a)=E[Rt+γamaxQ(St+1,a)St=s,At=a]

其中, γ \gamma γ是折扣因子,表示未来奖励的重要性。

4. 学习过程

Q学习的学习过程主要包括以下几个步骤:

  1. 初始化Q值表:通常将所有Q值初始化为零或小的随机值。

  2. 选择动作:根据当前状态选择一个动作,通常使用ε-贪婪策略。该策略在探索和利用之间进行权衡,以确保智能体能够探索新的状态和动作。

  3. 执行动作:在环境中执行所选动作,观察结果状态和获得的奖励。

  4. 更新Q值:根据获得的奖励和下一个状态的最大Q值更新当前状态的Q值。更新公式为:

    Q ( s , a ) ← Q ( s , a ) + α ( r + γ max ⁡ a ′ Q ( s ′ , a ′ ) − Q ( s , a ) ) Q(s, a) \leftarrow Q(s, a) + \alpha \left( r + \gamma \max_{a'} Q(s', a') - Q(s, a) \right) Q(s,a)Q(s,a)+α(r+γamaxQ(s,a)Q(s,a))

    其中, α \alpha α是学习率,控制新信息对旧信息的影响程度。

  5. 迭代:重复上述步骤,直到Q值收敛或达到预设的迭代次数。

5. 收敛性

Q学习的收敛性是其重要特性之一。在满足一定条件下(如充分探索状态和动作空间),Q学习能够保证收敛到最优Q值函数。具体来说,随着学习的进行,Q值将逐渐逼近真实的Q值,从而找到最优策略。

二、数学模型

Q学习的数学模型是其核心部分,涉及到状态、动作、奖励以及Q值的定义和更新。以下将详细阐述Q学习的数学模型,包括状态空间、动作空间、Q值函数、贝尔曼方程以及Q值更新公式。

1. 状态空间和动作空间

在Q学习中,环境的状态空间和动作空间是基本构成要素:

  • 状态空间 ( S S S):表示环境中所有可能的状态的集合。每个状态 s ∈ S s \in S sS描述了环境的特定情境。
  • 动作空间 ( A A A):表示智能体在每个状态下可以选择的所有可能动作的集合。每个动作 a ∈ A a \in A aA是智能体在状态 s s s下可以采取的行为。

2. Q值函数

Q值函数是Q学习的核心,表示在特定状态下采取某个动作的期望回报。Q值函数定义为:

Q ( s , a ) = E [ R t ∣ S t = s , A t = a ] Q(s, a) = \mathbb{E}[R_t | S_t = s, A_t = a] Q(s,a)=E[RtSt=s,At=a]

其中:

  • Q ( s , a ) Q(s, a) Q(s,a):在状态 s s s下采取动作 a a a的Q值。
  • R t R_t Rt:在时间步 t t t获得的奖励。

Q值函数的目标是通过学习来估计在每个状态下采取每个动作的长期回报。

3. 贝尔曼方程

贝尔曼方程是Q学习的理论基础,描述了Q值之间的关系。对于最优Q值函数 Q ∗ ( s , a ) Q^*(s, a) Q(s,a),贝尔曼方程可以表示为:

Q ∗ ( s , a ) = E [ R t + γ max ⁡ a ′ Q ∗ ( S t + 1 , a ′ ) ∣ S t = s , A t = a ] Q^*(s, a) = \mathbb{E}[R_t + \gamma \max_{a'} Q^*(S_{t+1}, a') | S_t = s, A_t = a] Q(s,a)=E[Rt+γamaxQ(St+1,a)St=s,At=a]

其中:

  • R t R_t Rt:在状态 s s s下采取动作 a a a后获得的即时奖励。
  • γ \gamma γ:折扣因子,表示未来奖励的重要性,取值范围为 [ 0 , 1 ] [0, 1] [0,1]
  • S t + 1 S_{t+1} St+1:执行动作 a a a后转移到的新状态。
  • max ⁡ a ′ Q ∗ ( S t + 1 , a ′ ) \max_{a'} Q^*(S_{t+1}, a') maxaQ(St+1,a):在新状态 S t + 1 S_{t+1} St+1下所有可能动作的最大Q值。

贝尔曼方程表明,当前状态下采取某个动作的Q值等于即时奖励加上未来状态的最大Q值的折扣期望。

4. Q值更新公式

Q学习的关键在于如何更新Q值。Q值的更新公式为:

Q ( s , a ) ← Q ( s , a ) + α ( r + γ max ⁡ a ′ Q ( s ′ , a ′ ) − Q ( s , a ) ) Q(s, a) \leftarrow Q(s, a) + \alpha \left( r + \gamma \max_{a'} Q(s', a') - Q(s, a) \right) Q(s,a)Q(s,a)+α(r+γamaxQ(s,a)Q(s,a))

其中:

  • Q ( s , a ) Q(s, a) Q(s,a):在状态 s s s下采取动作 a a a的当前Q值。
  • α \alpha α:学习率,控制新信息对旧信息的影响程度,取值范围为 [ 0 , 1 ] [0, 1] [0,1]
  • r r r:在状态 s s s下采取动作 a a a后获得的即时奖励。
  • γ \gamma γ:折扣因子,表示未来奖励的重要性,取值范围为 [ 0 , 1 ] [0, 1] [0,1]
  • s ′ s' s:执行动作 a a a后转移到的新状态。
  • max ⁡ a ′ Q ( s ′ , a ′ ) \max_{a'} Q(s', a') maxaQ(s,a):在新状态 s ′ s' s下所有可能动作的最大Q值。

更新公式的含义是:当前Q值通过加上一个修正项来更新,修正项由即时奖励和未来最大Q值的折扣期望组成。学习率 α \alpha α决定了新信息对旧信息的影响程度。

5. 收敛性

Q学习的收敛性是其重要特性之一。在满足一定条件下(如充分探索状态和动作空间),Q学习能够保证收敛到最优Q值函数。具体来说,随着学习的进行,Q值将逐渐逼近真实的Q值,从而找到最优策略。

根据强化学习的理论,Q学习的收敛性可以通过以下条件来保证:

  • 每个状态-动作对 ( s , a ) (s, a) (s,a)在学习过程中被充分探索。
  • 学习率 α \alpha α满足条件: ∑ t = 1 ∞ α t = ∞ \sum_{t=1}^{\infty} \alpha_t = \infty t=1αt= ∑ t = 1 ∞ α t 2 < ∞ \sum_{t=1}^{\infty} \alpha_t^2 < \infty t=1αt2<

6. 策略提取

一旦Q值收敛,最优策略可以通过选择在每个状态下具有最大Q值的动作来提取。最优策略 π ∗ \pi^* π可以表示为:

π ∗ ( s ) = arg ⁡ max ⁡ a Q ∗ ( s , a ) \pi^*(s) = \arg\max_{a} Q^*(s, a) π(s)=argamaxQ(s,a)

这意味着在每个状态 s s s下,智能体将选择Q值最大的动作,从而实现最优决策。

三、实现步骤

Q学习的实现步骤可以分为多个阶段,从环境的设置到Q值的更新,整个过程相对系统化。以下将详细阐述Q学习的实现步骤。

1. 环境设置

在开始实现Q学习之前,首先需要定义环境。这包括状态空间、动作空间和奖励机制。

  • 状态空间 ( S S S):定义环境中所有可能的状态。状态可以是离散的(如棋盘上的位置)或连续的(如机器人的位置和速度)。
  • 动作空间 ( A A A):定义智能体在每个状态下可以选择的所有可能动作。动作可以是离散的(如上下左右移动)或连续的(如调整速度)。
  • 奖励机制:设计奖励函数,定义智能体在执行特定动作后获得的反馈。奖励可以是正值(表示好的行为)、负值(表示不好的行为)或零(表示中立的行为)。

2. 初始化Q值表

在Q学习中,Q值表用于存储每个状态-动作对的Q值。初始化Q值表的步骤如下:

  • 创建一个二维数组或字典,行表示状态,列表示动作。
  • 将所有Q值初始化为零或小的随机值。通常,初始化为零是一个常见的选择。
import numpy as npnum_states = 5  # 状态数量
num_actions = 2  # 动作数量
Q = np.zeros((num_states, num_actions))  # 初始化Q值表

3. 选择策略

在Q学习中,选择策略决定了智能体在每个状态下如何选择动作。常用的策略是ε-贪婪策略,该策略在探索和利用之间进行权衡:

  • 探索:以概率ε选择一个随机动作,以便探索新的状态。
  • 利用:以概率1-ε选择当前Q值最高的动作,以便利用已有的知识。
def choose_action(state, epsilon):if np.random.rand() < epsilon:return np.random.randint(num_actions)  # 随机选择动作else:return np.argmax(Q[state])  # 选择最大Q值的动作

4. 循环迭代

Q学习的核心在于通过多次迭代来更新Q值。每次迭代的步骤如下:

  1. 初始化状态:随机选择一个初始状态。
  2. 选择动作:根据当前状态和选择策略选择一个动作。
  3. 执行动作:在环境中执行所选动作,观察结果状态和获得的奖励。
  4. 更新Q值:根据获得的奖励和下一个状态的最大Q值更新当前状态的Q值。
  5. 更新状态:将当前状态更新为新状态。
  6. 终止条件:检查是否满足终止条件,如达到最大迭代次数或Q值收敛。

以下是一个完整的迭代过程示例:

num_episodes = 1000  # 训练轮数
alpha = 0.1  # 学习率
gamma = 0.9  # 折扣因子
epsilon = 0.1  # 探索率for episode in range(num_episodes):state = np.random.randint(num_states)  # 随机初始状态done = Falsewhile not done:action = choose_action(state, epsilon)  # 选择动作new_state, reward, done = environment.step(state, action)  # 执行动作并观察结果# 更新Q值Q[state, action] += alpha * (reward + gamma * np.max(Q[new_state]) - Q[state, action])state = new_state  # 更新状态

5. 终止条件

在实现Q学习时,需要设定终止条件,以决定何时停止训练。常见的终止条件包括:

  • 达到最大迭代次数:设定一个固定的训练轮数,如1000轮。
  • Q值收敛:当Q值的变化小于某个阈值时,认为Q值已经收敛,可以停止训练。

6. 策略提取

一旦Q值收敛,可以从Q值表中提取最优策略。最优策略是指在每个状态下选择Q值最大的动作:

def extract_policy(Q):return np.argmax(Q, axis=1)  # 返回每个状态下的最优动作

四、应用场景

Q学习作为一种强大的强化学习算法,广泛应用于多个领域。以下将结合具体代码详细阐述几个典型的应用场景,包括游戏AI、机器人控制和推荐系统。

1. 游戏AI

在游戏中,Q学习可以用于训练智能体,使其能够在复杂的游戏环境中学习最优策略。以下是一个简单的“迷宫”游戏的示例,智能体需要找到从起点到终点的最短路径。

import numpy as np
import random# 定义环境
class MazeEnvironment:def __init__(self):self.state_space = 5  # 状态数量self.action_space = 4  # 动作数量(上、下、左、右)self.state = 0  # 初始状态self.goal_state = 4  # 目标状态def step(self, action):# 定义状态转移和奖励机制if action == 0:  # 上self.state = max(0, self.state - 1)elif action == 1:  # 下self.state = min(self.state_space - 1, self.state + 1)elif action == 2:  # 左self.state = max(0, self.state - 1)elif action == 3:  # 右self.state = min(self.state_space - 1, self.state + 1)# 奖励机制if self.state == self.goal_state:return self.state, 1, True  # 到达目标,获得奖励1else:return self.state, -0.1, False  # 未到达目标,获得小的惩罚# Q学习算法
def q_learning_maze(episodes):env = MazeEnvironment()Q = np.zeros((env.state_space, env.action_space))  # 初始化Q值表alpha = 0.1  # 学习率gamma = 0.9  # 折扣因子epsilon = 0.1  # 探索率for episode in range(episodes):state = random.randint(0, env.state_space - 1)  # 随机初始状态done = Falsewhile not done:# ε-贪婪策略选择动作if random.uniform(0, 1) < epsilon:action = random.randint(0, env.action_space - 1)  # 随机选择else:action = np.argmax(Q[state])  # 选择最大Q值的动作new_state, reward, done = env.step(action)  # 执行动作并观察结果# 更新Q值Q[state, action] += alpha * (reward + gamma * np.max(Q[new_state]) - Q[state, action])state = new_state  # 更新状态return Q# 训练智能体
Q_values = q_learning_maze(1000)
print("Q值表:")
print(Q_values)

2. 机器人控制

在机器人控制中,Q学习可以帮助机器人在动态环境中学习如何执行任务。例如,训练一个机器人在一个简单的网格环境中移动到目标位置。

class RobotEnvironment:def __init__(self):self.state_space = 16  # 4x4网格self.action_space = 4  # 动作数量(上、下、左、右)self.state = 0  # 初始状态self.goal_state = 15  # 目标状态def step(self, action):# 定义状态转移row, col = divmod(self.state, 4)if action == 0 and row > 0:  # 上row -= 1elif action == 1 and row < 3:  # 下row += 1elif action == 2 and col > 0:  # 左col -= 1elif action == 3 and col < 3:  # 右col += 1self.state = row * 4 + col# 奖励机制if self.state == self.goal_state:return self.state, 1, True  # 到达目标,获得奖励1else:return self.state, -0.1, False  # 未到达目标,获得小的惩罚# Q学习算法
def q_learning_robot(episodes):env = RobotEnvironment()Q = np.zeros((env.state_space, env.action_space))  # 初始化Q值表alpha = 0.1  # 学习率gamma = 0.9  # 折扣因子epsilon = 0.1  # 探索率for episode in range(episodes):state = random.randint(0, env.state_space - 1)  # 随机初始状态done = Falsewhile not done:# ε-贪婪策略选择动作if random.uniform(0, 1) < epsilon:action = random.randint(0, env.action_space - 1)  # 随机选择else:action = np.argmax(Q[state])  # 选择最大Q值的动作new_state, reward, done = env.step(action)  # 执行动作并观察结果# 更新Q值Q[state, action] += alpha * (reward + gamma * np.max(Q[new_state]) - Q[state, action])state = new_state  # 更新状态return Q# 训练机器人
Q_values_robot = q_learning_robot(1000)
print("机器人Q值表:")
print(Q_values_robot)

3. 推荐系统

在推荐系统中,Q学习可以用于优化用户的推荐策略。通过将用户的行为视为状态,Q学习可以帮助系统学习如何为用户推荐最合适的内容。

class RecommendationEnvironment:def __init__(self, num_users, num_items):self.num_users = num_usersself.num_items = num_itemsself.state = 0  # 当前用户self.action_space = num_items  # 动作数量(推荐的物品)def step(self, action):# 模拟用户对推荐物品的反馈reward = np.random.choice([0, 1], p=[0.5, 0.5])  # 随机反馈self.state = (self.state + 1) % self.num_users  # 切换到下一个用户return self.state, reward, self.state == 0  # 返回新状态、奖励和是否结束# Q学习算法
def q_learning_recommendation(episodes, num_users, num_items):env = RecommendationEnvironment(num_users, num_items)Q = np.zeros((num_users, num_items))  # 初始化Q值表alpha = 0.1  # 学习率gamma = 0.9  # 折扣因子epsilon = 0.1  # 探索率for episode in range(episodes):state = 0  # 从第一个用户开始done = Falsewhile not done:# ε-贪婪策略选择动作if random.uniform(0, 1) < epsilon:action = random.randint(0, env.action_space - 1)  # 随机选择else:action = np.argmax(Q[state])  # 选择最大Q值的动作new_state, reward, done = env.step(action)  # 执行动作并观察结果# 更新Q值Q[state, action] += alpha * (reward + gamma * np.max(Q[new_state]) - Q[state, action])state = new_state  # 更新状态return Q# 训练推荐系统
Q_values_recommendation = q_learning_recommendation(1000, 5, 10)
print("推荐系统Q值表:")
print(Q_values_recommendation)

结论

  Q学习作为一种经典的强化学习算法,以其简单而有效的学习机制在多个领域展现出了强大的应用潜力。从游戏AI到机器人控制,再到推荐系统,Q学习通过与环境的交互不断优化决策策略,帮助智能体在复杂的情境中做出最佳选择。本文详细阐述了Q学习的基本原理、数学模型、实现步骤以及具体应用场景,旨在为读者提供一个全面的理解。

  随着技术的不断进步,Q学习的应用范围将进一步扩大,尤其是在智能系统和自动化领域。未来,结合深度学习等先进技术,Q学习有望在更复杂的环境中实现更高效的学习和决策。希望本文能够激发读者对Q学习的兴趣,并为其在实际项目中的应用提供有价值的参考。


  码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识点击关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

在这里插入图片描述

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

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

相关文章

树状数组详解

概述 树状数组&#xff08;Binary Indexed Tree&#xff0c;简称BIT&#xff09;&#xff0c;是一种数据结构&#xff0c;用于处理区间查询和更新问题。它是一种可以高效地在对数级别时间复杂度内进行单点更新和区间查询的数据结构。树状数组通常用于解决以下两类问题&#xf…

freeswitch(开启支持MCU视频会议,使用mod_av模块)

亲测版本centos 7.9系统–》 freeswitch1.10.9 本人freeswitch安装路径(根据自己的路径进入) /usr/local/freeswitch/etc/freeswitch场景说明: 有些场景想使用视频会议MCU融合画面进行开会使用方法: 第一步:下载插件 yum install -y epel-release yum install

【大数据技术基础】【记录Ubuntu 16.04升级到18.04】Ubuntu的一个版本升级到另一个版本

在 Ubuntu 操作系统中进行软件更新和系统升级 Ubuntu Kylin 16.04 LTS 系统进行系统升级到 Ubuntu 18.04.6 LTS 版本 升级提示&#xff1a;系统弹出提示框&#xff0c;告知用户有新版本的 Ubuntu 可用&#xff0c;询问用户是否想要升级。 认证窗口&#xff1a;显示了一个认证…

这是一个vue3 + scss的数字滚动效果

介绍: 当数字变化时&#xff0c;只改变变化的数字位&#xff0c;其余的不变&#xff0c;可以递增、递减、骤变、负数也可以&#xff0c;但是样式要根据具体的项目需求去改&#xff1b; 效果1、增加数字&#xff1a; 效果2、减少数字&#xff1a; 使用方法&#xff1a; <te…

TortoiseGit的下载、安装和配置

一、TortoiseGit的简介 tortoiseGit是一个开放的git版本控制系统的源客户端&#xff0c;支持Winxp/vista/win7.该软件功能和git一样 不同的是&#xff1a;git是命令行操作模式&#xff0c;tortoiseGit界面化操作模式&#xff0c;不用记git相关命令就可以直接操作&#xff0c;读…

最新版Chrome浏览器加载ActiveX控件之Adobe PDF阅读器控件

背景 Adobe PDF阅读器控件是一个ActiveX控件&#xff0c;用于在Windows平台上显示和操作PDF文件。它提供了一系列方法和属性&#xff0c;可以实现对PDF文件的加载、显示、搜索、打印、保存等操作。 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件…

源码分析之Openlayers中的控件篇Control基类介绍

概述 Openlayers 中内置了9类控件&#xff0c;这9类控件都是基于Control类&#xff0c;而Control类则是继承于BaseObject类&#xff0c;如下图所示&#xff1a; 如上&#xff0c;这9类控件分别是&#xff1a; Attribution&#xff1a;属性控件FullScreen:全屏控件MousePositi…

第P2周:Pytorch实现CIFAR10彩色图片识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标 实现CIFAR-10的彩色图片识别实现比P1周更复杂一点的CNN网络 具体实现 &#xff08;一&#xff09;环境 语言环境&#xff1a;Python 3.10 编 译 器: …

2024年食堂采购系统源码技术趋势:如何开发智能的供应链管理APP

本篇文章&#xff0c;小编将与大家一同探讨2024年食堂采购系统的技术趋势&#xff0c;并提供开发更智能的供应链管理APP的策略。 一、2024年食堂采购系统的技术趋势 1.人工智能与机器学习的深度应用 在2024年&#xff0c;AI和机器学习在食堂采购系统中的应用将更加普遍。这些…

系统架构的演变

什么是系统架构&#xff1f; 系统架构是系统的一种整体的高层次的结构表示&#xff0c;它确定了系统的基本组织、组件之间的关系、组件与环境的关系&#xff0c;以及指导其设计和发展的原则。随着技术的发展和业务需求的增长&#xff0c;系统架构经历了从简单到复杂、从集中到…

【从零开始入门unity游戏开发之——C#篇04】栈(Stack)和堆(Heap),值类型和引用类型,以及特殊的引用类型string

文章目录 知识回顾一、栈&#xff08;Stack&#xff09;和堆&#xff08;Heap&#xff09;1、什么是栈和堆2、为什么要分栈和堆3、栈和堆的区别栈堆 4、总结 二、值类型和引用类型1、那么值类型和引用类型到底有什么区别呢&#xff1f;值类型引用类型 2、总结 三、特殊的引用类…

【C语言实现:用队列模拟栈与用栈模拟队列(LeetCode 225 232)】

LeetCode刷题记录 &#x1f310; 我的博客主页&#xff1a;iiiiiankor&#x1f3af; 如果你觉得我的内容对你有帮助&#xff0c;不妨点个赞&#x1f44d;、留个评论✍&#xff0c;或者收藏⭐&#xff0c;让我们一起进步&#xff01;&#x1f4dd; 专栏系列&#xff1a;LeetCode…

java jar包加密 jar-protect

介绍 java 本身是开放性极强的语言,代码也容易被反编译,没有语言层面的一些常规保护机制,jar包很容易被反编译和破解。 受classfinal&#xff08;已停止维护&#xff09;设计启发,针对springboot日常项目开发,重新编写安全可靠的jar包加壳加密技术,用于保护软件版权。 使用说…

Linux:Git

Git常见指令&#xff1a; git help xx_command git xx_command --help git --version 查看git版本git config --global user.name "xxx_name" 全局级别的签名设置&#xff0c;全局的放在本用 git config --global user.ema…

【WiFi】WiFi中RSSI、SNR、NF之间关系及说明

RSSI&#xff08;接收信号强度指示&#xff09; 定义&#xff1a; RSSI 是一个相对值&#xff0c;用于表示接收到的无线信号的强度。它通常由无线设备的硬件&#xff08;如无线网卡或无线芯片&#xff09;直接提供。 计算&#xff1a; RSSI 的计算通常是由设备的无线芯片完成的…

[ZMQ] -- ZMQ通信Protobuf数据结构 1

1、前言背景 工作需要域间实现zmq通信&#xff0c;刚开始需要比较简单的数据结构&#xff0c;比如两个bool&#xff0c;后面可能就需要传输比较大的数据&#xff0c;所以记录下实现流程&#xff0c;至于为啥选择proto数据结构去做大数据传输&#xff0c;可能是地平线也用这个&…

顺序表的使用,对数据的增删改查

主函数&#xff1a; 3.c #include "3.h"//头文件调用 SqlListptr sql_cerate()//创建顺序表函数 {SqlListptr ptr(SqlListptr)malloc(sizeof(SqlList));//在堆区申请连续的空间if(NULLptr){printf("创建失败\n");return NULL;//如果没有申请成功&#xff…

5G中的随机接入过程可以不用收RAR?

有朋友提到了一种不用接收RAR的RA过程&#xff0c;问这个是怎么回事。其实在刚刚写过的LTM cell switch篇章中就有提到&#xff0c;这里把所有相关的内容整理如下。 在RACH-less LTM场景&#xff0c;在进行LTM cell switch之前就要先知道target cell的TA信息&#xff0c;进而才…

git 导出某段时间修改的文件 windows

第一步&#xff1a;列出两次commitID之间的文件变动 git diff oldid newid --name-only// 例如 git diff 4a886c57a8b5611a2abcfcd120461c2e92f7029a HEAD --name-only 4a886c57a8b5611a2abcfcd120461c2e92f7029a 代表之前 HEAD 代表最新或者换成某次commitID 例如&#xf…

Qt 联合Halcon配置

文章目录 配置代码窗口绑定 配置 选择添加库 选择外部库 LIBS -LC:/Program Files/MVTec/HALCON-17.12-Progress/lib/x64-win64/ LIBS -lhalconcpp\-lhdevenginecpp\-lhalconINCLUDEPATH C:/Program Files/MVTec/HALCON-17.12-Progress/include DEPENDPATH C:/Program Fil…