В этом примере показано, как настроить сеанс обучения для нескольких агентов в среде Simulink ®. В этом примере два агента обучаются совместному выполнению задачи перемещения объекта.

Среда в этом примере представляет собой безфрикционную двумерную поверхность, содержащую элементы, представленные окружностями. Объект-мишень C представлен синим кругом радиусом 2 м, а роботы A (красный) и B (зеленый) - меньшими окружностями с радиусами по 1 м. Роботы пытаются переместить объект С за пределы кругового кольца радиусом 8 м, прикладывая силы через столкновение. Все элементы в окружающей среде имеют массу и подчиняются законам движения Ньютона. Кроме того, контактные силы между элементами и границами окружающей среды моделируются как пружинные и массовые демпферные системы. Элементы могут перемещаться по поверхности посредством приложения внешних сил в направлениях X и Y. Движение в третьем измерении отсутствует, и общая энергия системы сохраняется.
Создайте набор параметров, необходимых для этого примера.
rlCollaborativeTaskParams
Откройте модель Simulink.
mdl = "rlCollaborativeTask";
open_system(mdl)
Для этой среды:
Двумерное пространство ограничено от -12 м до 12 м в направлениях X и Y.
Значения жесткости контактной пружины и демпфирования составляют 100 Н/м и 0,1 Н/м/с соответственно.
Агенты разделяют те же самые наблюдения для положений, скоростей A, B и C и значений действия с последнего временного шага.
Моделирование завершается, когда объект C перемещается за пределы кругового кольца.
На каждом шаге времени агенты получают следующее вознаграждение:
-0.005dBC-0.008uB2
Здесь:
rAи являются вознаграждениями, полученными агентами A и B соответственно.
- командное вознаграждение, которое получают оба агента, когда объект C перемещается ближе к границе кольца.
A и B - локальные штрафы, полученные агентами A и B на основании их расстояний от объекта C и величины действия от последнего временного шага.
- расстояние объекта C от центра кольца.
и - расстояния между агентом A и объектом C и агентом B и объектом C соответственно.
и - значения действия агентов А и В на последнем этапе времени.
В этом примере используются агенты оптимизации проксимальной политики (PPO) с пространствами дискретных действий. Дополнительные сведения об агентах PPO см. в разделе Агенты оптимизации проксимальной политики. Агенты прикладывают к роботам внешние силы, приводящие к движению. На каждом этапе времени агенты выбирают действия FY], , FY является одной из следующих пар внешних приложенных сил.
1,0 Н
= 0
1,0 Н
Чтобы создать многоагентную среду, укажите пути блоков агентов с помощью строкового массива. Также укажите объекты наблюдения и спецификации действий с помощью массивов ячеек. Порядок объектов спецификации в массиве ячеек должен соответствовать порядку, указанному в массиве пути блока. Если агенты доступны в рабочей области MATLAB во время создания среды, массивы наблюдения и спецификации действий являются необязательными. Дополнительные сведения о создании многоагентных сред см. в разделе rlSimulinkEnv.
Создайте спецификации ввода-вывода для среды. В этом примере агенты являются гомогенными и имеют одинаковые характеристики ввода-вывода.
% 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.
% 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);
Выходами акторной сети являются вероятности (принятия каждой возможной пары действий в определённом Создайте акторную нейронную сеть и представление.
% 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 шагов или окончание эпизода, а затем тренируются из мини-партий в 64 опыта. В этом примере используется коэффициент фиксации целевой функции 0,125 для повышения стабильности обучения и коэффициент дисконтирования 0,9995 для поощрения долгосрочных вознаграждений.
Укажите следующие параметры обучения для обучения агентов.
Запустите тренировку максимум для 1000 эпизодов, с каждым эпизодом длительностью не более 5000 временных шагов.
Остановите обучение агента, когда его среднее вознаграждение за 100 последовательных эпизодов составляет -10 или более.
maxEpisodes = 1000; maxSteps = 5e3; trainOpts = rlTrainingOptions(... 'MaxEpisodes',maxEpisodes,... 'MaxStepsPerEpisode',maxSteps,... 'ScoreAveragingWindowLength',100,... 'Plots','training-progress',... 'StopTrainingCriteria','AverageReward',... 'StopTrainingValue',-10);
Чтобы обучить нескольких агентов, укажите массив агентов для train функция. Порядок агентов в массиве должен соответствовать порядку путей блоков агентов, указанному при создании среды. Это обеспечивает связь объектов агента с соответствующими интерфейсами ввода-вывода в среде. Обучение этих агентов может занять несколько часов, в зависимости от доступной вычислительной мощности.
Файл 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.