【gym】给定的强化学习环境简介(二)

文章目录

    • 环境介绍
      • 一 box2d
        • bipedal_walker
        • car_dynamics
        • car_racing
        • lunar_lander
      • 二、 classic_control
        • acrobot
        • CartPole
        • continuous_mountain_car
        • mountain_car
        • pendulum
      • 三、toy_text
        • blackjack
        • cliffwalking
        • frozen
        • taxi
      • 四、mujoco
        • Ant:
        • HalfCheetah:
        • Hopper:
        • Humanoid:
        • InvertedDoublePendulum:
        • Reacher:
        • Swimmer:
        • Walker2D:

理解gym并测试gym小游戏CartPole (一)

环境介绍

环境中有4个子文件包
在这里插入图片描述

一 box2d

Box2D是一个强大的开源物理游戏引擎环境,用于模拟2D刚体物体的运动和碰撞。

bipedal_walker

在这里插入图片描述

  • 目标通常是让双足助行器学会行走,即在不跌倒的情况下前进尽可能远的距离。

  • 动作空间是连续的,通常包含四个维度的动作,分别对应助行器腿部的不同运动控制。

  • 观察空间包含助行器的当前状态信息,如身体部位的位置、速度等,这些信息被用来作为输入给强化学习算法。

  • 环境中有一个奖励机制,根据助行器的行走距离、是否跌倒等因素给予奖励或惩罚。

  • 使用Box2D物理引擎进行模拟,包括重力、摩擦力等物理因素,使得助行器的运动更加真实和复杂。

car_dynamics
  1. 汽车的动力学模型:这涉及汽车的物理特性,如质量、惯性、轮胎摩擦力等,以及这些特性如何影响汽车的加速、减速、转向等动作。

  2. 控制函数:car_dynamics中可能定义了控制汽车行为的函数,如steer(转向)、gas(油门)、brake(刹车)等。这些函数根据输入的控制信号(如方向盘角度、油门踏板位置、刹车踏板压力等)来计算汽车的下一个状态。

  3. 与环境的交互:在gym的环境中,car_dynamics负责与Box2D物理引擎进行交互,以模拟汽车的物理行为。它可能接收来自环境的输入(如赛道布局、障碍物位置等),并根据这些输入以及汽车当前的状态和控制信号来计算汽车的下一个位置和速度等。

  4. 奖励函数:虽然奖励函数本身可能不直接包含在car_dynamics中,但car_dynamics提供的汽车状态和环境信息通常用于计算奖励。奖励是强化学习中非常重要的一个概念,它用于评估智能体(在这种情况下是汽车)的行为好坏。

car_racing

CarRacing是一种在OpenAI Gym平台上开发和比较强化学习算法的模拟环境。它是流行的Box2D物理引擎的一个版本,经过修改以支持模拟汽车在赛道上行驶的物理过程。在这个环境中,智能体(agent)需要控制一辆汽车在赛道上行驶,并尽量快速地完成一圈或多圈赛道,同时避免碰撞和偏离赛道。

在CarRacing环境中,智能体通过观察当前的环境状态(如汽车的位置、速度、赛道形状等)来做出决策,并选择相应的动作(如加速、刹车、转向等)。环境会根据智能体的动作给予相应的奖励或惩罚,例如完成一圈赛道会获得奖励,而碰撞到赛道边缘或障碍物则会受到惩罚。

rl-video-episode-0

见资料:

  • 《CarRacing 车辆模型 学习》
lunar_lander

Lunar_lander环境模拟了一个火箭着陆器的着陆过程。着陆器需要在固定点(0,0)的着陆垫上安全着陆。
在这里插入图片描述

环境版本

  • 离散版本:环境具有离散的行动空间,即引擎只能全油门开启或关闭。
  • 连续版本:环境具有连续的动作空间,通常表示为Box(-1, +1, (2,), dtype=np.float32)。状态是一个8维向量,包括着陆器的x和y坐标、x和y的线速度、角度、角速度,以及代表每条腿是否与地面接触的两个布尔运算符.
    第一个动作决定了主发动机的油门,而第二个动作则指定了横向助推器的油门。

奖励:奖励机制设计用于鼓励着陆器安全、准确地着陆。

  • 从屏幕的顶部移动到着陆点并停在那里的奖励约为100~140分。
  • 如果着陆器离开了着陆台,它就会失去奖励。
  • 如果着陆器坠毁,它将获得额外的-100分。
  • 如果它稳定了(即没有移动或摇晃),它将得到额外的+100分。
  • 每一个与地面接触的腿是+10分。
  • 开启主引擎,每帧-0.3分;发射侧引擎,每帧-0.03分。

目标:着陆器的目标是尽可能准确地着陆在指定的着陆垫上,同时最小化燃料消耗(尽管在这个环境中燃料是无限的,但开启引擎会消耗分数)。
挑战:环境中的挑战包括着陆器的物理特性(如惯性、重力等)、着陆垫的大小和位置限制,以及奖励和惩罚机制的设计。

应用场景与算法

  • Lunar_lander环境常被用于测试和训练强化学习算法,如深度Q学习(Deep Q-Learning)、深度确定性策略梯度(Deep Deterministic Policy Gradient, DDPG)、软演员-评论家(Soft Actor-Critic, SAC)等。
  • 通过在这个环境中训练代理,可以学习到如何根据当前状态做出最优的决策,从而实现着陆器的安全着陆。

学习资料

  • 基于LunarLander登陆器的DQN强化学习案例(含PYTHON工程)
  • 08、基于LunarLander登陆器的DDQN强化学习(含PYTHON工程)
  • 09、基于LunarLander登陆器的Dueling DQN强化学习(含PYTHON工程)
  • 10、基于LunarLander登陆器的Dueling DDQN强化学习(含PYTHON工程)
  • 11、基于LunarLander登陆器的A2C强化学习(含PYTHON工程)
  • 13、近端策略优化Proximal Policy Optimization (PPO) 算法:从原理到实践
  • 14、强化学习Soft Actor-Critic算法:推导、理解与实战

二、 classic_control

acrobot

环境描述
Acrobot是一个由两个连杆和关节组成的机器人,这两个连杆通过转动关节相连,并且只能在一个平面内运动。初始状态下,Acrobot的连杆是下垂的,目标是通过在两个关节上施加力矩,使得Acrobot的末端(即第二个连杆的末端)能够摆动到预定的位置(通常是上方)。
状态
在Gym的Acrobot环境中,状态通常包括两个连杆的角度、角速度等物理信息,这些信息是算法进行决策的基础
动作
动作是算法在每个时间步对Acrobot施加的力矩,通常是一个连续的或离散的数值。在连续动作空间中,算法可以输出一个具体的力矩值;在离散动作空间中,算法可以选择一个预定义的力矩方向或大小。
奖励
奖励是算法在完成任务过程中获得的反馈。在Acrobot环境中,奖励通常与末端位置、速度、能耗等因素有关。例如,当末端摆动到预定位置时,算法会获得正奖励;当能耗过高或末端未能到达指定位置时,算法会获得负奖励。
目标
算法的目标是最大化总奖励。为了实现这一目标,算法需要学习如何根据当前状态选择最优的动作,使得Acrobot能够高效地摆动到预定位置。

CartPole

rl-video-episode-0

即推车-杆问题,是Barto、Sutton和Anderson在论文中提出的一个问题。它模拟了一根杆子通过一个非驱动关节连接到一辆推车上的情景。推车沿着一条无摩擦的轨道移动,而钟摆(杆子)直立在车上。目标是通过在推车上施加左右方向的力来平衡杆子,使其尽可能长时间地保持直立。

状态
在CartPole环境中,状态空间包含四个属性,分别是推车的位置(x)、速度(x_dot)、杆子的角度(theta)以及角速度(theta_dot)
每个属性都有其特定的值域范围。例如,推车的位置可以在-4.8到4.8之间,但如果推车的位置超出-2.4到2.4的范围,事件将会终止。同样,杆子的角度可以在-0.418 rad(约-24°)到0.418 rad(约24°)之间,但如果超出这个范围,事件也会终止。
动作
动作空间是离散的,只有向左和向右两个选择,通常用0和1表示

奖励-

  • 在CartPole环境中,奖励机制是鼓励智能体(agent)尽可能长时间地保持杆子直立。
  • 每一步操作(如果杆子仍然直立)都会给予智能体一个正的奖励(通常是1)。
  • 如果杆子倒下或推车超出轨道范围,则回合结束,并可能给予智能体一个负的奖励(虽然在一些版本中,回合结束并不直接对应负的奖励,但智能体显然无法再获得正的奖励)。

终止条件

  • 杆子倒下(即角度的绝对值大于某个阈值,如12°)。
  • 推车超出轨道范围(即位置的绝对值大于某个阈值,如2.4)。
  • 回合长度超过预设的最大步数(如500步,但在不同版本中可能有所不同)。
continuous_mountain_car

MountainCarContinuous环境,是一个连续动作空间的环境。在这个环境中,智能体(agent)需要控制一辆动力不足的汽车,通过左右移动和加速,将其推到山顶。与MountainCar-v0(离散动作空间)不同,MountainCarContinuous允许智能体对汽车施加连续值的力,以更精细地控制汽车的运动。

状态
在continuous_mountain_car环境中,状态(State)和观察(Observation)是相同的,都包含了汽车的位置(position)和速度(velocity)
位置通常被限制在一个一维的区间内,例如[-1.2, 0.6],而速度也被限制在一个较小的范围内,例如[-0.07, 0.07]。
动作
在连续动作空间中,智能体可以施加一个连续值的力来控制汽车。这个力可以是正数(表示向右推)或负数(表示向左推),并且有一个最大值和最小值限制。
智能体需要根据当前的状态(位置和速度)来选择最合适的力,以最大化长期的累积奖励。

奖励
在continuous_mountain_car环境中,如果汽车成功到达山顶(通常设定为一个特定的位置,如0.45或0.5),则智能体会获得一个较大的正奖励(如100)。
如果汽车未能到达山顶,则智能体会在每个时间步获得一个负的奖励,这个奖励通常与智能体施加的力的大小成反比,以鼓励智能体使用更小的力来完成任务。

学习资料

  • 强化学习之MountainCarContinuous(注册自己的gym环境) ⭐️
mountain_car

环境中包括一辆随机放置在正弦谷底部的汽车,动力不足的汽车必须爬上一维小山才能到达目标。目标是策略性地给汽车加速,使汽车到达山顶

lunar

状态
状态(或观察)通常包括汽车的位置和速度

动作
MountainCar中的动作是离散的。在离散动作版本中,可能的动作通常是向左或向右推动汽车(例如,+1或-1的力)。

奖励

  • 奖励机制设计得鼓励智能体以较少的步数达到目标。
  • 汽车到达山顶时获得正向奖励,而未能达到目标或采取过多步骤则可能获得负向奖励或没有奖励。

主要区别
Continuous_MountainCar与MountainCar类似,但主要区别在于动作是连续的。

学习资料

  • 强化学习库gym之mountain-car源码解读
  • 基于强化学习的gym Mountain Car稳定控制 ⭐️
pendulum

Pendulum环境模拟了一个摆动的杆子,目标是通过控制力矩来保持杆子的稳定,或者使其达到特定的状态(如竖直向上)。这个环境通常用于测试连续动作空间的强化学习算法,因为控制力矩是一个连续变化的量。
在这里插入图片描述

状态
包括摆杆的角度(theta)、角速度(theta_dot)等物理量。这些状态量可以通过传感器或物理模型获取,并作为强化学习算法的输入。

动作
动作空间是连续的,通常表示为对摆杆施加的力矩。这个力矩可以在一定的范围内变化,通过调整力矩的大小和方向,可以控制摆杆的运动。

奖励
Pendulum环境的奖励函数通常设计为与摆杆的状态相关。一种常见的奖励函数是:

r = − ( θ 2 + 0.1 × θ ˙ 2 + 0.001 × τ 2 ) r = − ( θ 2 + 0.1 × θ ˙ 2 + 0.001 × τ 2 ) r = − ( θ 2 + 0.1 × θ ˙ 2 + 0.001 × τ 2 ) r=−(θ2+0.1×θ˙2+0.001×τ2)r = -(\theta^2 + 0.1 \times \theta˙^2 + 0.001 \times \tau^2)r=−(θ2+0.1×θ˙2+0.001×τ2) r=(θ2+0.1×θ˙2+0.001×τ2)r=(θ2+0.1×θ˙2+0.001×τ2)r=(θ2+0.1×θ˙2+0.001×τ2)

其中, θ θ θ表示摆杆的角度, θ ˙ θ˙ θ˙表示角速度, τ τ τ表示施加的力矩。这个奖励函数鼓励智能体将摆杆保持在竖直向上的位置 ( θ = 0 ) (θ=0) θ=0,同时减小角速度和力矩的大小,以节省能量和避免不必要的动作。

无终止状态:Pendulum环境通常没有明确的终止状态,需要设置一定的时间步数或达到特定的性能标准来结束一个episode

学习资料

  • 【强化学习】Pendulum-v0环境分析
  • 强化学习gym的使用之Pendulum的训练
  • gym 环境解析:Pendulum-v0

三、toy_text

blackjack

又称21点,是一种广受欢迎的纸牌游戏。在强化学习的Blackjack环境中,智能体(agent)需要学习如何根据当前的牌面情况(包括自己的牌和对手的牌)来做出最优的决策,即是否要牌(hit)或停牌(stick),以最大化自己的赢面。
状态

  • 玩家当前手上的牌的总和(the players current sum)。

  • 庄家(dealer)展示的牌(1-10,其中1代表A)。

  • 玩家手上是否有可用的A(usable ace,0或1,因为A可以当作1或11来使用)
    动作

  • 要牌(hit=1):智能体选择继续从牌堆中抽牌。

  • 停牌(stick=0):智能体选择不再抽牌,结束当前回合
    奖励

  • 获得胜利(玩家的牌面总和大于庄家的牌面总和且不超过21点):奖励为1。

  • 平局(玩家的牌面总和与庄家的牌面总和相等或都超过21点):奖励为0。

  • 输掉比赛(玩家的牌面总和小于庄家的牌面总和或超过21点):奖励为-1。

cliffwalking

在这里插入图片描述

CliffWalking(悬崖行走)环境通常被表示为一个网格世界,其中包含以下元素:

  • 起点(S):智能体开始的位置。
  • 目标(G):智能体想要到达的位置。
  • 悬崖(C):智能体一旦掉入悬崖,会重置到起点的位置,并可能获得一个较大的负奖励。
  • 普通格子:智能体在普通格子上移动时,通常会获得一个较小的负奖励(如-1),以鼓励智能体尽快到达终点。

动作

  • 上(Up):向网格的上方移动一格(如果不在边界上)。
  • 下(Down):向网格的下方移动一格(如果不在边界上)。
  • 左(Left):向网格的左方移动一格(如果不在边界上)。
  • 右(Right):向网格的右方移动一格(如果不在边界上)。
    目标
    智能体的目标是通过学习最优策略,以尽可能少的步数从起点到达终点。然而,由于悬崖的存在,智能体需要谨慎选择动作,以避免掉入悬崖并重置到起点。这增加了问题的复杂性,并使CliffWalking成为强化学习中一个具有挑战性的任务
    奖励
  1. 到达终点:当智能体到达终点时,会获得一个较大的正奖励(如+100)。
  2. 掉入悬崖:当智能体掉入悬崖时,会重置到起点,并可能获得一个较大的负奖励(如-100)。
  3. 在普通格子上移动:智能体在普通格子上移动时,会获得一个较小的负奖励(如-1),以鼓励智能体尽快到达终点。

学习资料

  • 强化学习系列案例 | 利用Q-learning求解悬崖寻路问题
  • 强化学习开发环境搭建与入门实验——CliffWalking与CartPole ⭐️
frozen

指的是Frozen Lake或类似的冻结湖泊环境,是一个由方块(或称为格子)组成的简单游戏环境.在这个环境中,智能体(Agent)需要从起始方块移动到目标方块,同时避开危险的洞(Hole)。

状态
境的状态由智能体当前所在的方块位置决定。在Frozen Lake环境中,通常有一个4x4的方块网格,因此有16个可能的状态(每个方块代表一个状态)

动作
智能体可以执行的动作通常包括向左、向右、向上和向下移动。这些动作分别用数字(如0、1、2、3)或符号(如LEFT、RIGHT、UP、DOWN)表示。

奖励
智能体在移动到目标方块时获得奖励(通常为1),如果掉入洞中则获得惩罚(通常为0或负值,但在Frozen Lake中通常是结束当前回合并获得0奖励)。

taxi

Taxi环境通常包含四个地点(例如R、G、B、Y),每个地点用不同的字母标记,代表出租车可以到达的不同位置。状态空间是离散的,由出租车的位置、乘客的位置以及目的地共同决定。具体地,状态可以表示为一个元组(taxi_row, taxi_col, passenger_location, destination),分别代表出租车所在行、出租车所在列、乘客位置和目的地。

动作空间
Taxi环境的动作空间也是离散的,通常包含六个动作,分别是向南移动(south)、向北移动(north)、向东移动(east)、向西移动(west)、接乘客(pickup)和放乘客(drop-off)

奖励

  • 成功接送乘客:如果出租车成功地将乘客送到目的地,将获得+20分的奖励。
  • 时间步长惩罚:每经过一个时间步长,出租车将受到-1分的惩罚,以鼓励算法尽快完成任务。
  • 错误接送乘客:如果出租车在没有到达目的地的情况下将乘客放下,将受到-10分的惩罚。

环境特点与难度

  • 随机性:每次运行环境时,出租车、乘客和目的地的位置都是随机生成的,这增加了问题的复杂性和挑战性。
  • 状态空间与动作空间的维度:Taxi问题的状态空间和动作空间维度适中,既不过于简单也不过于复杂,使得它成为测试强化学习算法性能的一个理想选择。
  • 栅栏与路径限制:环境中可能存在可以穿越和不能穿越的栅栏,这进一步增加了问题的复杂性和算法需要探索的状态空间

解决方法
Taxi问题可以通过多种强化学习算法来解决,例如Q-learning、Sarsa等。这些算法通过不断尝试和学习,逐渐找到最优的接送乘客路径。在训练过程中,算法会根据奖励机制不断调整其策略,以最大化累计奖励。

四、mujoco

Ant:

这是一个模拟的多足机器人环境。
Ant环境要求代理(Agent)学习如何控制机器人的多个关节,以实现稳定的行走和移动。

HalfCheetah:

这是一个模拟的半猎豹机器人环境。
HalfCheetah环境挑战代理学习如何控制机器人的关节,以模拟猎豹般的奔跑动作。

Hopper:

这是一个模拟的单腿跳跃机器人环境。
Hopper环境要求代理学习如何控制机器人的跳跃动作,包括起跳、空中姿态调整和落地等。

Humanoid:

这是一个模拟的人类机器人环境。
Humanoid环境是最具挑战性的环境之一,要求代理学习如何控制机器人的多个关节,以实现复杂的动作,如行走、跑步和跳跃等。

InvertedDoublePendulum:

这是一个模拟的双摆倒立环境。
InvertedDoublePendulum环境要求代理学习如何控制两个相连的摆杆,使它们保持倒立状态。

Reacher:

这是一个模拟的机械臂环境。
Reacher环境要求代理学习如何控制机械臂的移动,以将末端执行器移动到目标位置。

Swimmer:

这是一个模拟的游泳机器人环境。
Swimmer环境要求代理学习如何控制机器人的多个关节,以模拟游泳动作。

Walker2D:

这是一个模拟的双足行走机器人环境。
Walker2D环境要求代理学习如何控制机器人的双足,以实现稳定的行走。

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

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

相关文章

基于支付宝百宝箱构建自己的Agent的基本简易流程(Datawhale AI冬令营)

一,使用支付宝百宝箱 官网地址:百宝箱 (alipay.com) 二,应用构建 点击左上角的新建应用 然后按自己的需求选择对应的模块 以下是我的示例 点击确认之后,进入模型设置界面 按需设计便可以,以下是我的设计 当你写好…

攻防世界 - Web - Level 1 unseping

关注这个靶场的其它相关笔记:攻防世界(XCTF) —— 靶场笔记合集-CSDN博客 0x01:Write UP 本关是一个 PHP 代码审计关卡,考察的是 PHP 反序列化漏洞以及命令执行的一些绕过手段,下面笔者将带你一步步过关。…

Java进阶学习笔记|面向对象

第一章.类和对象 1.面向对象的介绍 1.面向过程:自己的事情自己干,代表语言C语言洗衣服:每一步自己要亲力亲为 -> 找个盆,放点水,找个搓衣板,搓搓搓 2.面向对象:自己的事情别人帮忙去干,代表语言Java语言 洗衣服:自己的事情别人干 -> 全自动洗衣机3.为啥要使用面向对…

前端性能优化之大文件上传

大文件上传是前端开发中常见的需求之一,特别是在需要处理较大的Excel表格数据、高清图片、视频或其他大型文件时。优化大文件上传不仅可以提升用户体验,还能有效减轻服务器负担。本文将深入探讨大文件上传的几种常见优化技术,包括文件切片与并…

数据结构之线性表之顺序表

定义: 由n(n>0)个数据特性相同的元素构成的有限序列称为线性表 简单来说n个相同数据类型的数据组wsw合在一起的这么一个集合就是一个线性表 线性表包括顺序表和链表 1. 顺序表(我们所有的代码实现都用函数来封装&#xff09…

Matlab 和 R 语言的数组索引都是从 1 开始,并且是左闭右闭的

文章目录 一、前言二、主要内容三、小结 🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、前言 在早期的计算机科学中,数组索引从 1 开始是很常见的。例如,Fortran 和 Pascal 等编程语言也采用了从 1 开始的索引。 这种索引…

突发!!!GitLab停止为中国大陆、港澳地区提供服务,60天内需迁移账号否则将被删除

GitLab停止为中国大陆、香港和澳门地区提供服务,要求用户在60天内迁移账号,否则将被删除。这一事件即将引起广泛的关注和讨论。以下是对该事件的扩展信息: 1. 背景介绍:GitLab是一家全球知名的软件开发平台,提供代码托…

瑞吉外卖项目学习笔记(八)修改菜品信息、批量启售/停售菜品

瑞吉外卖项目学习笔记(一)准备工作、员工登录功能实现 瑞吉外卖项目学习笔记(二)Swagger、logback、表单校验和参数打印功能的实现 瑞吉外卖项目学习笔记(三)过滤器实现登录校验、添加员工、分页查询员工信息 瑞吉外卖项目学习笔记(四)TableField(fill FieldFill.INSERT)公共字…

C++小碗菜之五:关键字static

“一个人的命运啊,当然要靠自我奋斗,但也要考虑到历史的行程。” ——2009年4月23日在视察中国联合工程公司时的讲话 目录 ​编辑 前言 static在局部作用域中的作用 给出例子: 修改上面给出的例子: 为什么不使用全局变量…

开源云原生数据仓库ByConity ELT 的测试体验

ByConity 是分布式的云原生SQL数仓引擎,擅长交互式查询和即席查询,具有支持多表关联复杂查询、集群扩容无感、离线批数据和实时数据流统一汇总等特点。 ByConity 是一个云原生的、高性能的实时数据仓库,而 ELT(Extract&#xff0c…

Linux -- 线程的优点、pthread 线程库

目录 线程的优点 pthread 线程库 前言 认识线程库 简单验证线程的独立栈空间 线程的优点 与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少得多。 调度进程时,CPU 中有一个 cache(缓存,提高运行效率&#xff0…

数字IC前端学习笔记:脉动阵列的设计方法学(四)

相关阅读 数字IC前端https://blog.csdn.net/weixin_45791458/category_12173698.html?spm1001.2014.3001.5482 引言 脉动结构(也称为脉动阵列)表示一种有节奏地计算并通过系统传输数据的处理单元(PEs)网络。这些处理单元有规律地泵入泵出数据以保持规则…

观察者模式和发布-订阅模式有什么异同?它们在哪些情况下会被使用?

大家好,我是锋哥。今天分享关于【观察者模式和发布-订阅模式有什么异同?它们在哪些情况下会被使用?】面试题。希望对大家有帮助; 观察者模式和发布-订阅模式有什么异同?它们在哪些情况下会被使用? 1000道 …

【LeetCode】726、原子的数量

【LeetCode】726、原子的数量 文章目录 一、递归: 嵌套类问题1.1 递归: 嵌套类问题 二、多语言解法 一、递归: 嵌套类问题 1.1 递归: 嵌套类问题 遇到 ( 括号, 则递归计算子问题 遇到大写字母, 或遇到 ( 括号, 则清算历史, 并开始新的记录 记录由两部分组成: 大写字母开头的 …

【Select 语法全解密】.NET开源ORM框架 SqlSugar 系列

系列文章目录 🎀🎀🎀 .NET开源 ORM 框架 SqlSugar 系列 🎀🎀🎀 文章目录 系列文章目录前言一、Select 执行位置二、返回一个字段和多个字段三、单表返回DTO四、多表返回DTO4.1 手动DTO4.2 实体自动映射14.…

WebRTC服务质量(11)- Pacer机制(03) IntervalBudget

WebRTC服务质量(01)- Qos概述 WebRTC服务质量(02)- RTP协议 WebRTC服务质量(03)- RTCP协议 WebRTC服务质量(04)- 重传机制(01) RTX NACK概述 WebRTC服务质量(…

分布式协同 - 分布式事务_2PC 3PC解决方案

文章目录 导图Pre2PC(Two-Phase Commit)协议准备阶段提交阶段情况 1:只要有一个事务参与者反馈未就绪(no ready),事务协调者就会回滚事务情况 2:当所有事务参与者均反馈就绪(ready&a…

计算机图形学知识点汇总

一、计算机图形学定义与内容 1.图形 图形分为“图”和“形”两部分。 其中,“形”指形体或形状,存在于客观世界和虚拟世界,它的本质是“表示”;而图则是包含几何信息与属性信息的点、线等基本图元构成的画面,用于表达…

Nginx区分PC端和移动端访问

在使用Nginx时,可以通过$http_user_agent变量来判断用户访问的客户端类型,从而提供不同的内容或服务。下面是一个基于$http_user_agent变量来判断是否为PC访问的Nginx配置示例。 1. 理解$http_user_agent变量的含义及其在Nginx中的用途 $http_user_agen…

方法。。。

1. 方法概述 1.1 方法的概念 ​** 方法(method)是程序中最小的执行单元** 注意: 方法必须先创建才可以使用,该过程成为方法定义方法创建后并不是直接可以运行的,需要手动使用后,才执行,该过程…