Этот пример показывает, как обучить агент глубоко детерминированного градиента политики (DDPG) генерировать траектории для летающего робота, смоделированного в Simulink®. Для получения дополнительной информации об агентах DDPG смотрите Глубоко Детерминированные Агенты Градиента политики.
Среда обучения укрепления для этого примера является летающим роботом со своим начальным условием, рандомизированным вокруг звонка радиуса 15
m, где ориентация робота также рандомизируется. Робот имеет два ускорителя, смонтированные на стороне тела, которые используются, чтобы продвинуть и регулировать робота. Учебная цель состоит в том, чтобы управлять роботом от своего начального условия до направления источника на восток.
Откройте модель и начальную букву настройки образцовые переменные.
mdl = 'rlFlyingRobotEnv'; open_system(mdl); % initial model state variables theta0 = 0; x0 = -15; y0 = 0; % sample time Ts = 0.4; % simulation length Tf = 30;
Для этой модели:
Целевая ориентация является радианами 0
(направление робота на восток).
Тяга от каждого привода ограничена от -1
до 1
N
Наблюдения от среды являются положением, ориентация (синус и косинус ориентации), скорость и угловая скорость робота.
Вознаграждение , если в каждый такт:
где:
положение робота вдоль оси X.
положение робота вдоль оси Y.
ориентация робота.
усилие по управлению от левого ускорителя.
усилие по управлению от правильного ускорителя.
вознаграждение, когда робот близко к цели.
штраф, когда робот управляет вне 20
m или в x или в направлении Y. Симуляция отключена когда .
штраф QR, который штрафует расстояние от усилия по управлению и цели.
Чтобы обучить агент модели FlyingRobotEnv
, используйте функцию createIntegratedEnv
, чтобы автоматически сгенерировать интегрированную модель с блоком RL Agent, который готов к обучению.
integratedMdl = 'IntegratedFlyingRobot';
[~,agentBlk,observationInfo,actionInfo] = createIntegratedEnv(mdl,integratedMdl);
Прежде, чем создать объект среды, задайте имена для наблюдения и спецификаций действия, и связал действия тяги между -1
и 1
.
Сигналы наблюдения для этой среды .
% observation specification numObs = prod(observationInfo.Dimension); observationInfo.Name = 'observations';
Сигналы действия для этой среды .
% action specification numAct = prod(actionInfo.Dimension); actionInfo.LowerLimit = -ones(numAct,1); actionInfo.UpperLimit = ones(numAct,1); actionInfo.Name = 'thrusts';
Создайте интерфейс среды для летающего робота с rlSimulinkEnv
со сгенерированной моделью.
env = rlSimulinkEnv(integratedMdl,agentBlk,observationInfo,actionInfo);
Создайте пользовательскую функцию сброса, которая рандомизирует исходное положение робота вдоль звонка радиуса 15
m и начальная ориентация. Смотрите flyingRobotResetFcn
для деталей функции сброса.
env.ResetFcn = @(in) flyingRobotResetFcn(in);
Зафиксируйте случайный seed генератора для воспроизводимости.
rng(0)
Агент DDPG аппроксимирует долгосрочное вознаграждение, данное наблюдения и действия с помощью представления функции значения критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с двумя входными параметрами (наблюдение и действие) и один вывод. Для получения дополнительной информации о создании представления функции значения нейронной сети смотрите, Создают политику и Представления Функции Значения.
% specify the number of outputs for the hidden layers. hiddenLayerSize = 100; observationPath = [ imageInputLayer([numObs 1 1],'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 = [ imageInputLayer([numAct 1 1],'Normalization','none','Name','action') fullyConnectedLayer(hiddenLayerSize,'Name','fc5')]; % create the layerGraph criticNetwork = layerGraph(observationPath); criticNetwork = addLayers(criticNetwork,actionPath); % connect actionPath to obervationPath criticNetwork = connectLayers(criticNetwork,'fc5','add/in2');
Задайте опции для критика, использующего rlRepresentationOptions
.
criticOptions = rlRepresentationOptions('LearnRate',1e-03,'GradientThreshold',1);
Создайте представление критика с помощью заданной нейронной сети и опций. Необходимо также задать спецификацию действия и наблюдения для критика. Для получения дополнительной информации смотрите rlRepresentation
.
critic = rlRepresentation(criticNetwork,observationInfo,actionInfo,'Observation',{'observation'},'Action',{'action'},criticOptions);
Агент DDPG решает, какое действие взять дают наблюдениям с помощью представления агента. Чтобы создать агента, сначала создайте глубокую нейронную сеть с одним входом (наблюдение) и один вывод (действие).
Создайте агента подобным образом критику.
actorNetwork = [ imageInputLayer([numObs 1 1],'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 = rlRepresentation(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.Variance = 1e-1; agentOptions.NoiseOptions.VarianceDecayRate = 1e-6;
Затем создайте агент с помощью заданного представления агента, представления критика и опций агента. Для получения дополнительной информации смотрите rlDDPGAgent
.
agent = rlDDPGAgent(actor,critic,agentOptions);
Чтобы обучить агент, сначала задайте опции обучения. В данном примере используйте следующие опции:
Запустите каждое обучение в большинстве эпизодов 10000
с каждым эпизодом, длящимся на большинстве временных шагов ceil(Tf/Ts)
.
Отобразитесь учебный прогресс диалогового окна Episode Manager (установите опцию Plots
), и отключите отображение командной строки (установите опцию Verbose
).
Остановите обучение, когда агент получит среднее совокупное вознаграждение, больше, чем 415
более чем десять последовательных эпизодов. На данном этапе агент может управлять летающим роботом к целевой позиции.
Сохраните копию агента для каждого эпизода, где совокупное вознаграждение больше, чем 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);
Обучите агент с помощью функции train
. Это - в вычислительном отношении интенсивный процесс, который занимает несколько часов, чтобы завершиться. Чтобы сэкономить время при выполнении этого примера, загрузите предварительно обученный агент установкой doTraining
к false
. Чтобы обучить агент самостоятельно, установите doTraining
на true
.
doTraining = false; if doTraining % Train the agent. trainingStats = train(agent,env,trainingOptions); else % Load pretrained agent for the example. load('FlyingRobotDDPG.mat','agent') end
Чтобы подтвердить производительность обученного агента, моделируйте его в среде маятника. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions
и sim
.
simOptions = rlSimulationOptions('MaxSteps',maxsteps);
experience = sim(env,agent,simOptions);