本示例说明如何在Simulink®环境上设置多智能体训练。 在该示例中,您训练了两个智能体以协同执行移动对象的任务。
2020b代码
在该示例中,环境是包含以圆圈表示的元素的二维无摩擦表面。 目标物体C由半径为2 m的蓝色圆圈表示,机器人A(红色)和B(绿色)由半径分别为1 m的较小圆圈表示。 机器人试图通过碰撞力将物体C移动到半径8 m的圆环之外。 环境中的所有元素都具有质量并遵守牛顿运动定律。 此外,将元件与环境边界之间的接触力建模为弹簧和质量阻尼器系统。 元素可以通过在X和Y方向上施加外部力在表面上移动。 三维没有运动,并且系统的总能量得以保全。
创建此示例所需的参数集。
rlCollaborativeTaskParams
打开Simulink模型。
mdl = "rlCollaborativeTask";
open_system(mdl)
对于这种环境:
-
二维空间在X和Y方向上的范围从–12 m到12 m。
-
接触弹簧的刚度和阻尼值分别为100 N / m和0.1 N / m / s。
-
智能体对A,B和C的位置,速度以及上一时间步的作用值具有相同的观察结果。
-
当对象C移动到圆环之外时,模拟终止。
-
在每个时间步骤,智能体将获得以下奖励:
这里:
- r A r_A rA和 r B r_B rB分别是agent A和agent B收到的奖励。
- r g l o b a l r_{global} rglobal是一个团队奖励,当物体C靠近环的边界时,两个智能体都会得到这个奖励。
- r l o c a l , A r_{local,A} rlocal,A和 r l o c a l , B r_{local,B} rlocal,B是agent A和agent B收到的本地惩罚,惩罚基于agent A和agent B与对象C之间的距离以及从上一个时间步到动作的大小。
- d C d_C dC是物体C到环中心的距离。
- d A C d_{AC} dAC和 d B C d_{BC} dBC分别是agent A和object C、agent B和object C之间的距离。
- u A u_A uA和 u B u_B uB是上一个时间步骤中agent A和agent B的动作值。
本示例使用具有离散操作空间的近端策略优化(PPO)智能体。 要了解有关PPO智能体的更多信息,请参阅近端策略优化智能体。 智能体将外力施加到机器人上,从而导致运动。 在每个时间步骤,智能体都会选择您要执行的动作
u
A
,
B
=
[
F
X
,
F
Y
]
u_{A,B} =[F_X, F_Y]
uA,B=[FX,FY],其中
F
X
,
F
Y
F_X, F_Y
FX,FY是下列两对外力之一。
创建环境
要创建多智能体环境,请使用字符串数组指定智能体的块路径。 另外,使用单元格数组指定观察和动作指定对象。 单元格数组中规范对象的顺序必须与块路径数组中指定的顺序匹配。 当环境创建时在MATLAB工作区中有智能体可用时,观察和操作规范数组是可选的。 有关创建多智能体环境的更多信息,请参见rlSimulinkEnv。
创建环境的I / O规范。 在此示例中,智能体是同构的,并且具有相同的I / O规范。
% Number of observations
numObs = 16;
% Number of actions
numAct = 2;
% Maximum value of externally applied force (N)
maxF = 1.0;
% I/O specifications for each agent
oinfo = rlNumericSpec([numObs,1]);
ainfo = rlFiniteSetSpec({
[-maxF -maxF]
[-maxF 0 ]
[-maxF maxF]
[ 0 -maxF]
[ 0 0 ]
[ 0 maxF]
[ maxF -maxF]
[ maxF 0 ]
[ maxF maxF]});
oinfo.Name = 'observations';
ainfo.Name = 'forces';
创建Simulink环境接口
blks = ["rlCollaborativeTask/Agent A", "rlCollaborativeTask/Agent B"];
obsInfos = {oinfo,oinfo};
actInfos = {ainfo,ainfo};
env = rlSimulinkEnv(mdl,blks,obsInfos,actInfos);
指定环境的重置功能。 重置功能resetRobots确保机器人在每个情节开始时从随机的初始位置开始。
env.ResetFcn = @(in) resetRobots(in,RA,RB,RC,boundaryR);
创建智能体
PPO智能体依靠行动者和评论者的智能体来学习最佳策略。 在此示例中,智能体为行动者和评论者维护基于神经网络的函数逼近器。
创建评论者神经网络和表示。 评论者网络的输出是状态s的状态值函数 V ( s ) V(s) V(s)。
% Reset the random seed to improve reproducibility
rng(0)
% Critic networks
criticNetwork = [...
featureInputLayer(oinfo.Dimension(1),'Normalization','none','Name','observation')
fullyConnectedLayer(128,'Name','CriticFC1','WeightsInitializer','he')
reluLayer('Name','CriticRelu1')
fullyConnectedLayer(64,'Name','CriticFC2','WeightsInitializer','he')
reluLayer('Name','CriticRelu2')
fullyConnectedLayer(32,'Name','CriticFC3','WeightsInitializer','he')
reluLayer('Name','CriticRelu3')
fullyConnectedLayer(1,'Name','CriticOutput')];
% Critic representations
criticOpts = rlRepresentationOptions('LearnRate',1e-4);
criticA = rlValueRepresentation(criticNetwork,oinfo,'Observation',{'observation'},criticOpts);
criticB = rlValueRepresentation(criticNetwork,oinfo,'Observation',{'observation'},criticOpts);
行动者网络的输出是在某个状态s采取每个可能动作对的概率 π ( a ∣ s ) π(a|s) π(a∣s)。 创建行动者神经网络和表示。
% Actor networks
actorNetwork = [...
featureInputLayer(oinfo.Dimension(1),'Normalization','none','Name','observation')
fullyConnectedLayer(128,'Name','ActorFC1','WeightsInitializer','he')
reluLayer('Name','ActorRelu1')
fullyConnectedLayer(64,'Name','ActorFC2','WeightsInitializer','he')
reluLayer('Name','ActorRelu2')
fullyConnectedLayer(32,'Name','ActorFC3','WeightsInitializer','he')
reluLayer('Name','ActorRelu3')
fullyConnectedLayer(numel(ainfo.Elements),'Name','Action')
softmaxLayer('Name','SM')];
% Actor representations
actorOpts = rlRepresentationOptions('LearnRate',1e-4);
actorA = rlStochasticActorRepresentation(actorNetwork,oinfo,ainfo,...
'Observation',{'observation'},actorOpts);
actorB = rlStochasticActorRepresentation(actorNetwork,oinfo,ainfo,...
'Observation',{'observation'},actorOpts);
创建智能体。 两种智能体使用相同的选项。
agentOptions = rlPPOAgentOptions(...
'ExperienceHorizon',256,...
'ClipFactor',0.125,...
'EntropyLossWeight',0.001,...
'MiniBatchSize',64,...
'NumEpoch',3,...
'AdvantageEstimateMethod','gae',...
'GAEFactor',0.95,...
'SampleTime',Ts,...
'DiscountFactor',0.9995);
agentA = rlPPOAgent(actorA,criticA,agentOptions);
agentB = rlPPOAgent(actorB,criticB,agentOptions);
在训练期间,智能体收集经验,直到达到256个步骤的经验范围或episode 终止为止,然后从64个经验的小型批次进行训练。 此示例使用目标函数限幅因子0.125来提高训练稳定性,并使用折现因子0.9995来鼓励长期奖励。
训练智能体
指定以下训练选项以训练智能体。
-
进行最多1000个episode 的训练,每个episode 最多持续5000个时间步。
-
当智能体连续100多次的平均奖励为–10或更高时,停止训练智能体。
maxEpisodes = 1000;
maxSteps = 5e3;
trainOpts = rlTrainingOptions(...
'MaxEpisodes',maxEpisodes,...
'MaxStepsPerEpisode',maxSteps,...
'ScoreAveragingWindowLength',100,...
'Plots','training-progress',...
'StopTrainingCriteria','AverageReward',...
'StopTrainingValue',-10);
要训练多个智能体,请为训练功能指定一个智能体数组。 阵列中的智能体顺序必须与在环境创建期间指定的智能体块路径的顺序匹配。 这样做可确保将智能体对象链接到环境中的相应I / O接口。 训练这些智能体可能需要几个小时才能完成,具体取决于可用的计算能力。
MAT文件rlCollaborativeTaskAgents包含一组预先训练的智能体。 您可以加载文件并查看智能体的性能。 要自己训练智能体,请将doTraining设置为true。
doTraining = false;
if doTraining
stats = train([agentA, agentB],env,trainOpts);
else
load('rlCollaborativeTaskAgents.mat');
end
下图显示了训练进度的截图。 由于训练过程中的随机性,您可能会得到不同的结果。
智能体仿真
模拟环境中受过训练的智能体。
simOptions = rlSimulationOptions('MaxSteps',maxSteps);
exp = sim(env,[agentA agentB],simOptions);
有关智能体仿真的更多信息,请参见rlSimulationOptions和sim。