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

В этом примере показано, как настроить сеанс обучения мультиагента на среде 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 перемещается вне кругового звонка.

  • На каждом временном шаге агенты получают следующее вознаграждение:

rA=rglobal+rlocal,ArB=rglobal+rlocal,Brglobal=0.001dcrlocal,A=-0.005dAC-0.008uA2rlocal,B=-0.005dBC-0.008uB2

Здесь:

  • rAи rB вознаграждения, полученные агентами A и B, соответственно.

  • rglobal вознаграждение команды, которое получено обоими агентами, когда объект C придвигается поближе к контуру звонка.

  • rlocal,A и rlocal,B локальные штрафы, полученные агентами A и B на основе их расстояний от объекта C и величины действия от последнего временного шага.

  • dC расстояние объекта C от центра звонка.

  • dAC и dBC расстояния между агентом A и объектом C и агентом B и объектом C, соответственно.

  • uA и uB значения действия агентов A и B от последнего временного шага.

Этот пример использует агентов ближайшей оптимизации политики (PPO) с дискретными пространствами действий. Чтобы узнать больше об агентах PPO, смотрите Ближайших Агентов Оптимизации политики. Агенты прикладывают внешние силы на роботах тот результат в движении. На каждом временном шаге агенты выбирают действия uA,B=[FX,FY], где FX,FY одна из следующих пар внешне приложенных сил.

FX=-1.0N,  FY=-1.0N

FX=-1.0N,  FY=0

FX=-1.0N,  FY=1.0N

FX=0,               FY=-1.0N

FX=0,               FY=0

FX=0,               FY=1.0N

FX=1.0N,     FY=-1.0N

FX=1.0N,     FY=0

FX=1.0N,     FY=1.0N

Создайте среду

Чтобы создать среду мультиагента, задайте пути к блоку агентов с помощью массива строк. Кроме того, задайте спецификацию наблюдений и объекты спецификации действия с помощью массивов ячеек. Порядок объектов спецификации в массиве ячеек должен совпадать с порядком, заданным в массиве блока 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 используют представления актёра и критика, чтобы изучить оптимальную политику. В этом примере агенты обеспечивают основанные на нейронной сети функциональные аппроксимации для агента и критика.

Создайте нейронную сеть критика и представление. Выход сети критика является функцией ценности состояния V(s) для состояния 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);

Выходные параметры сети агента являются вероятностями π(a|s)из взятия каждой возможной пары действия в определенном состоянии 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 шагов или завершение эпизода не достигнуты, и затем обучайтесь от мини-пакетов 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.

Смотрите также

|

Похожие темы