强化学习工具箱(Matlab)

1、Get Started

1.1、MDP环境下训练强化学习智能体

MDP环境如下图在这里插入图片描述

  1. 每个圆圈代表一个状态
  2. 每个状态都有上或下的选择
  3. 智能体从状态 1 开始
  4. 智能体接收的奖励值为图中状态转移的值
  5. 训练目标是最大化累计奖励

(1)创建 MDP 环境

创建一个具有 8 个状态和 2 个动作( " up " 和 " down " )的MDP模型。

MDP = createMDP(8,["up";"down"]);

要对上图中状态转换进行建模,需修改 MDP 的状态转换矩阵和奖励矩阵。默认情况下,这些矩阵均为零。有关创建 MDP 模型和 MDP 对象属性的更多信息,请参见 createMDP 。

修改 MDP 的状态转换和奖励矩阵,例如,在以下命令中:

  1. 前两行指定了通过执行动作 1( " up " )从状态 1 到状态 2 的转移,以及此转移对应的奖励 +3
  2. 接下来的两行指定了通过执行操作2( " down " )从状态 1 到状态 3 的转移,以及此转移对应的奖励 +1
MDP.T(1,2,1) = 1;
MDP.R(1,2,1) = 3;
MDP.T(1,3,2) = 1;
MDP.R(1,3,2) = 1;

同理,指定图中其余的状态转移和对应奖励。

% State 2 transition and reward
MDP.T(2,4,1) = 1;
MDP.R(2,4,1) = 2;
MDP.T(2,5,2) = 1;
MDP.R(2,5,2) = 1;
% State 3 transition and reward
MDP.T(3,5,1) = 1;
MDP.R(3,5,1) = 2;
MDP.T(3,6,2) = 1;
MDP.R(3,6,2) = 4;
% State 4 transition and reward
MDP.T(4,7,1) = 1;
MDP.R(4,7,1) = 3;
MDP.T(4,8,2) = 1;
MDP.R(4,8,2) = 2;
% State 5 transition and reward
MDP.T(5,7,1) = 1;
MDP.R(5,7,1) = 1;
MDP.T(5,8,2) = 1;
MDP.R(5,8,2) = 9;
% State 6 transition and reward
MDP.T(6,7,1) = 1;
MDP.R(6,7,1) = 5;
MDP.T(6,8,2) = 1;
MDP.R(6,8,2) = 1;
% State 7 transition and reward
MDP.T(7,7,1) = 1;
MDP.R(7,7,1) = 0;
MDP.T(7,7,2) = 1;
MDP.R(7,7,2) = 0;
% State 8 transition and reward
MDP.T(8,8,1) = 1;
MDP.R(8,8,1) = 0;
MDP.T(8,8,2) = 1;
MDP.R(8,8,2) = 0;

指定状态 7 和状态 8 为 MDP 的终端状态。

MDP.TerminalStates = ["s7";"s8"];

创建强化学习 MDP 环境。

env = rlMDPEnv(MDP);

通过重置函数指定环境的初始状态始终为状态 1,该函数在每次训练或模拟开始时调用。创建一个匿名函数句柄,将初始状态设置为 1。

env.ResetFcn = @() 1;

设置随机数种子。

rng(0)

(2) 创建 Q-Learning 智能体

首先使用 MDP 环境中的观察和动作创建 Q table,将学习率设置为1。

obsInfo = getObservationInfo(env);
actInfo = getActionInfo(env);
qTable = rlTable(obsInfo, actInfo);
qFunction = rlQValueFunction(qTable, obsInfo, actInfo);
qOptions = rlOptimizerOptions(LearnRate=1);

然后使用 Q table 创建一个 Q-learning 智能体,遵循 ϵ \epsilon ϵ-贪婪策略。有关创建 Q-learning 智能体的更多信息,请参阅 rlQAgent 和 rlQAgentOptions 。

agentOpts = rlQAgentOptions;
agentOpts.DiscountFactor = 1;
agentOpts.EpsilonGreedyExploration.Epsilon = 0.9;
agentOpts.EpsilonGreedyExploration.EpsilonDecay = 0.01;
agentOpts.CriticOptimizerOptions = qOptions;
qAgent = rlQAgent(qFunction,agentOpts); %#ok<NASGU> 

(3)训练 Q-Learning 智能体

训练智能体首先需要指定训练选项。对于此示例,使用以下选项:

  1. 最多训练 500 回合,每回合最多持续 50 个时间步长
  2. 当智能体在连续 30 回合内的平均累积奖励 >10,停止训练

更多信息请参见 rlTrainingOptions 。

trainOpts = rlTrainingOptions;
trainOpts.MaxStepsPerEpisode = 50;
trainOpts.MaxEpisodes = 500;
trainOpts.StopTrainingCriteria = "AverageReward";
trainOpts.StopTrainingValue = 13;
trainOpts.ScoreAveragingWindowLength = 30;

使用函数 Train 训练智能体,大该需要几分钟完成。为了节省时间,可以通过将 doTraining 设置为 false 来加载预训练的智能体。若要自己训练智能体,将 doTraining 设置为 true 。

doTraining = false;

if doTraining
    % Train the agent.
    trainingStats = train(qAgent,env,trainOpts); %#ok<UNRCH> 
else
    % Load pretrained agent for the example.
    load("genericMDPQAgent.mat","qAgent"); 
end

在这里插入图片描述

(4)验证 Q-Learning 结果

为了验证训练结果,使用函数 sim 在 MDP 环境中模拟智能体。智能体成功地找到了最佳路径,并获得了 13 的累积奖励。

Data = sim(qAgent,env);
cumulativeReward = sum(Data.Reward)

==> cumulativeReward = 13

由于折扣系数设置为 1,因此经过训练的智能体的 Q table 中的值即真实的回报。

QTable = getLearnableParameters(getCritic(qAgent));
QTable{1}

==> ans = 8x2 single matrix

   12.9912   11.6621
    8.2141    9.9950
   10.8645    4.0414
    4.8017   -1.6150
    5.1975    8.9975
    5.8058   -0.2353
         0         0
         0         0
TrueTableValues = [13,12;5,10;11,9;3,2;1,9;5,1;0,0;0,0]
==> TrueTableValues = 8×2

    13    12
     5    10
    11     9
     3     2
     1     9
     5     1
     0     0
     0     0

1.2、在网格世界中训练智能体(Q-learning 和 SARSA)

网格世界描述如下:

  1. 网格世界大小为 5 × 5 5\times5 5×5,有四个可能的动作(North=1,South=2,East=3,West=4)
  2. 智能体从网格(2,1)出发
  3. 如果智能体到达网格(5,5),则它将获得奖励 10
  4. 网格世界中包含从网格(2,4)到网格(4,4)的跳跃,奖励为 5
  5. 智能体会被障碍物(黑色网格区域)阻挡
  6. 所有其他动作将获得奖励 -1
    在这里插入图片描述

(1)创建网格世界环境

env = rlPredefinedEnv("BasicGridWorld");

通过创建一个充值函数来指定智能体的初始状态始终为 [ 2 , 1 ] [2,1] [2,1],该函数在每次训练和模拟开始调用。

从位置[1,1]开始对状态进行编号。状态编号随着您向下移动第一列,然后向下移动后续每一列而增加。因此,创建一个匿名函数句柄,将初始状态设置为2。

固定随机数种子

rng(0)

(2)创建 Q-Learning 智能体

首先创建 Q table,然后将学习率设置为1。

qTable = rlTable(getObservationInfo(env),getActionInfo(env));
qRepresentation = rlQValueRepresentation(qTable,getObservationInfo(env),getActionInfo(env));
qRepresentation.Options.LearnRate = 1;

接下来,使用 Q-table 创建 Q-learning 智能体,并设定 ϵ \epsilon ϵ-贪婪策略。更多信息请参见 rlQAgent 和 rlQAgentOptions。

agentOpts = rlQAgentOptions;
agentOpts.EpsilonGreedyExploration.Epsilon = .04;
qAgent = rlQAgent(qRepresentation,agentOpts);

(3)训练 Q-Learning 智能体

指定以下训练选项:

  • 最多训练 200 回合,每个回合最多持续 50 个时间步长
  • 当智能体连续 20 回合平均累计奖励 >10 时,停止训练

更多的信息请参见 rlTrainingOptions

trainOpts = rlTrainingOptions;
trainOpts.MaxStepsPerEpisode = 50;
trainOpts.MaxEpisodes= 200;
trainOpts.StopTrainingCriteria = "AverageReward";
trainOpts.StopTrainingValue = 11;
trainOpts.ScoreAveragingWindowLength = 30;

使用函数 Train 来训练 Q-learning 智能体,训练可能需要几分钟才能完成。

为了在运行此示例时节省时间,可以将 doTraining 设置为 false 来加载预训练的智能体。若要自己训练智能体,可以将 doTraining 设置为 true 。

doTraining = false;

if doTraining
    % Train the agent.
    trainingStats = train(qAgent,env,trainOpts);
else
    % Load the pretrained agent for the example.
    load('basicGWQAgent.mat','qAgent')
end

回合管理器窗口打开并显示训练进度。
在这里插入图片描述

(4)验证 Q-Learning 结果

plot(env)
env.Model.Viewer.ShowTrace = true;
env.Model.Viewer.clearTrace;

使用函数 sim 模拟环境中的智能体。

sim(qAgent,env)

在这里插入图片描述

(5)创建和训练 SARSA 智能体

使用与 Q-learning 智能体相同的 Q table 和 ϵ \epsilon ϵ-贪婪策略。更多信息请参见 rlSARSAAgent 和 rlSARSAAgentOptions

agentOpts = rlSARSAAgentOptions;
agentOpts.EpsilonGreedyExploration.Epsilon = 0.04;
sarsaAgent = rlSARSAAgent(qRepresentation,agentOpts);

使用函数 Train 训练 SARSA 智能体,训练可能需要几分钟才能完成。

为了在运行此示例时节省时间,可以将 doTraining 设置为 false 来加载预训练的智能体。若要自己训练智能体,可以将 doTraining 设置为 true 。

doTraining = false;

if doTraining
    % Train the agent.
    trainingStats = train(sarsaAgent,env,trainOpts);
else
    % Load the pretrained agent for the example.
    load('basicGWSarsaAgent.mat','sarsaAgent')
end

在这里插入图片描述

(6)验证 SARSA 结果

plot(env)
env.Model.Viewer.ShowTrace = true;
env.Model.Viewer.clearTrace;

在环境中对智能体进行仿真。

sim(sarsaAgent,env)

在这里插入图片描述

SARSA 智能体找到与 Q-learning 智能体相同的解决方案。

1.3、创建 Simulink 环境并训练智能体

这个例子展示了如何将水箱 Simulink 模型中的 PI 控制器转换为强化学习深度确定性策略梯度(DDPG)智能体。有关在 MATLAB 中训练 DDPG 智能体的示例,请参阅 Compare DDPG Agent to LQR Controller 。

(1)水箱模型

该模型的目标是控制水箱中的水位。有关水箱模型的更多信息,请参阅 watertank Simulink Model 。
在这里插入图片描述
修改原始模型:

  1. 删除PID控制器
  2. 插入强化学习智能体模块
  3. 计算状态观测矢量 [ ∫   e   d t e h ] T \left[\int\ e\ \mathrm{dt}\quad e\quad h\right]^T [ e dteh]T,其中 h h h 是水箱中的水位, e = r − h e=r−h e=rh r r r 是参考水位
  4. 设置奖励: r e w a r d = 10   (   ∣ e ∣ <   0.1 )   − 1   (   ∣ e ∣   ≥   0.1   )   − 100   (   h ≤ 0   ∣ ∣   h ≥ 20 ) \mathrm{reward}=10\ (\ \mid e \mid<\ 0.1)\ -1\ (\ \mid e \mid\ \geq\ 0.1\ )\ -100\ (\ h\leq0\ ||\ h\geq20) reward=10 ( e∣< 0.1) 1 ( e  0.1 ) 100 ( h0 ∣∣ h20)
  5. 设置终端信号,例如仿真在 h ≤ 0 h≤0 h0 h ≥ 20 h≥20 h20 时停止。

生成的模型是 r l w a t e r t a n k . s l x \mathrm{rlwatertank.slx} rlwatertank.slx。有关此模型和更改的详细信息,请参见 Create Custom Simulink Environments 。

open_system("rlwatertank")

在这里插入图片描述

(2)创建环境

环境模型的创建包括以下内容:

  • 智能体与环境交互的动作信号和状态观测信号。有关详细信息,请参见 rlNumericSpec 和 rlFiniteSetSpec
  • 智能体用来衡量其结果好坏的奖励信号。有关详细信息,请参见 Define Reward and Observation Signals in Custom Environments

定义状态观测明细 o b s I n f o \mathrm{obsInfo} obsInfo 和动作明细 a c t I n f o \mathrm{actInfo} actInfo

% Observation info
obsInfo = rlNumericSpec([3 1],...
    LowerLimit=[-inf -inf 0  ]',...
    UpperLimit=[ inf  inf inf]');

% Name and description are optional and not used by the software
obsInfo.Name = "observations";
obsInfo.Description = "integrated error, error, and measured height";

% Action info
actInfo = rlNumericSpec([1 1]);
actInfo.Name = "flow";

创建环境对象。

env = rlSimulinkEnv("rlwatertank","rlwatertank/RL Agent",...
    obsInfo,actInfo);

设置一个自定义重置函数,使模型的参考值随机化。

env.ResetFcn = @(in)localResetFcn(in);

指定仿真时间 T f T_f Tf和智能体采样时间 T s T_s Ts(单位为秒)。

Ts = 1.0;
Tf = 200;

设置随机数种子。

rng(0)

(3)创建 Critic

DDPG 智能体使用参数化动作价值函数来评估策略,它以当前状态观测和动作作为输入,输出单个标量(估计的未来折扣累积奖励)。

要在 critic 中对参数化动作价值函数进行建模,使用具有两个输入层(一个用于 o b s I n f o \mathrm{obsInfo} obsInfo 指定的状态观测通道,另一个用于 a c t I n f o \mathrm{actInfo} actInfo 指定的动作通道)和一个输出层( 返回标量值 )的神经网络。

将每条网络路径定义为层对象数组。为每个路径的输入和输出层指定名称。通过这些名称,可以连接各路径,然后将网络输入层和输出层与相应的环境通道明确关联。从 o b s I n f o \mathrm{obsInfo} obsInfo a c t I n f o \mathrm{actInfo} actInfo 明细中获取状态观测空间和动作空间的维度。

% Observation path
obsPath = [
    featureInputLayer(obsInfo.Dimension(1),Name="obsInLyr")
    fullyConnectedLayer(50)
    reluLayer
    fullyConnectedLayer(25,Name="obsPathOutLyr")
    ];

% Action path
actPath = [
    featureInputLayer(actInfo.Dimension(1),Name="actInLyr")
    fullyConnectedLayer(25,Name="actPathOutLyr")
    ];

% Common path
commonPath = [
    additionLayer(2,Name="add")
    reluLayer
    fullyConnectedLayer(1,Name="QValue")
    ];

criticNetwork = layerGraph();
criticNetwork = addLayers(criticNetwork,obsPath);
criticNetwork = addLayers(criticNetwork,actPath);
criticNetwork = addLayers(criticNetwork,commonPath);

criticNetwork = connectLayers(criticNetwork, ...
    "obsPathOutLyr","add/in1");
criticNetwork = connectLayers(criticNetwork, ...
    "actPathOutLyr","add/in2");

查看 Critic 网络配置。

figure
plot(criticNetwork)

在这里插入图片描述
将网络转换为 dlnetwork 对象并汇总其属性。

criticNetwork = dlnetwork(criticNetwork);
summary(criticNetwork)

==>  Initialized: true

     Number of learnables: 1.5k

     Inputs:
        1   'obsInLyr'   3 features
        2   'actInLyr'   1 features

指定的深度神经网络、环境明细对象、网络输入与状态观测和动作通道相关联的名称,创建 Critic 对象。
C

critic = rlQValueFunction(criticNetwork, ...
    obsInfo,actInfo, ...
    ObservationInputNames="obsInLyr", ...
    ActionInputNames="actInLyr");

有关 Q-value 函数的更多信息,请参阅 rlQValueFunction 。

用随机输入的状态观测和动作来检查 Critic。

getValue(critic, ...
    {rand(obsInfo.Dimension)}, ...
    {rand(actInfo.Dimension)})

==> ans = single
        -0.1631

有关创建 Critics 的详细信息,请参见 Create Policies and Value Functions 。

(4)创建 Actor

DDPG 智能体在连续动作空间上使用参数化的确定性策略,该策略由连续的确定性 Actor 学习。

Actor 将当前状态观测作为输入,返回动作作为输出。

对 Actor 进行建模,需使用具有一个输入层(如 o b s I n f o \mathrm{obsInfo} obsInfo 所指定,接收环境状态观测通道的内容)和一个输出层(如 a c t I n f o \mathrm{actInfo} actInfo 所指定,将动作返回到环境动作通道)的神经网络。

将网络定义为层对象数组。

actorNetwork = [
    featureInputLayer(obsInfo.Dimension(1))
    fullyConnectedLayer(3)
    tanhLayer
    fullyConnectedLayer(actInfo.Dimension(1))
    ];

将网络转换为 dlnetwork 对象并汇总其属性。

actorNetwork = dlnetwork(actorNetwork);
summary(actorNetwork)

==> Initialized: true

    Number of learnables: 16

    Inputs:
       1   'input'   3 features

使用指定的深度神经网络、环境明细对象以及与状态观测通道相关联的网络输入名称,创建 Actor 对象。

actor = rlContinuousDeterministicActor(actorNetwork,obsInfo,actInfo);

更多信息,请参阅 rlContinuousDeterministicActor 。

用随机输入状态观测数据检查 Actor。

getAction(actor,{rand(obsInfo.Dimension)})

==> ans = 1x1 cell array
        {[-0.3408]}

(5)创建 DDPG 智能体

使用指定的 Actor 和 Critic 对象创建 DDPG 智能体。

agent = rlDDPGAgent(actor,critic);

更多信息,请参阅 rlDDPGAgent 。

指定智能体、Actor 和 Critic 。

agent.SampleTime = Ts;

agent.AgentOptions.TargetSmoothFactor = 1e-3;
agent.AgentOptions.DiscountFactor = 1.0;
agent.AgentOptions.MiniBatchSize = 64;
agent.AgentOptions.ExperienceBufferLength = 1e6; 

agent.AgentOptions.NoiseOptions.Variance = 0.3;
agent.AgentOptions.NoiseOptions.VarianceDecayRate = 1e-5;

agent.AgentOptions.CriticOptimizerOptions.LearnRate = 1e-03;
agent.AgentOptions.CriticOptimizerOptions.GradientThreshold = 1;
agent.AgentOptions.ActorOptimizerOptions.LearnRate = 1e-04;
agent.AgentOptions.ActorOptimizerOptions.GradientThreshold = 1;

或者,也可以使用 rlDDPGAgentOptions 对象指定智能体选项。

用随机输入状态观测结果检查智能体。

getAction(agent,{rand(obsInfo.Dimension)})

==> ans = 1x1 cell array
        {[-0.7926]}

(6)训练智能体

首先要指定训练选项。本例中使用以下选项:

  1. 每次训练最多运行 5000 回合。指定每回合最多持续 ceil ( T f / T s T_f/T_s Tf/Ts) ( 即 200 )个时间步
  2. 在 "回合管理器 "对话框中显示训练进度(设置 Plots 选项),并禁用命令行显示( 将 Verbose 选项设为 false )
  3. 当智能体在连续 20 个回合中获得的平均累积奖励 > 800 时,停止训练。此时,智能体可以控制水箱中的水位

更多信息,请参阅 rlTrainingOptions 。

trainOpts = rlTrainingOptions(...
    MaxEpisodes=5000, ...
    MaxStepsPerEpisode=ceil(Tf/Ts), ...
    ScoreAveragingWindowLength=20, ...
    Verbose=false, ...
    Plots="training-progress",...
    StopTrainingCriteria="AverageReward",...
    StopTrainingValue=800);

使用函数 train 训练智能体。训练是一个计算密集型过程,需要几分钟才能完成。为节省运行此示例的时间,请将 doTraining 设为 false,以加载预训练过的智能体。要自己训练代理,可将 doTraining 设为 true。

doTraining = false;

if doTraining
    % Train the agent.
    trainingStats = train(agent,env,trainOpts);
else
    % Load the pretrained agent for the example.
    load("WaterTankDDPG.mat","agent")
end

在这里插入图片描述

(7)验证 DDPG 智能体

根据模型仿真验证 DDPG 智能体。由于重置函数会随机化参考值,因此要固定随机数种子,以确保可重复性。

rng(1)

在环境中仿真,并将输出返回。

simOpts = rlSimulationOptions(MaxSteps=ceil(Tf/Ts),StopOnError="on");
experiences = sim(env,agent,simOpts);

在这里插入图片描述

(8)本地重置函数

function in = localResetFcn(in)

% Randomize reference signal
blk = sprintf("rlwatertank/Desired \nWater Level");
h = 3*randn + 10;
while h <= 0 || h >= 20
    h = 3*randn + 10;
end
in = setBlockParameter(in,blk,Value=num2str(h));

% Randomize initial height
h = 3*randn + 10;
while h <= 0 || h >= 20
    h = 3*randn + 10;
end
blk = "rlwatertank/Water-Tank System/H";
in = setBlockParameter(in,blk,InitialCondition=num2str(h));

end

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

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

相关文章

MVO-CNN-BiLSTM多输入分类预测|多元宇宙优化算法-卷积-双向长短期神经网络分类预测(Matlab)

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&am…

js【详解】原型 vs 原型链

原型 每个 class 都有显示原型 prototype每个实例都有隐式原型_proto_实例的_proto_指向对应 class 的 prototype 如下范例&#xff1a; class Student 创建了 实例 xialuo 获取属性 xialuo.name 或执行方法 xialuo.sayhi()时&#xff0c;先在自身属性和方法寻找&#xff0…

进程之舞:操作系统中的启动、状态转换与唤醒艺术

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

【MOMO_Tips】批量将word转换为PDF格式

批量将word转换为PDF格式 1.打开文件–>选项–>自定义功能区–>开发工具–>确定 2.点开开发工具&#xff0c;选择第一个visual basic 3.进入页面后找到插入–>模块&#xff0c;就可以看到这样的画面之后将下列vba代码复制粘贴到模块中 Sub ConvertWordsToPd…

【Redis】Redis的应用场景

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;Redis ⛺️稳中求进&#xff0c;晒太阳 Redis的应用场景&#xff1a; 限流 要求10s内只能访问一次 RequestMapping("xian")public String xianLiu(String sign){String sign1 …

LVGL在VScode中安装模拟器运行配置笔记教程

1、LVGL模拟器工程搭建 LVGL(Light and Versatile Graphics Library,轻巧而多功能的图形库)是一个免费的开放源代码图形库,它提供创建具有易于使用的图形元素,精美的视觉效果和低内存占用的嵌入式GUI所需的一切。本文主要讲述如何实现在VScode中实现LVGL模拟器环境的搭建运行。…

Android Framework 通过脚本动态修改应用私有文件执行权限

你只活一次 要悦己 脚本配置 Android_source/device/sprd/***/test/test_chmod.rc service test_chmod /vendor/bin/test_chmod.shuser rootdisabledoneshoton property:sys.test_chmodtruestart test_chmodAndroid_source/device/sprd/***/test/test_chmod.sh #!/system/bin/…

【排序算法】深入理解快速排序算法:从原理到实现

目录 1. 引言 2. 快速排序算法原理 3. 快速排序的时间复杂度分析 4. 快速排序的应用场景 5. 快速排序的优缺点分析 5.1 优点&#xff1a; 5.2 缺点&#xff1a; 6. Java、JavaScript 和 Python 实现快速排序算法 6.1 Java 实现&#xff1a; 6.2 JavaScript 实现&#…

【随笔】程序员如何选择职业赛道,目前各个赛道的现状如何,那个赛道前景巨大

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读文章&#xff01; 此篇是【话题达人】系列文章&#xff0c;这一次的话题是《程序员如何选择职业赛道》 目录 背景热度柱状图赛道热度C/C云原生人工智能前沿技术软件工程后端JavaJavascriptPHPPython区块链大数据移动开发嵌入…

LeetCode100 刷题记录

文章目录 矩阵相关1. 旋转矩阵2. 搜索二维矩阵 矩阵相关 1. 旋转矩阵 题目描述&#xff1a; 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵…

JavaWeb-MyBatis(上)

学完项目管理工具Maven后&#xff0c;继续学习MyBatis。我们都知道&#xff0c;JDBC是一个与数据库连接相关的API&#xff0c;最开始学习数据库连接都是从JDBC开始学起&#xff0c;但是其也有缺点&#xff0c;比如硬编码和操作繁琐等等。而今天学习的MyBatis就是专门为简化JDBC…

自定义协议清理后,浏览器还一直弹出匹配提示用户新应用打开问题

问题 这段时间出现了自定义协议清理异常的问题。在一台电脑上&#xff0c;用chrome&#xff0c;一直出现问题&#xff0c;自定义协议可能存在了缓存或者其他内容。导致一直重复的弹出ms-store打开新应用的奇怪问题。 后来 第一步&#xff1a; 清理注册表&#xff0c;把注册…

创新驱动!HubSpot引领CRM革命

在当今高速发展的数字化时代&#xff0c;企业的国际化布局和市场开拓已经成为了一种必然的趋势。随着企业出海步伐的加快&#xff0c;有效的客户关系管理&#xff08;CRM&#xff09;和营销自动化工具变得尤为重要。这就是HubSpot发力的领域。HubSpot&#xff0c;作为一家领先的…

容器+虚拟机双引擎,ZStack Edge云原生超融合打通业务最后一公里

企业数字化转型的焦点正在发生变化&#xff0c;云基础设施由资源到应用&#xff0c;数据中心从核心到边缘。面向云原生趋势&#xff0c;围绕应用升级&#xff0c;新一代超融合产品——云原生超融合应运而生。 云原生与边缘计算趋势催生云原生超融合 当前&#xff0c;企业客户…

Buran勒索病毒通过Microsoft Excel Web查询文件进行传播

Buran勒索病毒首次出现在2019年5月&#xff0c;是一款新型的基于RaaS模式进行传播的新型勒索病毒&#xff0c;在一个著名的俄罗斯论坛中进行销售&#xff0c;与其他基于RaaS勒索病毒(如GandCrab)获得30%-40%的收入不同&#xff0c;Buran勒索病毒的作者仅占感染产生的25%的收入,…

HTML静态网页成品作业(HTML+CSS)——原神介绍设计制作(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有4个页面。 二、作品演示 三、代…

CrySiS勒索病毒最新变种来袭,加密后缀为kharma

CrySiS勒索病毒&#xff0c;又称Dharma&#xff0c;首次出现是在2016年&#xff0c;2017年5月此勒索病毒万能密钥被公布之后&#xff0c;之前的样本可以解密&#xff0c;导致此勒索病毒曾消失了一段时间&#xff0c;不过随后又马上出现了它的一款最新的变种样本&#xff0c;加密…

H12-821_145

145. OPSF邻接关系建立的过程中需要使用不同的报文&#xff0c;那么请分别将以下各个状态和该状态使用的报文联系起来。 答案&#xff1a; 注释&#xff1a; ExStart状态通过DD报文进行主从选举。 2-way状态通过hello报文知道哪些邻居看到了自己。 Loading状态通过LSR/LSU报文同…

视觉和GPT再碰火花!CVPR`24 | RegionGPT:面向复杂区域理解的VLM(港大英伟达)

文章链接&#xff1a;https://arxiv.org/pdf/2403.02330 视觉语言模型&#xff08;VLMs&#xff09;通过将大语言模型&#xff08;LLMs&#xff09;与图像文本对集成&#xff0c;经历了快速的发展&#xff0c;但由于视觉编码器的空间意识有限以及使用缺乏详细的区域特定字幕的…

从数据到智能:探讨大数据在AI领域的核心作用

前言 大数据和人工智能已经成为当今社会的两大热门话题。它们之间究竟有何关系&#xff1f;又如何在各个领域发挥着重要作用&#xff1f; 概念区别与联系 一、大数据与人工智能的基本概念 大数据&#xff0c;顾名思义&#xff0c;指的是海量的、类型繁多的数据集合。这些数据…