为区域覆盖培训多个代理
这个示例演示了一个多代理协作-竞争任务,在这个任务中,您训练了三个近端策略优化(PPO)代理来探索网格世界环境中的所有领域。
多代理训练仅支持Simulink®环境。如本例所示,如果使用MATLAB®System对象定义环境行为,则可以使用MATLAB系统(模型)块。
创建环境
本例中的环境是一个包含障碍物的12x12网格世界,未探索的单元用白色标记,障碍物用黑色标记。环境中有三个机器人,用红、绿、蓝三个圆圈表示。三个具有离散动作空间的近端策略优化代理控制机器人。要了解更多关于PPO代理的信息,请参见近端策略优化(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 = [s0;]sB0;sC0];
指定采样时间、模拟时间和每集的最大步数。
Ts = 0.1;Tf = 100;maxsteps = ceil(Tf/Ts);
打开Simulink模型。
mdl =“rlAreaCoverage”;open_system (mdl)
的GridWorld
block是代表训练环境的MATLAB系统block。中定义了此环境的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, blocks,{oinfo,oinfo,oinfo},{ainfo,ainfo,ainfo});
指定环境的重置功能。复位功能resetMap
确保机器人在每一集开始时从随机的初始位置开始。随机初始化使智能体对不同起始位置具有鲁棒性,提高了训练收敛性。
env。ResetFcn = @(in) resetMap(in, obsMat);
创建代理
本例中的PPO代理在离散的动作空间上操作,并依赖actor和critic函数来学习最优策略。代理为具有相似网络结构(卷积和完全连接层的组合)的演员和评论家维护基于深度神经网络的函数逼近器。评论家输出一个表示状态值的标量值 。参与者输出概率 这五个动作分别是:等待、上、下、左、右。
为再现性设置随机种子。
rng (0)
使用以下步骤创建演员和评论家函数。
创建演员和评论家的深层神经网络。
类创建角色函数对象
rlDiscreteCategoricalActor
命令。类创建批评家函数对象
rlValueFunction
命令。
对所有三个代理使用相同的网络结构和表示选项。
为Idx = 1:3创建actor深度神经网络。actorNetWork = [imageInputLayer(obsSize,Normalization=“没有”) convolution2dLayer (8, 16,…步= 1,填充= 1,WeightsInitializer =“他”) reluLayer convolution2dLayer(4,8,…步= 1,填充=“相同”WeightsInitializer =“他”) reluLayer fullyConnectedLayer(256,WeightsInitializer= .“他”) reluLayer fullyConnectedLayer(128,WeightsInitializer= .“他”) reluLayer fullyConnectedLayer(64,WeightsInitializer= .“他”) reluLayer fulllyconnectedlayer (numAct) softmaxLayer];actorNetWork = dlnetwork(actorNetWork);创建评论家深度神经网络。criticNetwork = [imageInputLayer(obsSize,Normalization=“没有”) convolution2dLayer (8, 16,…步= 1,填充= 1,WeightsInitializer =“他”) reluLayer convolution2dLayer(4,8,…步= 1,填充=“相同”WeightsInitializer =“他”) reluLayer fullyConnectedLayer(256,WeightsInitializer= .“他”) reluLayer fullyConnectedLayer(128,WeightsInitializer= .“他”) reluLayer fullyConnectedLayer(64,WeightsInitializer= .“他”) reluLayer fullyConnectedLayer(1)];criticNetwork = dlnetwork(criticNetwork);创造演员和评论家actor(idx) = rlDiscreteCategoricalActor(actorNetWork, info, info);批评家(idx) = rlValueFunction(批评家网络,oinfo);结束
为评论家和演员指定训练选项rlOptimizerOptions
。
actorOpts = rlooptimizeroptions (LearnRate=1 -4,GradientThreshold=1);criticOpts = rlooptimizeroptions (LearnRate=1e-4,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);
使用已定义的参与者、评论家和选项创建代理。
代理(演员(1),评论家(1),opt);agentB = rlPPOAgent(演员(2),评论家(2),opt);agentC = rlPPOAgent(演员(3),评论家(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);
特工们成功地覆盖了整个网格世界。