В этом примере показано, как обучить агента глубоко детерминированного градиента политики (DDPG) генерировать траектории для летающего робота, смоделированного в Simulink®. Для получения дополнительной информации об агентах DDPG смотрите Глубоко Детерминированных Агентов Градиента политики (Reinforcement Learning Toolbox).
Среда обучения с подкреплением для этого примера является летающим роботом со своим начальным условием, рандомизированным вокруг звонка радиуса 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
.
Сигналы наблюдения для этой среды .
numObs = prod(observationInfo.Dimension);
observationInfo.Name = 'observations';
Сигналы действия для этой среды .
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);
Для повторяемости результатов зафиксируйте начальное значение генератора случайных чисел.
rng(0)
Агент DDPG аппроксимирует долгосрочное вознаграждение, данное наблюдения и действия с помощью представления функции значения критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с двумя входными параметрами (наблюдение и действие) и один выход. Для получения дополнительной информации о создании представления функции значения нейронной сети смотрите, Создают политику и Представления Функции Значения (Reinforcement Learning Toolbox).
% 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);
Чтобы обучить агента, сначала задайте опции обучения. В данном примере используйте следующие опции:
Запустите каждое обучение самое большее 20000
эпизоды, с каждым эпизодом, длящимся в большей части 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,... 'SaveAgentCriteria',"EpisodeReward",... 'SaveAgentValue',415);
Обучите агента с помощью 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);