MATLAB强化学习实战(九) 多智能体的区域探索

此示例演示了一个多智能体协作竞争任务,其中训练了三个近端策略优化(PPO)智能体来探索网格世界环境中的所有区域。

在这里插入图片描述
多智能体训练仅在Simulink®环境中支持。 如本示例所示,如果使用MATLAB®System对象定义环境行为,则可以使用MATLAB System(Simulink)块将其合并到Simulink环境中。

创建环境

本示例中的环境是一个包含障碍物的12x12网格世界,未开发的单元格标记为白色,障碍物标记为黑色。 红色,绿色和蓝色圆圈代表环境中的三个机器人。 具有离散动作空间的三个近端策略优化智能体控制机器人。 要了解有关PPO智能体的更多信息,请参阅近端策略优化智能体

智能体向其各自的机器人提供五种可能的移动动作(等待,上,下,左或右)之一。 机器人决定动作是合法还是非法。 例如,当机器人位于环境的左边界附近时,向左移动的动作被视为非法。 同样,与环境中的障碍物和其他媒介碰撞的行为也是非法行为,并会受到处罚环境动态是确定性的,这意味着机器人分别以100%和0%的概率执行合法和非法的动作。 总体目标是尽快探索所有方格。

在每个时间步骤中,智能体都通过一组四个图像来观察环境状态,这些图像可识别出有障碍物的方格,被控制的机器人的当前位置,其他机器人的位置以及该episode期间已探查的方格。 将这些图像合并以创建4通道12x12图像观察集。 下图显示了一个示例,该示例控制着绿色机器人的智能体在给定的时间步长中观察到了什么。
在这里插入图片描述
对于网格世界环境:

  1. 搜索区域是一个12x12的带有障碍物的网格。

  2. 每个智能体的观察结果都是12x12x4的图像。

  3. 离散动作集是五个动作的集合(WAIT = 0,UP = 1,DOWN = 2,LEFT = 3,RIGHT = 4)。

  4. 当完全探究网格或达到最大步数时,仿真将终止。

在每个时间步长,智能体都会收到以下奖励和惩罚。

  1. +1用于移动到先前未探索的单元(白色)。

  2. -0.5表示非法操作(试图移出边界或与其他机器人和障碍物发生碰撞)

  3. -0.05表示导致移动的动作(移动成本)。

  4. -0.1表示不移动的动作(懒惰惩罚)。

  5. 如果对网格进行了充分的探索,则该episode 期间该机器人的覆盖范围贡献是+200倍(探索的单元数与总单元数之比)

使用索引矩阵定义网格内障碍物的位置。 第一列包含行索引,第二列包含列索引。

obsMat = [4 3; 5 3; 6 3; 7 3; 8 3; 9 3; 5 11; 6 11; 7 11; 8 11; 5 12; 6 12; 7 12; 8 12];

初始化机器人位置。

sA0 = [2 2];
sB0 = [11 4];
sC0 = [3 12];
s0 = [sA0; sB0; sC0];

指定采样时间,模拟时间和每个episode的最大步数。

Ts = 0.1;
Tf = 100;
maxsteps = ceil(Tf/Ts);

打开Simulink模型。

mdl = "rlAreaCoverage";
open_system(mdl)

在这里插入图片描述
点击进入
在这里插入图片描述
GridWorld块是代表训练环境的MATLAB System块。 此环境的System对象在GridWorld.m中定义。

在此示例中,智能体是同质的,并且具有相同的观察和操作规范。 创建环境的观察和操作规范。 有关更多信息,请参见rlNumericSpecrlFiniteSetSpec

% Define observation specifications.
obsSize = [12 12 4];
oinfo = rlNumericSpec(obsSize);
oinfo.Name = 'observations';

% Define action specifications.
numAct = 5;
actionSpace = {
    
    0,1,2,3,4};
ainfo = rlFiniteSetSpec(actionSpace);
ainfo.Name = 'actions';

指定智能体的块路径。

blks = mdl + ["/Agent A (Red)","/Agent B (Green)","/Agent C (Blue)"];

创建环境接口,为所有三个智能体指定相同的观察和操作规范。

env = rlSimulinkEnv(mdl,blks,{
    
    oinfo,oinfo,oinfo},{
    
    ainfo,ainfo,ainfo});

指定环境的重置功能。 重置功能resetMap可确保机器人在每个episode开始时从随机的初始位置开始。 随机初始化使智能体对不同的起始位置具有鲁棒性,并改善了训练收敛性。

env.ResetFcn = @(in) resetMap(in, obsMat);

创建智能体

PPO智能体依靠行动者和评论者的代表来学习最佳策略。 在此示例中,智能体为行动者和评论者维护基于深度神经网络的函数逼近器。 行动者和评论者都具有相似的网络结构,具有卷积和全连接层。 评论者输出表示状态值 V ( s ) V(s) V(s)的标量值。 行动者输出采取这五个动作中每一个的概率 π ( a ∣ s ) π(a|s) πas。 有关更多信息,请参见rlValueRepresentationrlStochasticActorRepresentation
设置可重复性的随机种子。

rng(0)

使用以下步骤创建行动者和评论者表示。

  1. 创建行动者和评论者深度神经网络。

  2. 指定行动者和评论者的代表选项。 在此示例中,指定学习率和梯度阈值。 有关更多信息,请参见rlRepresentationOptions

  3. 创建行动者和评论者表示对象。

对所有三个智能体使用相同的网络结构和表示选项。

for idx = 1:3
    % Create actor deep neural network.
    actorNetWork = [
        imageInputLayer(obsSize,'Normalization','none','Name','observations')
        convolution2dLayer(8,16,'Name','conv1','Stride',1,'Padding',1,'WeightsInitializer','he')
        reluLayer('Name','relu1')
        convolution2dLayer(4,8,'Name','conv2','Stride',1,'Padding','same','WeightsInitializer','he')
        reluLayer('Name','relu2')
        fullyConnectedLayer(256,'Name','fc1','WeightsInitializer','he')
        reluLayer('Name','relu3')
        fullyConnectedLayer(128,'Name','fc2','WeightsInitializer','he')
        reluLayer('Name','relu4')
        fullyConnectedLayer(64,'Name','fc3','WeightsInitializer','he')
        reluLayer('Name','relu5')
        fullyConnectedLayer(numAct,'Name','output')
        softmaxLayer('Name','action')];
    
    % Create critic deep neural network.
    criticNetwork = [
        imageInputLayer(obsSize,'Normalization','none','Name','observations')
        convolution2dLayer(8,16,'Name','conv1','Stride',1,'Padding',1,'WeightsInitializer','he')
        reluLayer('Name','relu1')
        convolution2dLayer(4,8,'Name','conv2','Stride',1,'Padding','same','WeightsInitializer','he')
        reluLayer('Name','relu2')
        fullyConnectedLayer(256,'Name','fc1','WeightsInitializer','he')
        reluLayer('Name','relu3')
        fullyConnectedLayer(128,'Name','fc2','WeightsInitializer','he')
        reluLayer('Name','relu4')
        fullyConnectedLayer(64,'Name','fc3','WeightsInitializer','he')
        reluLayer('Name','relu5')
        fullyConnectedLayer(1,'Name','output')];
    
    % Specify representation options for the actor and critic.
    actorOpts = rlRepresentationOptions('LearnRate',1e-4,'GradientThreshold',1);
    criticOpts = rlRepresentationOptions('LearnRate',1e-4,'GradientThreshold',1);
    
    % create actor and critic
    actor(idx) = rlStochasticActorRepresentation(actorNetWork,oinfo,ainfo,...
        'Observation',{
    
    'observations'},actorOpts);
    critic(idx) = rlValueRepresentation(criticNetwork,oinfo,...
        'Observation',{
    
    'observations'},criticOpts);
end

使用rlPPOAgentOptions指定智能体选项。 对所有三个智能体使用相同的选项。 在训练期间,智能体收集经验,直到达到128个步骤的经验范围,然后再从64个经验的小型批次中进行训练。 客观函数限幅系数为0.2可以提高训练的稳定性,折扣系数值为0.995可以鼓励长期的回报。

opt = rlPPOAgentOptions(...
    'ExperienceHorizon',128,...
    'ClipFactor',0.2,...
    'EntropyLossWeight',0.01,...
    'MiniBatchSize',64,...
    'NumEpoch',3,...
    'AdvantageEstimateMethod','gae',...
    'GAEFactor',0.95,...
    'SampleTime',Ts,...
    'DiscountFactor',0.995);

使用定义的行动者,评论者选项创建智能体。

agentA = rlPPOAgent(actor(1),critic(1),opt);
agentB = rlPPOAgent(actor(2),critic(2),opt);
agentC = rlPPOAgent(actor(3),critic(3),opt);
agents = [agentA,agentB,agentC];

训练智能体

指定以下选项以训练智能体。

  1. 进行最多1000个episode的训练,每个episode最多持续5000个时间步。

  2. 当智能体连续100次的平均奖励达到80或更多时,停止训练智能体。

trainOpts = rlTrainingOptions(...
    'MaxEpisodes',1000,...
    'MaxStepsPerEpisode',maxsteps,...
    'Plots','training-progress',...
    'ScoreAveragingWindowLength',100,...
    'StopTrainingCriteria','AverageReward',...
    'StopTrainingValue',80); 

要训​​练多个智能体,请为训练函数指定一个智能体数组。 数组中智能体的顺序必须与创建环境时指定的智能体块路径的顺序匹配。 这样做可确保将智能体对象链接到环境中的适当操作和观察规范。

训练是一个计算密集型过程,需要几分钟才能完成。 为了节省运行此示例的时间,请通过将doTraining设置为false来加载预训练的智能体参数。 要自己训练智能体,请将doTraining设置为true

doTraining = false;
if doTraining
    stats = train(agents,env,trainOpts);
else
    load('rlAreaCoverageParameters.mat');
    setLearnableParameters(agentA,agentAParams);
    setLearnableParameters(agentB,agentBParams);
    setLearnableParameters(agentC,agentCParams);
end

下图显示了训练进度的截图。 由于训练过程中的随机性,您可能会得到不同的结果。
在这里插入图片描述

智能体仿真

仿真环境中训练后的智能体。

rng(0) % reset the random seed
simOpts = rlSimulationOptions('MaxSteps',maxsteps);
experience = sim(env,agents,simOpts);

在这里插入图片描述
这些智能体成功地覆盖了整个网格世界。

猜你喜欢

转载自blog.csdn.net/wangyifan123456zz/article/details/109625104