Этот пример демонстрирует многоагентную задачу совместной конкуренции, в которой вы обучаете трех агентов ближней оптимизации политики (PPO) исследовать все области в среде grid-world.

Обучение работе с несколькими агентами поддерживается только для сред Simulink ®. Как показано в этом примере, при определении поведения среды с помощью объекта MATLAB ® System его можно включить в среду Simulink с помощью блока MATLAB System (Simulink).
Среда в этом примере представляет собой мир сетки 12x12, содержащий препятствия, с неисследованными клетками, отмеченными белым цветом, и препятствиями, помеченными черным цветом. В окружении три робота представлены красными, зелеными и синими кругами. Три проксимальных агента оптимизации политики с пространствами дискретного действия управляют роботами. Дополнительные сведения об агентах PPO см. в разделе Агенты оптимизации проксимальной политики.
Агенты обеспечивают одно из пяти возможных действий перемещения (WAIT, UP, DOWN, LEFT или RIGHT) для своих соответствующих роботов. Роботы решают, является ли действие законным или незаконным. Например, действие перемещения ВЛЕВО, когда робот расположен рядом с левой границей окружающей среды, считается незаконным. Аналогичным образом, действия по борьбе с препятствиями и другими агентами в окружающей среде являются незаконными действиями и наказаниями. Динамика среды детерминирована, что означает, что роботы выполняют законные и незаконные действия с 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 = [sA0; sB0; sC0];
Укажите время выборки, время моделирования и максимальное количество шагов для каждого эпизода.
Ts = 0.1; Tf = 100; maxsteps = ceil(Tf/Ts);
Откройте модель Simulink.
mdl = "rlAreaCoverage";
open_system(mdl)
GridWorld блок является системным блоком MATLAB, представляющим учебную среду. Системный объект для этой среды определен в GridWorld.m.
В этом примере агенты являются однородными и имеют одинаковые характеристики наблюдения и действия. Создайте спецификации наблюдения и действий для среды. Дополнительные сведения см. в разделе rlNumericSpec и rlFiniteSetSpec.
% Define observation specifications. obsSize = [12 12 4]; oinfo = rlNumericSpec(obsSize); oinfo.Name = 'observations'; % Define action specifications. numAct = 5; actionSpace = {0,1,2,3,4}; ainfo = rlFiniteSetSpec(actionSpace); ainfo.Name = 'actions';
Укажите пути к блокам для агентов
blks = mdl + ["/Agent A (Red)","/Agent B (Green)","/Agent C (Blue)"];
Создайте интерфейс среды, задав одинаковые характеристики наблюдения и действий для всех трех агентов.
env = rlSimulinkEnv(mdl,blks,{oinfo,oinfo,oinfo},{ainfo,ainfo,ainfo});Укажите функцию сброса для среды. Функция сброса resetMap обеспечивает, чтобы роботы начинали со случайных начальных позиций в начале каждого эпизода. Случайная инициализация делает агентов устойчивыми к различным начальным позициям и улучшает сходимость обучения.
env.ResetFcn = @(in) resetMap(in, obsMat);
Агенты PPO полагаются на представления актера и критика, чтобы узнать оптимальную политику. В этом примере агенты поддерживают приближенные функции на основе глубоких нейронных сетей для актера и критика. И у актера, и у критика схожие сетевые структуры со сверткой и полностью связанными слоями. Критик выводит скалярное значение, представляющее значение ). Актер выводит вероятности (принятия каждого из пяти действий. Дополнительные сведения см. в разделеrlValueRepresentation и rlStochasticActorRepresentation.
Задайте случайное начальное число для воспроизводимости.
rng(0)
Создайте представление актера и критика, выполнив следующие действия.
Создать актёра и критика глубокими нейронными сетями.
Укажите параметры представления для актера и критика. В этом примере задаются коэффициенты обучения и пороговые значения градиента. Дополнительные сведения см. в разделе rlRepresentationOptions.
Создание объектов представления актера и критика.
Используйте одну и ту же сетевую структуру и параметры представления для всех трех агентов.
for idx = 1:3 % Create actor deep neural network. actorNetWork = [ imageInputLayer(obsSize,'Normalization','none','Name','observations') convolution2dLayer(8,16,'Name','conv1','Stride',1,'Padding',1,'WeightsInitializer','he') reluLayer('Name','relu1') convolution2dLayer(4,8,'Name','conv2','Stride',1,'Padding','same','WeightsInitializer','he') reluLayer('Name','relu2') fullyConnectedLayer(256,'Name','fc1','WeightsInitializer','he') reluLayer('Name','relu3') fullyConnectedLayer(128,'Name','fc2','WeightsInitializer','he') reluLayer('Name','relu4') fullyConnectedLayer(64,'Name','fc3','WeightsInitializer','he') reluLayer('Name','relu5') fullyConnectedLayer(numAct,'Name','output') softmaxLayer('Name','action')]; % Create critic deep neural network. criticNetwork = [ imageInputLayer(obsSize,'Normalization','none','Name','observations') convolution2dLayer(8,16,'Name','conv1','Stride',1,'Padding',1,'WeightsInitializer','he') reluLayer('Name','relu1') convolution2dLayer(4,8,'Name','conv2','Stride',1,'Padding','same','WeightsInitializer','he') reluLayer('Name','relu2') fullyConnectedLayer(256,'Name','fc1','WeightsInitializer','he') reluLayer('Name','relu3') fullyConnectedLayer(128,'Name','fc2','WeightsInitializer','he') reluLayer('Name','relu4') fullyConnectedLayer(64,'Name','fc3','WeightsInitializer','he') reluLayer('Name','relu5') fullyConnectedLayer(1,'Name','output')]; % Specify representation options for the actor and critic. actorOpts = rlRepresentationOptions('LearnRate',1e-4,'GradientThreshold',1); criticOpts = rlRepresentationOptions('LearnRate',1e-4,'GradientThreshold',1); % create actor and critic actor(idx) = rlStochasticActorRepresentation(actorNetWork,oinfo,ainfo,... 'Observation',{'observations'},actorOpts); critic(idx) = rlValueRepresentation(criticNetwork,oinfo,... 'Observation',{'observations'},criticOpts); end
Укажите параметры агента с помощью rlPPOAgentOptions. Используйте одни и те же параметры для всех трех агентов. Во время обучения агенты собирают опыт, пока не достигнут горизонта опыта 128 шагов, а затем тренируются из мини-партий из 64 переживаний. Коэффициент фиксации целевой функции 0,2 повышает стабильность обучения, а коэффициент дисконтирования 0,995 стимулирует долгосрочные вознаграждения.
opt = 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(actor(1),critic(1),opt); agentB = rlPPOAgent(actor(2),critic(2),opt); agentC = rlPPOAgent(actor(3),critic(3),opt); agents = [agentA,agentB,agentC];
Укажите следующие параметры обучения агентов.
Запустите тренировку максимум для 1000 эпизодов, с каждым эпизодом длительностью не более 5000 временных шагов.
Прекратите обучение агента, когда его среднее вознаграждение за 100 последовательных эпизодов составляет 80 или более.
trainOpts = rlTrainingOptions(... 'MaxEpisodes',1000,... 'MaxStepsPerEpisode',maxsteps,... 'Plots','training-progress',... 'ScoreAveragingWindowLength',100,... 'StopTrainingCriteria','AverageReward',... 'StopTrainingValue',80);
Чтобы обучить нескольких агентов, укажите массив агентов для train функция. Порядок агентов в массиве должен соответствовать порядку путей блоков агентов, указанному при создании среды. Это обеспечивает связь объектов агента с соответствующими спецификациями действий и наблюдения в среде.
Обучение - это вычислительно интенсивный процесс, который занимает несколько минут. Чтобы сэкономить время при выполнении этого примера, загрузите предварительно подготовленные параметры агента путем установки doTraining кому false. Чтобы обучить агента самостоятельно, установите doTraining кому true.
doTraining = false; if doTraining stats = train(agents,env,trainOpts); else load('rlAreaCoverageParameters.mat'); setLearnableParameters(agentA,agentAParams); setLearnableParameters(agentB,agentBParams); setLearnableParameters(agentC,agentCParams); end
На следующем рисунке показан снимок хода обучения. Можно ожидать разных результатов из-за случайности в тренировочном процессе.

Моделирование обученных агентов в среде. Дополнительные сведения о моделировании агентов см. в разделе rlSimulationOptions и sim.
rng(0) % reset the random seed simOpts = rlSimulationOptions('MaxSteps',maxsteps); experience = sim(env,agents,simOpts);

Агенты успешно охватывают весь сеточный мир.