Обучите нескольких агентов для покрытия области

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

Мультиагент поддерживается только для окружений 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)

The 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 полагаются на представления актёра и критика, чтобы узнать оптимальную политику. В этом примере агенты поддерживают функциональные аппроксимации на основе глубоких нейронных сетей для актёра и критика. И у актёра, и у критика сходные структуры сети со свертками и полносвязными слоями. Критик выводит скалярное значение, представляющее значение состояния V(s). Актёр выводит вероятности π(a|s)выполнения каждого из пяти действий. Для получения дополнительной информации смотрите rlValueRepresentation и rlStochasticActorRepresentation.

Установите случайный seed для повторяемости.

rng(0)

Создайте представления актёра и критика используя следующие шаги.

  1. Создайте актёра и критика глубоких нейронных сетей.

  2. Задайте опции представления для актёра и критика. В этом примере задайте скорости обучения и пороги градиента. Для получения дополнительной информации смотрите rlRepresentationOptions.

  3. Создайте объекты представления актера и критика.

Используйте одну и ту же структуру сети и опции представления для всех трех агентов.

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);

Figure contains an axes. The axes with title Steps = 446, Coverage = 100.0% contains 30 objects of type image, line, rectangle.

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

См. также

|

Похожие темы