В этом примере показано, как настроить сеанс обучения мультиагента на среде Simulink®. В примере вы обучаете двух агентов совместно выполнять задачу перемещения объекта.
Среда в этом примере является лишенной трения двумерной поверхностью, содержащей элементы, представленные кругами. Целевой объект C представлен синим кругом с радиусом 2 м, и роботы (красный) и (зеленый) B представлены меньшими кругами с радиусами 1 м каждый. Роботы пытаются к объекту move C вне кругового звонка радиуса 8 м, прикладывая силы через столкновение. Все элементы в среде имеют массу и выполняют законы Ньютона движения. Кроме того, силы контакта между элементами и контурами среды моделируются как пружинные и массовые системы демпфера. Элементы могут переместиться в поверхность через приложение внешне приложенных сил в направлениях X и Y. Нет никакого движения в третьей размерности, и полная энергия системы сохраняется.
Создайте набор параметров, требуемых для этого примера.
rlCollaborativeTaskParams
Откройте модель Simulink.
mdl = "rlCollaborativeTask";
open_system(mdl)
Для этой среды:
2 мерных пространства ограничены от-12 м до 12 м в обоих направления X и Y.
Жесткость пружины контакта и значения затухания составляют 100 Н/м и 0.1 N/m/s, соответственно.
Агенты совместно используют те же наблюдения для положений, скоростей A, B, и C и значений действия от последнего временного шага.
Симуляция завершает работу, когда объект C перемещается вне кругового звонка.
На каждом временном шаге агенты получают следующее вознаграждение:
Здесь:
и вознаграждения, полученные агентами A и B, соответственно.
вознаграждение команды, которое получено обоими агентами, когда объект C придвигается поближе к контуру звонка.
и локальные штрафы, полученные агентами A и B на основе их расстояний от объекта C и величины действия от последнего временного шага.
расстояние объекта C от центра звонка.
и расстояния между агентом A и объектом C и агентом B и объектом C, соответственно.
и значения действия агентов A и B от последнего временного шага.
Этот пример использует агентов ближайшей оптимизации политики (PPO) с дискретными пространствами действий. Чтобы узнать больше об агентах PPO, смотрите Ближайших Агентов Оптимизации политики. Агенты прикладывают внешние силы на роботах тот результат в движении. На каждом временном шаге агенты выбирают действия , где одна из следующих пар внешне приложенных сил.
Чтобы создать среду мультиагента, задайте пути к блоку агентов с помощью массива строк. Кроме того, задайте спецификацию наблюдений и объекты спецификации действия с помощью массивов ячеек. Порядок объектов спецификации в массиве ячеек должен совпадать с порядком, заданным в массиве блока path. Когда агенты доступны в рабочем пространстве 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 используют представления актёра и критика, чтобы изучить оптимальную политику. В этом примере агенты обеспечивают основанные на нейронной сети функциональные аппроксимации для агента и критика.
Создайте нейронную сеть критика и представление. Выход сети критика является функцией ценности состояния для состояния .
% 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, чтобы поощрить долгосрочные вознаграждения.
Задайте следующие опции обучения, чтобы обучить агентов.
Запустите обучение самое большее 1 000 эпизодов с каждым эпизодом, длящимся самое большее 5 000 временных шагов.
Остановите обучение агента, когда его среднее вознаграждение более чем 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
.