exponenta event banner

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

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

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

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 - значения действия агентов А и В на последнем этапе времени.

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

FX = -1,0 Н, FY = -1,0 Н

FX = -1,0 Н, FY = 0

FX = -1,0 Н, FY = 1,0 Н

FX = 0, FY = -1,0 N

FX = 0, FY = 0

FX = 0, FY = 1,0 N

FX = 1,0 Н, FY = -1,0 Н

FX = 1,0 Н, FY = 0

FX = 1,0 Н, FY = 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 полагаются на представления актера и критика, чтобы узнать оптимальную политику. В этом примере агенты поддерживают аппроксиматоры функций на основе нейронной сети для актера и критика.

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

Выходами акторной сети являются вероятности (а) принятия каждой возможной пары действий в определённом состоянии. Создайте акторную нейронную сеть и представление.

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

Figure Multi Agent Collaborative Task contains an axes. The axes contains 5 objects of type rectangle, text.

Дополнительные сведения о моделировании агентов см. в разделе rlSimulationOptions и sim.

См. также

|

Связанные темы