蘑菇书(EasyRL)学习笔记(3)

q1、学习与规划

        学习(learning)和规划(planning)是序列决策的两个基本问题。如下图所示,在强化学习中,环境初始时是未知的,智能体不知道环境如何工作,它通过不断地与环境交互,逐渐改进策略。

学习

        在规划中,环境是已知的,智能体已经掌握了环境的所有规则和运行机制。它可以在不与环境交互的情况下,通过计算预先模拟出一个完美的模型。也就是说,智能体只需要知道当前的状态,就可以开始推演未来的变化,找到解决问题的最佳方案。 

        例如,如下图所示的游戏中,我们明确知道规则。如果选择左边,环境会发生什么变化是完全确定的。因此,智能体可以通过这些已知规则在脑海中“演练”整个决策过程,而无需实际操作或试验。

        这种方法是强化学习的一种常见思路。首先,智能体需要学习环境的运行方式,构建一个“环境模型”。然后,它利用这个模型来进行规划,模拟出一系列动作,从而找到实现目标的最优路径。简单来说,就是“先弄清规则,再靠模拟找到最优解”。

 规划

2、探索和利用

2.1、 探索和利用的含义

  • 探索:尝试不同的动作,从而了解哪些动作可能带来更高的奖励。探索的过程通常是通过“试错”来完成的。

        比如,你想找一家好餐馆,就需要去尝试新的餐馆。

  • 利用:选择已经知道可以带来高奖励的动作,而不去尝试新的动作。

        比如,你去了一家自己喜欢的餐馆,因为你知道它的菜很好吃。

2.2、 探索与利用的权衡

  • 探索帮助你发现可能更优的策略,但短期内可能收益较低。

  • 利用可以让你直接获得较高的即时奖励,但可能错过更好的策略。

举个例子:

选择餐馆:探索是尝试新的餐馆,可能会找到一家更好的,也可能踩雷;利用是直接去熟悉的餐馆,确保好吃但少了惊喜。

玩游戏:探索是尝试新策略,可能学到更强的招式;利用是重复使用熟悉的策略,但可能无法应对某些对手。

2.3、 强化学习的探索与利用问题

        强化学习中,奖励往往在多步动作之后才能观察到。为简化讨论,我们先看单步奖励的情形:
        假设有多个动作(如选择不同的餐馆),目标是通过尝试找到能带来最大奖励的动作。

2.4、 K-臂赌博机模型

如下图所示,K-臂赌博机是一种理论模型,用来研究探索与利用的平衡:

  • 有 K 个摇臂,每个摇臂对应一个奖励概率,但你并不知道哪个摇臂奖励最高。

  • 目标是通过有限的尝试次数,尽可能获得更多奖励。

在这种模型中:

  • 纯探索策略:轮流尝试每个摇臂,估计每个摇臂的奖励概率。

    • 优点:能很好地估计摇臂的奖励。

    • 缺点:浪费了很多尝试机会,无法充分利用奖励更高的摇臂。

  • 纯利用策略:总是选择当前奖励最高的摇臂。

    • 优点:能快速获得高奖励。

    • 缺点:可能错过真正最优的摇臂。

2.5、 探索与利用的矛盾

  • 探索需要花时间去“试错”,可能牺牲短期奖励。

  • 利用则专注于当前的最优选择,可能错失长期收益。

  • 在有限的尝试次数中,要想获得最大累计奖励,必须在探索和利用之间找到一个折中。

总结:探索是为了了解环境,利用是为了获得奖励。在强化学习中,如何平衡探索与利用是一个关键问题。

 3、强化学习实验

                强化学习是一个结合理论和实践的机器学习分支。要想深入学习强化学习,既需要掌握其算法背后的数学原理,也需要通过实践去实现和验证这些算法的效果。

3.1、 理论与实践相结合

  • 理论部分:理解强化学习中涉及的数学模型(如马尔可夫决策过程、动态规划)和关键算法(如 Q-learning、深度 Q 网络)。
  • 实践部分:通过实验来验证算法是否有效,这也是强化学习学习过程中的重要环节。

3.2、 实践中的工具与实现

        强化学习实践可以通过编程来实现,目前已有许多成熟的深度学习框架和工具可以辅助实现算法:

  • 常用框架

    • PyTorch:灵活、高效,适合快速迭代开发。

    • TensorFlow:功能强大,支持分布式训练,适合大型项目。

    • Keras:易用性高,适合入门。

  • 优势:这些工具封装了底层的数学运算和优化过程,开发者可以专注于算法的实现,而不需要从零开始“造轮子”。

3.3、 如何高效学习和实践

  • 选择框架:熟练掌握两三种框架即可实现大部分强化学习功能,无需全部精通。

  • 动手实践:将强化学习算法应用于不同实验环境,如 OpenAI Gym 提供的标准强化学习环境,进行算法调试和效果评估。

  • 理论验证:在实验中观察算法行为是否符合理论预期,同时改进算法以提升效果。

通过理论与实践的结合,可以更好地理解强化学习的本质,并能灵活应用到实际问题中。

3.4、Gym 的基本介绍

  • Gym 是什么:一个环境仿真库,用于测试和开发强化学习算法。

        提供多种环境,例如 Atari 游戏和机器人控制等。

        包括离散控制(如向上、向下动作)和连续控制(如机器人行走的角度调整)。

  • 版本问题:Gym 0.26.0 及之后的版本可能与旧代码不兼容,因此建议安装 0.25.2 版本:

pip install gym==0.25.2
  • 图形界面依赖:需要安装 pygame 库来显示图形界面:

pip install pygame
3.4.1、Gym 的核心功能

        以下是 Gym 的几个关键方法和属性:

  • 初始化环境

    import gym env = gym.make('CartPole-v0') # 创建一个环境 env.reset() # 重置环境,初始化状态
  • 随机选择动作

    action = env.action_space.sample() # 在动作空间中随机选择一个动作
  • 执行动作

    observation, reward, done, info = env.step(action)
  1. observation:观测到的状态(如屏幕像素值或物体位置)。
  2. reward:该动作的即时奖励。
  3. done:布尔值,表示游戏是否结束。
  4. info:额外调试信息(正式评测时不能使用)。
  • 显示界面

    env.render() # 显示当前环境的图形界面
  • 关闭环境

    env.close() # 释放资源
3.4.2、 完整代码示例

CartPole-v0 环境为例:

import gym

env = gym.make('CartPole-v0')  # 创建环境
env.reset()  # 重置环境

for _ in range(1000):  # 执行 1000 步
    env.render()  # 显示图形界面
    action = env.action_space.sample()  # 随机选择一个动作
    observation, reward, done, info = env.step(action)  # 执行动作
    print(observation)  # 输出观测到的状态

env.close()  # 关闭环境

输出示例:

Step 1: Observation = [ 0.005  0.025 -0.035  0.015]
Step 2: Observation = [ 0.005  0.045 -0.034  0.018]
...
Episode finished after 245 steps
  • 每一行是一个观测状态,CartPole 环境的状态是一个四维向量。

 

3.4.3、 环境的注册和查看

Gym 提供了许多预定义的环境,可以用以下代码查看所有已注册的环境:

# 输出可用环境 ID
from gym import envs
env_specs = envs.registry.all()
env_ids = [env_spec.id for env_spec in env_specs]
print("Available Gym Environments:")
print(env_ids)

输出示例: 

Available Gym Environments:
['CartPole-v1', 'MountainCar-v0', 'Acrobot-v1', ...]
3.4.4、环境的观测空间和动作空间
  • 观测空间:描述环境的状态信息,例如屏幕像素或物体位置。

        可以是离散的(有限取值)或连续的(无限取值)。

  • 动作空间:描述智能体可以采取的动作,例如左右移动。

        通过 env.action_space 查看动作空间类型。

        通过 env.action_space.sample() 从动作空间中随机取样。

3.4.5、 总结
  • Gym 提供了一个标准化的接口,使得我们可以快速进行强化学习算法的实验。

  • 通过 env.step() 方法可以模拟强化学习的基本流程,即 S→A→R→S′。

  • 学习如何使用 Gym 的各种环境,是强化学习实践的重要基础。

3.5、小车上山任务 (MountainCar-v0)

3.5.1、任务介绍
  • 任务目标:让小车利用左右移动的加速冲上山坡。

  • 观测空间:描述环境状态的值范围和维度。

    • 是一个长度为 2 的数组,表示小车的位置和速度。

    • 类型为 Box,即连续值。

  • 动作空间:智能体可以执行的动作集合。

    • 动作有 3 种,分别为向左加速、保持不动和向右加速。

    • 类型为 Discrete,即离散值。

3.5.2、代码实现与可视化
1. 环境初始化与空间信息打印
import gym
import numpy as np

# 创建 MountainCar 环境
env = gym.make('MountainCar-v0')

# 输出环境的基本信息
print(f"观测空间 = {env.observation_space}")  # Box 类型
print(f"动作空间 = {env.action_space}")      # Discrete 类型
print(f"观测范围 = {env.observation_space.low} ~ {env.observation_space.high}")
print(f"动作数 = {env.action_space.n}")       # 动作取值范围 {0,1,2}
2. 智能体定义 
class SimpleAgent:
    def __init__(self, env):
        pass

    def decide(self, observation):
        """基于观测值决策动作"""
        position, velocity = observation

        # 决策规则(利用经验公式)
        lb = min(-0.09 * (position + 0.25) ** 2 + 0.03,
                 0.3 * (position + 0.9) ** 4 - 0.008)
        ub = -0.07 * (position + 0.38) ** 2 + 0.07

        if lb < velocity < ub:
            action = 2  # 向右加速
        else:
            action = 0  # 向左加速
        return action

    def learn(self, *args):
        """学习功能(本例中未实现)"""
        pass
 3、智能体与环境交互
def play(env, agent, render=False, train=False):
    """让智能体与环境交互一个回合"""
    episode_reward = 0  # 初始化回合奖励
    observation = env.reset()[0]  # 重置环境(新 Gym 版本返回元组)

    # 保存轨迹用于可视化
    positions = [observation[0]]

    while True:
        if render:  # 是否显示图形界面
            env.render()

        # 智能体决策动作
        action = agent.decide(observation)

        # 执行动作,获取环境反馈
        next_observation, reward, done, truncated, _ = env.step(action)
        episode_reward += reward
        positions.append(next_observation[0])

        # 如果训练模式为 True,调用学习方法
        if train:
            agent.learn(observation, action, reward, done)

        # 回合结束条件
        if done or truncated:
            break

        observation = next_observation

    return episode_reward, positions
4. 环境交互与轨迹可视化
import matplotlib.pyplot as plt

# 创建智能体
agent = SimpleAgent(env)

# 设置随机种子
env.seed(3)

# 智能体与环境交互一个回合,并显示图形界面
episode_reward, positions = play(env, agent, render=True)
print(f"回合奖励 = {episode_reward}")

# 可视化小车位置轨迹
plt.figure(figsize=(10, 5))
plt.plot(range(len(positions)), positions, label="Car Position")
plt.axhline(env.unwrapped.goal_position, color='r', linestyle='--', label="Goal Position")
plt.xlabel("Time Steps")
plt.ylabel("Position")
plt.title("MountainCar Trajectory")
plt.legend()
plt.grid()
plt.show()

# 关闭环境
env.close()
5. 性能评估
# 测试智能体的性能,计算 100 个回合的平均奖励
episode_rewards = [play(env, agent)[0] for _ in range(100)]
print(f"平均回合奖励 = {np.mean(episode_rewards)}")
输出示例
  1. 环境信息

    观测空间 = Box([-1.2  -0.07], [0.6  0.07], (2,), float32)
    动作空间 = Discrete(3)
    观测范围 = [-1.2  -0.07] ~ [0.6  0.07]
    动作数 = 3
    
  2. 回合奖励

    回合奖励 = -105.0
    
  3. 轨迹图

    图表显示了小车在回合中的水平位置变化,红色虚线表示目标位置。

  1. 平均回合奖励

    平均回合奖励 = -106.63

总结
  1. 环境操作方法

    • env.reset():重置环境。
    • env.step(action):执行动作,获取反馈。
    • env.render():显示图形界面。
    • env.close():关闭环境。
  2. 性能评估

    • 学术界一般使用连续 100 回合的平均回合奖励作为性能指标。
    • 本例中,智能体在 MountainCar-v0 的表现接近任务解决标准(-110)。

4、关键词

4.1、基本概念

  • 强化学习(Reinforcement Learning, RL):
    智能体与复杂且不确定的环境交互,尝试使获得的奖励最大化的算法。

  • 动作(Action):
    智能体基于当前状态输出给环境的行为。

  • 状态(State):
    智能体从环境中获取的信息,用于感知当前环境。

  • 奖励(Reward):
    环境给予智能体的反馈信号,指示某个动作的价值以及奖励大小。

  • 探索(Exploration):
    尝试新的动作,可能获取更高奖励,也可能失败。

  • 利用(Exploitation):
    重复执行已知能够获得最大奖励的动作。

4.2、扩展概念

  • 深度强化学习(Deep Reinforcement Learning, DRL):
    使用神经网络拟合价值函数或策略网络,端到端学习方法,无需手动设计特征。

  • 全观测和部分观测:

    1. 全部可观测(Full Observability): 智能体的状态等价于环境状态。
    2. 完全可观测(Fully Observed): 智能体可观察到环境的所有状态。
    3. 部分可观测(Partially Observed): 智能体无法观察到环境的全部状态。
  • 部分可观测马尔可夫决策过程(Partially Observable Markov Decision Process, POMDP):
    马尔可夫决策过程的扩展,假设智能体仅能获得部分观测值,但仍满足马尔可夫性质。

4.3、动作空间

  • 动作空间(Action Space):
    环境中智能体可采取的动作集合。
    1. 离散动作空间(Discrete Action Space): 动作数量有限。
    2. 连续动作空间(Continuous Action Space): 动作数量无限或连续变化。

4.4、算法分类

  • 基于策略的(Policy-based):
    强化学习直接优化策略,制定最优动作以获得最大奖励。

  • 基于价值的(Value-based):
    通过维护价值表或价值函数,选择能使价值最大化的动作,而不显式制定策略。

4.5、模型结构

  • 有模型(Model-based):
    学习状态转移模型,用于决策。

  • 免模型(Model-free):
    不估计状态转移,直接学习价值函数或策略网络来进行决策。

5、习题

1-1 强化学习的基本结构是什么?
答:强化学习的基本结构包括智能体、环境、状态、动作和奖励。智能体通过与环境交互来学习如何做决策,从而最大化奖励。
例子: 例如,在玩棋类游戏时,智能体(棋手)在每个状态(棋盘布局)下选择一个动作(下棋),并根据对手的反应获得奖励(赢得一局或输掉一局)。

1-2 强化学习相对于监督学习为什么训练过程会更加困难?
答:强化学习的训练过程依赖于与环境的交互,奖励可能延迟且不确定,因此智能体需要通过不断尝试来探索最佳策略。而监督学习使用的是已有的标注数据,训练过程较为直接。
例子: 在强化学习中,智能体可能在多次尝试后才知道是否采取了好的动作,而监督学习则可以通过现成的标签直接进行训练。

1-3 强化学习的基本特征有哪些?
答:强化学习的基本特征包括:探索与利用的平衡、状态与动作的反馈、奖励的延迟性和不确定性、长期决策。
例子: 一个机器人学习如何在迷宫中找到出口时,它需要在“尝试新的路线”与“重复成功的路线”之间做出选择,这就是探索与利用的平衡。

1-4 近几年强化学习发展迅速的原因有哪些?
答:强化学习发展迅速的原因包括计算能力的提升、大规模数据的获取、深度学习的结合以及成功的应用实例(如AlphaGo)。
例子: AlphaGo的成功展示了强化学习在复杂决策中的应用,深度学习技术使得强化学习在大规模游戏和实际应用中得以实现。

1-5 状态和观测有什么关系?
答:状态是环境的真实描述,观测是智能体基于当前状态获取的部分信息。
例子: 在自动驾驶中,状态可能包括车辆的速度、位置和周围环境,而观测则是智能体通过摄像头或传感器得到的部分信息,比如看到的路标或行人。

1-6 一个强化学习智能体由什么组成?
答:一个强化学习智能体由感知器(获取状态或观测)、决策器(选择动作)、执行器(执行动作)和学习机制(调整策略)组成。
例子: 一个玩游戏的AI智能体,感知器是它看到的屏幕,决策器是它的算法,用来选择下一步的动作,执行器是它在屏幕上操作的动作,而学习机制则是它不断调整策略的部分。

1-7 根据强化学习智能体的不同,我们可以将其分为哪几类?
答:强化学习智能体可以分为基于策略的、基于价值的、以及基于模型的智能体。
例子: 基于策略的智能体直接学习如何选择动作(如强化学习中的策略梯度方法);基于价值的智能体通过评估每个状态的价值来做决策(如Q-learning);基于模型的智能体学习环境的模型来进行规划(如深度强化学习中的模型预测控制)。

1-8 基于策略迭代和基于价值迭代的强化学习方法有什么区别?
答:基于策略迭代通过不断优化策略来求解最优策略,而基于价值迭代通过更新每个状态的价值来求解最优策略。
例子: 在基于策略迭代中,智能体先制定一个策略,然后不断改善它;在基于价值迭代中,智能体先估计每个状态的价值,然后根据这些估值来选择动作。

1-9 有模型学习和免模型学习有什么区别?
答:有模型学习通过学习环境的转移模型来做决策,而免模型学习直接通过学习价值函数或策略来做决策,不需要估计环境转移。
例子: 有模型学习就像你预先知道天气变化规律,可以计划未来几天的行动;免模型学习则是你每次都需要根据当前天气直接做出决策,而不考虑未来的天气。

1-10 如何通俗理解强化学习?
答:强化学习是通过智能体与环境的互动,尝试不同的动作来学习如何获得最大奖励。它类似于小孩通过玩游戏、做实验不断调整自己的策略,最终获得更好的结果。
例子: 想象一个小孩在玩一个新游戏,开始时不清楚怎么玩,但随着尝试和获得反馈,他会逐步学会最有效的游戏策略。

6、 面试题

1-1 请用一句话谈一下你对于强化学习的认识?
答:强化学习是让智能体通过与环境交互、试错的方式,学习如何最大化长期奖励。
例子: 就像是小孩学会骑自行车,经过多次摔倒和尝试,逐渐掌握了骑行技巧。

1-2 强化学习、监督学习和无监督学习有什么区别?
答:强化学习通过与环境交互学习最优策略,监督学习通过标签数据学习映射关系,无监督学习通过数据中的潜在模式进行学习。
例子: 监督学习就像是老师给出题目和答案,强化学习像是小孩自己通过试错找到答案,而无监督学习像是小孩通过观察现象来自己总结规律。

1-3 强化学习的使用场景有哪些?
答:强化学习常用于需要决策和长期规划的场景,如游戏(如AlphaGo)、机器人控制、自动驾驶、推荐系统等。
例子: 在自动驾驶中,智能体(车)需要根据实时交通情况决定行驶路径,这正是强化学习的应用场景。

1-4 强化学习中所谓的损失函数与深度学习中的损失函数有什么区别?
答:强化学习中的损失函数与奖励信号相关,通过优化策略来最大化长期奖励;而深度学习中的损失函数通常是优化预测误差。
例子: 在深度学习中,我们优化的是预测误差;而在强化学习中,我们优化的是智能体的策略,使得它能够获得更多的奖励。

1-5 有模型和免模型有什么区别?
答:有模型方法通过学习环境的转移模型来预测未来状态,免模型方法则直接通过学习价值函数或策略来做决策,不依赖于环境模型。
例子: 有模型学习就像拥有一张环境的地图,可以提前规划路线;免模型学习则是每次都根据当前的情形做决定,不依赖地图。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

攻防世界-fileclude-文件包含

赛前回顾 1.题目打开后是文件包含的代码&#xff0c;如下 函数作用 highlight_file(__FILE__) //显示代码到网页 isset //检查变量是否存在并且非null(空) !empty //php内置函数&#xff0c;检查变量是否为空或未设置&#xff0c;正常变量为空会触发&#xff0c;但是有个…

Spark常问面试题---项目总结

一、数据清洗&#xff0c;你都清洗什么&#xff1f;或者说 ETL 你是怎么做的&#xff1f; 我在这个项目主要清洗的式日志数据&#xff0c;日志数据传过来的json格式 去除掉无用的字段&#xff0c;过滤掉json格式不正确的脏数据 过滤清洗掉日志中缺少关键字段的数据&#xff…

Redis 之持久化

目录 介绍 RDB RDB生成方式 自动触发 手动触发 AOF&#xff08;append-only file&#xff09; Redis 4.0 混合持久化 Redis主从工作原理 总结 介绍 Redis提供了两个持久化数据的能力&#xff0c;RDB Snapshot 和 AOF&#xff08;Append Only FIle&#xff09;…

Linux内核4.14版本——ccf时钟子系统(3)——ccf一些核心结构体

目录 1. struct clk_hw 2. struct clk_ops 3. struct clk_core 4. struct clk_notifier 5. struct clk 6. struct clk_gate 7. struct clk_divider 8. struct clk_mux 9. struct clk_fixed_factor 10. struct clk_fractional_divider 11. struct clk_multiplier 12…

【JavaEE初阶 — 网络编程】实现基于TCP协议的Echo服务

TCP流套接字编程 1. TCP &#xff06; UDP 的区别 TCP 的核心特点是面向字节流&#xff0c;读写数据的基本单位是字节 byte 2 API介绍 2.1 ServerSocket 定义 ServerSocket 是创建 TCP 服务端 Socket 的API。 构造方法 方法签名 方法说明 ServerS…

开发者如何使用GCC提升开发效率GUI操作

看此篇前请先阅读https://blog.csdn.net/qq_20330595/article/details/144139026?spm1001.2014.3001.5502 先上效果图 找到对应的环境版本 配置环境 目录结构 CtrlShiftP c_cpp_properties.json {"configurations": [{"name": "Win32","i…

高速定向广播声光预警系统赋能高速安全管控

近年来&#xff0c;高速重大交通事故屡见不鲜&#xff0c;安全管控一直是高速运营的重中之重。如何利用现代化技术和信息化手段&#xff0c;创新、智能、高效的压降交通事故的发生概率&#xff0c;优化交通安全管控质量&#xff0c;是近年来交管部门的主要工作&#xff0c;也是…

BiGRU:双向门控循环单元在序列处理中的深度探索

一、引言 在当今的人工智能领域&#xff0c;序列数据的处理是一个极为重要的任务&#xff0c;涵盖了自然语言处理、语音识别、时间序列分析等多个关键领域。循环神经网络&#xff08;RNN&#xff09;及其衍生结构在处理序列数据方面发挥了重要作用。然而&#xff0c;传统的 RN…

shell编程7,bash解释器的 for循环+while循环

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…

AI开发:生成式对抗网络入门 模型训练和图像生成 -Python 机器学习

阶段1&#xff1a;GAN是个啥&#xff1f; 生成式对抗网络&#xff08;Generative Adversarial Networks, GAN&#xff09;&#xff0c;名字听着就有点“对抗”的意思&#xff0c;没错&#xff01;它其实是两个神经网络互相斗智斗勇的游戏&#xff1a; 生成器&#xff08;Gene…

HarmonyOS开发中,如何高效定位并分析内存泄露相关问题

HarmonyOS开发中&#xff0c;如何高效定位并分析内存泄露相关问题 (1)Allocation的应用调试方式Memory泳道Native Allocation泳道 (2)Snapshot(3)ASan的应用使用约束配置参数使能ASan方式一方式二 启用ASanASan检测异常码 (4)HWASan的应用功能介绍约束条件使能HWASan方式一方式…

【Python】Selenium模拟在输入框里,一个字一个字地输入文字

我们平常在使用Selenium模拟键盘输入内容&#xff0c;常用的是用send_keys来在输入框上输入字&#xff1a; 基本的输入方式&#xff1a; input_element driver.find_element(By.ID, searchBox) input_element.send_keys("我也爱你") #给骚骚的自己发个骚话不过这种…

泷羽sec学习打卡-shell命令6

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都 与本人无关,切莫逾越法律红线,否则后果自负 关于shell的那些事儿-shell6 if条件判断for循环-1for循环-2实践是检验真理的唯一标准 if条件判断 创建…

【ArkTS】使用AVRecorder录制音频 --内附录音机开发详细代码

系列文章目录 【ArkTS】关于ForEach的第三个参数键值 【ArkTS】“一篇带你读懂ForEach和LazyForEach” 【小白拓展】 【ArkTS】“一篇带你掌握TaskPool与Worker两种多线程并发方案” 【ArkTS】 一篇带你掌握“语音转文字技术” --内附详细代码 【ArkTS】技能提高–“用户授权”…

数据分析案例-笔记本电脑价格数据可视化分析

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

系统监控——分布式链路追踪系统

摘要 本文深入探讨了分布式链路追踪系统的必要性与实施细节。随着软件架构的复杂化&#xff0c;传统的日志分析方法已不足以应对问题定位的需求。文章首先解释了链路追踪的基本概念&#xff0c;如Trace和Span&#xff0c;并讨论了其基本原理。接着&#xff0c;文章介绍了SkyWa…

游戏引擎学习第25天

Git: https://gitee.com/mrxiao_com/2d_game 今天的计划 总结和复述&#xff1a; 这段时间的工作已经接近尾声&#xff0c;虽然每次编程的时间只有一个小时&#xff0c;但每一天的进展都带来不少收获。尽管看起来似乎花费了很多时间&#xff0c;实际上这些日积月累的时间并未…

GaussDB TPOPS 搭建流程记录

目录 前言 环境准备 安装前准备 安装TPOPS 总结 前言 由于工作需要&#xff0c;准备将现有Oracle数据切换至GaussDB数据库。在这里记录一下安装GaussDB数据库过程踩的坑。 首先&#xff0c;我装的是线下版本&#xff0c;需要先装一个GaussDB轻量化管理平台&#xff08;…

Web网页设计作业成品源码分享(持续更新)

&#x1f389;Web前端大作业专栏推荐 &#x1f4da;Web前端期末大作业源码分享 ✍️html网页设计、web前后端网站制作、大学生网页设计作业、个人网站制作、jQuery网站设计、uniapp小程序、vue网站设计、node.js网站设计、网页成品模板、期末大作业&#xff0c;各种设计应有尽有…

facebook欧洲户开户条件有哪些又有何优势?

在当今数字营销时代&#xff0c;Facebook广告已成为企业推广产品和服务的重要渠道。而为了更好地利用这一平台&#xff0c;广告主们需要理解不同类型的Facebook广告账户。Facebook广告账户根据其属性可分为多种类型&#xff0c;包括个人广告账户、企业管理&#xff08;BM&#…