В этом примере показано, как обучить агента глубокого детерминированного градиента политики (DDPG) генерировать траектории для летающего робота, смоделированного в Simulink ®. Дополнительные сведения об агентах DDPG см. в разделе Агенты градиента глубокой детерминированной политики (инструментарий обучения для усиления).
Среда обучения армированию для этого примера - летающий робот с его начальным состоянием, рандомизированным вокруг кольца радиуса 15 м. Ориентация робота также рандомизирована. Робот имеет два двигателя малой тяги, установленных на боковой стороне корпуса, которые используются для приведения в движение и управления роботом. Цель обучения заключается в том, чтобы переместить робота из его начального состояния в начало, обращенное на восток.
Откройте модель.
mdl = 'rlFlyingRobotEnv';
open_system(mdl)Задайте переменные начального состояния модели.
theta0 = 0; x0 = -15; y0 = 0;
Определение времени выборки Ts и продолжительность моделирования Tf.
Ts = 0.4; Tf = 30;
Для этой модели:
Ориентация цели 0 рад (робот, обращенный на восток).
Тяга от каждого привода ограничена от -1 кому 1 N
Наблюдениями из окружающей среды являются положение, ориентация (синус и косинус ориентации), скорость и угловая скорость робота.
Вознаграждение предоставляется на каждом шаге времени
2) < 0,5)
|yt|≥20)
0,03yt2 + 0,02startt 2)
r2 + r3
где:
- положение робота вдоль оси X.
- положение робота вдоль оси Y.
- ориентация робота.
- управляющее усилие левого двигателя малой тяги.
- это управляющее усилие от правого двигателя малой тяги.
- награда, когда робот близок к цели.
- штраф, если робот выходит за рамки 20 m в направлении x или y. Моделирование прекращается, когда 0.
- это QR-штраф, который штрафует расстояние от цели и контрольных усилий.
Обучение агента для FlyingRobotEnv модель, используйте createIntegratedEnv функция для автоматического создания интегрированной модели с блоком агента RL, готовым к обучению.
integratedMdl = 'IntegratedFlyingRobot';
[~,agentBlk,observationInfo,actionInfo] = createIntegratedEnv(mdl,integratedMdl);Перед созданием объекта среды укажите имена для спецификаций наблюдения и действия и свяжите действия тяги между -1 и 1.
Сигналы наблюдения для этой среды представляют собой ˙]T.
numObs = prod(observationInfo.Dimension);
observationInfo.Name = 'observations';Сигналы действия для этой среды представляют собой ] T.
numAct = prod(actionInfo.Dimension);
actionInfo.LowerLimit = -ones(numAct,1);
actionInfo.UpperLimit = ones(numAct,1);
actionInfo.Name = 'thrusts';Создайте интерфейс среды для летающего робота с помощью интегрированной модели.
env = rlSimulinkEnv(integratedMdl,agentBlk,observationInfo,actionInfo);
Создание пользовательской функции сброса, которая рандомизирует начальное положение робота вдоль кольца радиуса 15 m и первоначальная ориентация. Для получения подробной информации о функции сброса см. flyingRobotResetFcn.
env.ResetFcn = @(in) flyingRobotResetFcn(in);
Зафиксируйте начальное число случайного генератора для воспроизводимости.
rng(0)
Агент DDPG аппроксимирует долгосрочное вознаграждение, данное наблюдениям и действиям, используя представление функции значения критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с двумя входами (наблюдение и действие) и одним выходом. Дополнительные сведения о создании представления функции значений нейронной сети см. в разделе Создание представлений функций политик и значений (панель обучения по усилению).
% Specify the number of outputs for the hidden layers. hiddenLayerSize = 100; observationPath = [ featureInputLayer(numObs,'Normalization','none','Name','observation') fullyConnectedLayer(hiddenLayerSize,'Name','fc1') reluLayer('Name','relu1') fullyConnectedLayer(hiddenLayerSize,'Name','fc2') additionLayer(2,'Name','add') reluLayer('Name','relu2') fullyConnectedLayer(hiddenLayerSize,'Name','fc3') reluLayer('Name','relu3') fullyConnectedLayer(1,'Name','fc4')]; actionPath = [ featureInputLayer(numAct,'Normalization','none','Name','action') fullyConnectedLayer(hiddenLayerSize,'Name','fc5')]; % Create the layer graph. criticNetwork = layerGraph(observationPath); criticNetwork = addLayers(criticNetwork,actionPath); % Connect actionPath to observationPath. criticNetwork = connectLayers(criticNetwork,'fc5','add/in2');
Укажите параметры для критика с помощью rlRepresentationOptions(Панель инструментов для обучения усилению).
criticOptions = rlRepresentationOptions('LearnRate',1e-03,'GradientThreshold',1);
Создайте критическое представление, используя указанную нейронную сеть и опции. Необходимо также указать действие и спецификацию наблюдения для критика. Дополнительные сведения см. в разделе rlQValueRepresentation(Панель инструментов для обучения усилению).
critic = rlQValueRepresentation(criticNetwork,observationInfo,actionInfo,... 'Observation',{'observation'},'Action',{'action'},criticOptions);
Агент DDPG решает, какое действие следует предпринять для данных наблюдений, используя представление актера. Для создания актёра сначала создать глубокую нейронную сеть с одним входом (наблюдение) и одним выходом (действие).
Построить актера аналогично критику. Дополнительные сведения см. в разделе rlDeterministicActorRepresentation(Панель инструментов для обучения усилению).
actorNetwork = [
featureInputLayer(numObs,'Normalization','none','Name','observation')
fullyConnectedLayer(hiddenLayerSize,'Name','fc1')
reluLayer('Name','relu1')
fullyConnectedLayer(hiddenLayerSize,'Name','fc2')
reluLayer('Name','relu2')
fullyConnectedLayer(hiddenLayerSize,'Name','fc3')
reluLayer('Name','relu3')
fullyConnectedLayer(numAct,'Name','fc4')
tanhLayer('Name','tanh1')];
actorOptions = rlRepresentationOptions('LearnRate',1e-04,'GradientThreshold',1);
actor = rlDeterministicActorRepresentation(actorNetwork,observationInfo,actionInfo,...
'Observation',{'observation'},'Action',{'tanh1'},actorOptions);Для создания агента DDPG сначала укажите параметры агента DDPG с помощью rlDDPGAgentOptions(Панель инструментов для обучения усилению).
agentOptions = rlDDPGAgentOptions(... 'SampleTime',Ts,... 'TargetSmoothFactor',1e-3,... 'ExperienceBufferLength',1e6 ,... 'DiscountFactor',0.99,... 'MiniBatchSize',256); agentOptions.NoiseOptions.StandardDeviation = 1e-1; agentOptions.NoiseOptions.StandardDeviationDecayRate = 1e-6;
Затем создайте агента, используя указанное представление актера, представление критика и параметры агента. Дополнительные сведения см. в разделе rlDDPGAgent(Панель инструментов для обучения усилению).
agent = rlDDPGAgent(actor,critic,agentOptions);
Для обучения агента сначала укажите варианты обучения. В этом примере используются следующие опции:
Запускать каждое обучение максимум для 20000 эпизоды, причем каждый эпизод длится не более ceil(Tf/Ts) временные шаги.
Отображение хода обучения в диалоговом окне «Менеджер эпизодов» (установите Plots и отключите отображение командной строки (установите Verbose опция для false).
Прекратить обучение, когда агент получает среднее совокупное вознаграждение, превышающее 415 более 10 последовательных серий. В этот момент агент может привести летающего робота в положение цели.
Сохраните копию агента для каждого эпизода, где совокупное вознаграждение больше 415.
Дополнительные сведения см. в разделе rlTrainingOptions(Панель инструментов для обучения усилению).
maxepisodes = 20000; maxsteps = ceil(Tf/Ts); trainingOptions = rlTrainingOptions(... 'MaxEpisodes',maxepisodes,... 'MaxStepsPerEpisode',maxsteps,... 'StopOnError',"on",... 'Verbose',false,... 'Plots',"training-progress",... 'StopTrainingCriteria',"AverageReward",... 'StopTrainingValue',415,... 'ScoreAveragingWindowLength',10,... 'SaveAgentCriteria',"EpisodeReward",... 'SaveAgentValue',415);
Обучение агента с помощью train(Панель инструментов обучения для усиления). Обучение - это интенсивный вычислительный процесс, который занимает несколько часов. Чтобы сэкономить время при выполнении этого примера, загрузите предварительно подготовленный агент путем установки doTraining кому false. Чтобы обучить агента самостоятельно, установите doTraining кому true.
doTraining = false; if doTraining % Train the agent. trainingStats = train(agent,env,trainingOptions); else % Load the pretrained agent for the example. load('FlyingRobotDDPG.mat','agent') end

Для проверки производительности обученного агента смоделируйте агента в среде. Дополнительные сведения о моделировании агентов см. в разделе rlSimulationOptions(инструментарий для обучения по усилению) и sim(Панель инструментов для обучения усилению).
simOptions = rlSimulationOptions('MaxSteps',maxsteps);
experience = sim(env,agent,simOptions);
rlDDPGAgent(инструментарий для обучения по усилению) | train(инструментарий для обучения по усилению)