这个示例演示了一个多智能体协作-竞争任务,在该任务中,您训练三个近端策略优化(PPO)代理来探索网格世界环境中的所有区域。
多智能体培训仅支持Simulink®环境。金宝app金宝app如本例所示,如果您使用MATLAB®System对象定义环境行为,则可以使用金宝appMATLAB系统(金宝app模型)块。
本例中的环境是一个包含障碍的12x12网格世界,未探索的单元格用白色标记,障碍用黑色标记。环境中有三个机器人,分别用红色、绿色和蓝色的圆圈表示。采用三个具有离散动作空间的近端策略优化代理对机器人进行控制。要了解有关PPO代理的更多信息,请参见近端政策优化代理.
代理为各自的机器人提供五种可能的移动动作(等待、向上、向下、向左或向右)中的一种。机器人决定一个动作是合法还是非法。例如,当机器人位于环境的左边界附近时,向左移动的动作被认为是非法的。同样,与环境中的障碍物和其他代理人碰撞的行为是非法行为,将受到处罚。环境动力学是确定性的,这意味着机器人执行合法和非法行为的概率分别为100%和0%。总体目标是尽可能快地探索所有细胞。
在每一个时间步骤中,一个代理通过一组四张图像来观察环境的状态,这些图像识别有障碍的细胞、被控制机器人的当前位置、其他机器人的位置,以及在本集中探索过的细胞。这些图像被组合成一个4通道12x12图像观测集。下图显示了控制绿色机器人的agent在给定时间步长的情况。
对于网格世界环境:
搜索区域是一个带有障碍物的12 × 12网格。
观察每个代理是一个12x12x4的图像。
离散动作集是由5个动作(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];
指定示例时间、模拟时间和每集的最大步骤数。
t = 0.1;Tf = 100;maxsteps =装天花板(Tf / Ts);
打开Simulin金宝appk模型。
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 + [“/代理(红色)”,”“B /代理(绿色),“/剂C(蓝色)”];
创建环境接口,为所有三个代理指定相同的观察和操作规范。
env = rl金宝appSimulinkEnv (mdl,黑色,{oinfo、oinfo oinfo}, {ainfo、ainfo ainfo});
指定环境的复位功能。重置功能resetMap
确保机器人在每一集开始时从随机的初始位置开始。随机初始化使得agent对不同的初始位置具有鲁棒性,提高了训练的收敛性。
env。ResetFcn = @(in) resetMap(in, obsMat);
PPO代理依靠演员和评论家代表来学习最优策略。在这个例子中,代理为演员和评论家维护基于深度神经网络的函数近似器。行动者和批评者都有相似的具有卷积和全连接层的网络结构。批评家输出表示状态值的标量值
.参与者输出概率
采取这五种行动。有关更多信息,请参见rlValueRepresentation
和rlStochasticActorRepresentation
.
为重现性设置随机种子。
rng (0)
使用以下步骤创建参与者和批评者表示。
创建演员和评论家的深度神经网络。
为演员和评论家指定表示选项。在本例中,指定学习率和梯度阈值。有关更多信息,请参见rlRepresentationOptions
.
创建演员和评论家表示对象。
为所有三个代理使用相同的网络结构和表示选项。
为idx = 1:3%创建actor深度神经网络。[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 (“名字”,“行动”));创建批评家深度神经网络。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,“名字”,“输出”));%指定演员和评论家的表示选项。actorOpts = rlRepresentationOptions (“LearnRate”1的军医,“GradientThreshold”1);criticOpts = rlRepresentationOptions (“LearnRate”1的军医,“GradientThreshold”1);创造演员和评论家演员(idx) = rlStochasticActorRepresentation (actorNetWork、oinfo ainfo,...“观察”,{“观察”}, actorOpts);评论家(idx) = rlValueRepresentation (criticNetwork oinfo,...“观察”,{“观察”}, criticOpts);结束
使用指定代理选项rlPPOAgentOptions
.对所有三个代理使用相同的选项。在培训过程中,agents收集经验,直到达到128步的经验视界,然后从64个经验小批量进行培训。目标函数剪辑系数为0.2可提高训练稳定性,折扣系数为0.995可鼓励长期奖励。
选择= 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(演员(1)评论(1),选择);agentB = rlPPOAgent(演员(2),评论家(2),选择);agentC = rlPPOAgent(演员(3)评论(3),选择);代理= [agentA、agentB agentC];
为培训代理指定以下选项。
运行训练最多1000集,每集最多持续5000时间步。
停止训练一个代理,当它的平均奖励超过100连续的事件是80或更多。
trainOpts = rlTrainingOptions (...“MaxEpisodes”, 1000,...“MaxStepsPerEpisode”maxsteps,...“阴谋”,“训练进步”,...“ScoreAveragingWindowLength”, 100,...“StopTrainingCriteria”,“AverageReward”,...“StopTrainingValue”, 80);
要训练多个代理,请指定一个代理数组火车
函数。数组中代理的顺序必须与环境创建期间指定的代理块路径的顺序匹配。这样做可以确保代理对象链接到环境中适当的操作和观察规范。
培训是一个计算密集型的过程,需要几分钟才能完成。为了节省运行此示例的时间,请通过设置加载预先训练过的代理参数doTraining
来假
.自己训练代理人,设置doTraining
来真正的
.
doTraining = false;如果doTraining stats = training (agents,env,trainOpts);其他的负载(“rlAreaCoverageParameters.mat”);setLearnableParameters (agentA agentAParams);setLearnableParameters (agentB agentBParams);setLearnableParameters (agentC agentCParams);结束
下图显示了训练进度的快照。由于训练过程的随机性,你可以期待不同的结果。
在环境中模拟训练有素的特工。有关代理模拟的更多信息,请参见rlSimulationOptions
和sim卡
.
rng (0)重置随机种子simOpts = rlSimulationOptions (“MaxSteps”, maxsteps);经验= sim (env、代理simOpts);
特工成功地覆盖了整个电网世界。