为区域覆盖培训多名特工
本例演示了一个多智能体协作-竞争任务,在该任务中,您训练三个近端策略优化(PPO)智能体来探索网格世界环境中的所有区域。
多代理训练仅支持Simulink®环境。如本例所示,如果使用MATLAB®System对象定义环境行为,则可以使用控件将其合并到Simulink环境MATLAB系统(模型)块。
创建环境
本例中的环境是一个包含障碍的12x12网格世界,未探索的单元格用白色标记,障碍用黑色标记。环境中有三个机器人,分别用红色、绿色和蓝色圆圈表示。三个具有离散动作空间的近端策略优化代理控制机器人。要了解更多关于PPO代理的信息,请参见近端策略优化代理.
代理为各自的机器人提供五种可能的移动动作之一(等待、向上、向下、向左或向右)。机器人决定一个行为是合法还是非法。例如,当机器人位于环境的左边界附近时,向左移动的动作被视为非法。类似地,与环境中的障碍物和其他物体发生碰撞的行为是非法行为,会受到惩罚。环境动态是确定的,这意味着机器人执行合法和非法行为的概率分别为100%和0%。总体目标是尽可能快地探索所有细胞。
在每个时间步骤中,智能体通过一组四张图像来观察环境的状态,这些图像可以识别有障碍的细胞、被控制的机器人的当前位置、其他机器人的位置以及在事件期间已经探索过的细胞。这些图像被组合起来创建一个4通道12x12图像观测集。下图显示了控制绿色机器人的代理对给定时间步长的观察。
对于网格世界环境:
搜索区域是一个有障碍的12x12网格。
每个代理的观察结果是一个12x12x4的图像。
离散动作集是五个动作的集合(WAIT=0, UP=1, DOWN=2, LEFT=3, RIGHT=4)。
当网格被完全探索或达到最大步数时,模拟结束。
在每个时间步骤中,代理收到以下奖励和惩罚。
移动到以前未探索的单元格(白色)+1。
-0.5非法动作(试图移动到边界外或与其他机器人和障碍物碰撞)
-0.05表示导致移动的动作(移动成本)。
-0.1表示没有动作(懒惰惩罚)。
如果网格被完全探索,则+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];
指定采样时间、模拟时间和每集的最大步数。
Ts = 0.1;Tf = 100;maxsteps = ceil(Tf/Ts);
打开Simulink模型。
mdl =“rlAreaCoverage”;open_system (mdl)
的GridWorld
block是代表训练环境的MATLAB系统块。中定义了此环境的System对象GridWorld.m
.
在本例中,代理是同构的,并且具有相同的观察和操作规范。为环境创建观察和行动规范。有关更多信息,请参见rlNumericSpec
而且rlFiniteSetSpec
.
定义观察规范。obsSize = [12 12 4];oinfo = rlNumericSpec(obsSize);oinfo。Name =“观察”;定义动作规范。numAct = 5;actionSpace = {0,1,2,3,4};ainfo = rlFiniteSetSpec(actionSpace);ainfo。Name =“行动”;
为代理指定块路径。
BLKS = MDL + [“/代理人A(红色)”,“/代理B(绿色)”,“/特工C(蓝色)”];
创建环境接口,为所有三个代理指定相同的观察和操作规范。
env = rlSimulinkEnv(mdl,blks,{oinfo,oinfo},{ainfo,ainfo,ainfo});
为环境指定一个重置函数。复位功能resetMap
确保机器人在每一集开始时从随机的初始位置开始。随机初始化使智能体对不同起始位置具有鲁棒性,提高了训练收敛性。
env。ResetFcn = @(in) resetMap(in, obsMat);
创建代理
本例中的PPO代理在离散的动作空间上操作,并依赖于参与者和评论家函数来学习最优策略。代理为具有相似网络结构(卷积和全连接层的组合)的演员和评论家维护基于深度神经网络的函数逼近器。批评家输出一个表示状态值的标量值 .行动者输出概率 等待,上,下,左,右这五个动作。
为重现性设置随机种子。
rng (0)
使用以下步骤创建参与者和评论家函数。
创建演员和评论家的深度神经网络。
属性创建角色函数对象
rlDiscreteCategoricalActor
命令。属性创建批评函数对象
rlValueFunction
命令。
对所有三个代理使用相同的网络结构和表示选项。
为Idx = 1:3创建演员深度神经网络。actorNetWork = [imageInputLayer(obsSize,“归一化”,“没有”,“名字”,“观察”) convolution2dLayer (8, 16,“名字”,“conv1”,“步”,1,“填充”,1,“WeightsInitializer”,“他”) reluLayer (“名字”,“relu1”) convolution2dLayer (4 8“名字”,“conv2”,“步”,1,“填充”,“相同”,“WeightsInitializer”,“他”) reluLayer (“名字”,“relu2”) fullyConnectedLayer (256,“名字”,“fc1”,“WeightsInitializer”,“他”) reluLayer (“名字”,“relu3”) fullyConnectedLayer (128,“名字”,“取得”,“WeightsInitializer”,“他”) reluLayer (“名字”,“relu4”) fullyConnectedLayer (64,“名字”,“一个fc3”文件,“WeightsInitializer”,“他”) reluLayer (“名字”,“relu5”) fullyConnectedLayer (numAct“名字”,“输出”) softmaxLayer (“名字”,“行动”));actorNetWork = dlnetwork(actorNetWork);创建评论家深度神经网络。criticNetwork = [imageInputLayer(obsSize,“归一化”,“没有”,“名字”,“观察”) convolution2dLayer (8, 16,“名字”,“conv1”,“步”,1,“填充”,1,“WeightsInitializer”,“他”) reluLayer (“名字”,“relu1”) convolution2dLayer (4 8“名字”,“conv2”,“步”,1,“填充”,“相同”,“WeightsInitializer”,“他”) reluLayer (“名字”,“relu2”) fullyConnectedLayer (256,“名字”,“fc1”,“WeightsInitializer”,“他”) reluLayer (“名字”,“relu3”) fullyConnectedLayer (128,“名字”,“取得”,“WeightsInitializer”,“他”) reluLayer (“名字”,“relu4”) fullyConnectedLayer (64,“名字”,“一个fc3”文件,“WeightsInitializer”,“他”) reluLayer (“名字”,“relu5”) fullyConnectedLayer (1,“名字”,“输出”));临界网络= dlnetwork(临界网络);创造演员和评论家actor(idx) = rlDiscreteCategoricalActor(actorNetWork,oinfo,ainfo);% #好< * SAGROW >批评家(idx) = rlValueFunction(批评网络,oinfo);结束
为参与者和评论家指定优化器选项。
actorOpts = rlOptimizerOptions(“LearnRate”1的军医,“GradientThreshold”1);criticOpts = rlOptimizerOptions(“LearnRate”1的军医,“GradientThreshold”1);
使用指定代理选项rlPPOAgentOptions
.对所有三个代理使用相同的选项。在训练过程中,代理人收集经验,直到达到128步的经验视界,然后从64个经验的小批量中进行训练。目标函数剪辑因子为0.2提高训练稳定性,贴现因子值为0.995鼓励长期奖励。
opt = rlPPOAgentOptions(...“ActorOptimizerOptions”actorOpts,...“CriticOptimizerOptions”criticOpts,...“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);
培训代理商
在本例中,代理以分散的方式进行独立训练。为培训代理指定以下选项。
属性自动分配代理组
AgentGroups =汽车
选择。这将每个代理分配到一个单独的组中。指定
“去中心化”
学习策略。运行训练最多1000集,每集最多持续5000个时间步。
当一个智能体连续100集的平均奖励为80或更多时停止训练。
trainOpts = rlMultiAgentTrainingOptions(...“AgentGroups”,“汽车”,...“LearningStrategy”,“去中心化”,...“MaxEpisodes”, 1000,...“MaxStepsPerEpisode”maxsteps,...“阴谋”,“训练进步”,...“ScoreAveragingWindowLength”, 100,...“StopTrainingCriteria”,“AverageReward”,...“StopTrainingValue”, 80);
有关多代理训练的更多信息,请键入帮助rlMultiAgentTrainingOptions
在MATLAB。
要训练代理,请将代理数组指定为火车
函数。数组中代理的顺序必须与创建环境期间指定的代理块路径的顺序匹配。这样做可以确保代理对象链接到环境中适当的操作和观察规范。
训练是一个计算密集型的过程,需要几分钟才能完成。为了节省运行此示例的时间,可以通过设置加载预训练的代理参数doTraining
来假
.要亲自训练特工,请设置doTraining
来真正的
.
doTraining = false;如果doTraining result = train([agentA,agentB,agentC],env,trainOpts);其他的负载(“rlAreaCoverageAgents.mat”);结束
下图显示了训练进度的快照。由于训练过程的随机性,你可以期待不同的结果。
模拟代理
在环境中模拟训练过的代理。有关代理模拟的详细信息,请参见rlSimulationOptions
而且sim卡
.
rng (0)%重置随机种子simOpts = rlSimulationOptions(“MaxSteps”, maxsteps);experience = sim(env,[agentA,agentB,agentC],simOpts);
特工们成功地覆盖了整个网格世界。