Этот пример показывает, как обучить агент глубоко детерминированного градиента политики (DDPG) адаптивному круиз-контролю (ACC) в Simulink®. Для получения дополнительной информации об агентах DDPG смотрите Глубоко Детерминированные Агенты Градиента политики.
Среда обучения укрепления для этого примера является простой продольной динамикой для автомобиля эго и ведущего автомобиля. Учебная цель состоит в том, чтобы сделать автомобильное перемещение эго в скорости набора при поддержании безопасного расстояния от ведущего автомобиля путем управления продольным ускорением и торможением. Этот пример использует ту же модель автомобиля в качестве Адаптивной Системы Круиз-контроля Используя Образцовое Прогнозирующее Управление (Model Predictive Control Toolbox) пример.
Задайте исходное положение и скорость для этих двух автомобилей.
x0_lead = 50; % initial position for lead car (m) v0_lead = 25; % initial velocity for lead car (m/s) x0_ego = 10; % initial position for ego car (m) v0_ego = 20; % initial velocity for ego car (m/s)
Задайте значение по умолчанию бездействия, располагающее с интервалами (m), разрыв (разрывы) времени и скорость набора драйверов (m/s).
D_default = 10; t_gap = 1.4; v_set = 30;
Рассматривая физические ограничения динамики аппарата, ускорение ограничивается к области значений [-3,2]
(m/s^2).
amin_ego = -3; amax_ego = 2;
Задайте шаг расчета Ts
и длительность симуляции Tf
в секундах.
Ts = 0.1; Tf = 60;
Откройте модель.
mdl = 'rlACCMdl'; open_system(mdl) agentblk = [mdl '/RL Agent'];
Для этой модели:
Ускоряющий сигнал действия от агента до среды от-3 до 2 m/s^2.
Ссылочная скорость для автомобиля эго задан можно следующим образом. Если относительное расстояние является меньше, чем безопасное расстояние, трамвайные пути эго минимум ведущей автомобильной скорости и скорости набора драйверов. Этим способом автомобиль эго поддерживает некоторое расстояние от ведущего автомобиля. Если относительное расстояние больше, чем безопасное расстояние, скорость набора драйверов трамвайных путей эго. В этом примере безопасное расстояние задано как линейная функция автомобиля эго продольная скорость ; то есть, . Безопасное расстояние определяет скорость отслеживания уставки для автомобиля эго.
Наблюдения от среды являются ошибкой скорости , его интеграл , и автомобиль эго продольная скорость .
Симуляция отключена, когда продольная скорость автомобиля эго - меньше чем 0, или относительное расстояние между ведущим автомобилем и автомобилем эго становится меньше чем 0.
Вознаграждение , если на каждом временном шаге :
где вход управления от предыдущего временного шага. Логическое значение если ошибка скорости , в противном случае .
Создайте интерфейс среды обучения укрепления для модели.
% create the observation info observationInfo = rlNumericSpec([3 1],'LowerLimit',-inf*ones(3,1),'UpperLimit',inf*ones(3,1)); observationInfo.Name = 'observations'; observationInfo.Description = 'information on velocity error and ego velocity'; % action Info actionInfo = rlNumericSpec([1 1],'LowerLimit',-3,'UpperLimit',2); actionInfo.Name = 'acceleration'; % define environment env = rlSimulinkEnv(mdl,agentblk,observationInfo,actionInfo);
Чтобы задать начальное условие для положения ведущего автомобиля, задайте функцию сброса среды использование указателя анонимной функции.
% randomize initial positions of lead car
env.ResetFcn = @(in)localResetFcn(in);
Зафиксируйте случайный seed генератора для воспроизводимости.
rng('default')
Агент DDPG аппроксимирует долгосрочное вознаграждение, данное наблюдения и действия с помощью представления функции значения критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с двумя входными параметрами, состоянием и действием и одним выводом. Для получения дополнительной информации о создании представления функции значения нейронной сети смотрите, Создают политику и Представления Функции Значения.
L = 48; % number of neurons statePath = [ imageInputLayer([3 1 1],'Normalization','none','Name','observation') fullyConnectedLayer(L,'Name','fc1') reluLayer('Name','relu1') fullyConnectedLayer(L,'Name','fc2') additionLayer(2,'Name','add') reluLayer('Name','relu2') fullyConnectedLayer(L,'Name','fc3') reluLayer('Name','relu3') fullyConnectedLayer(1,'Name','fc4')]; actionPath = [ imageInputLayer([1 1 1],'Normalization','none','Name','action') fullyConnectedLayer(L, 'Name', 'fc5')]; criticNetwork = layerGraph(statePath); criticNetwork = addLayers(criticNetwork, actionPath); criticNetwork = connectLayers(criticNetwork,'fc5','add/in2');
Просмотрите конфигурацию сети критика.
plot(criticNetwork)
Задайте опции для представления критика с помощью rlRepresentationOptions
.
criticOptions = rlRepresentationOptions('LearnRate',1e-3,'GradientThreshold',1,'L2RegularizationFactor',1e-4);
Создайте представление критика с помощью заданной нейронной сети и опций. Необходимо также задать информацию о действии и наблюдении для критика, которого вы получаете из интерфейса среды. Для получения дополнительной информации смотрите rlRepresentation
.
critic = rlRepresentation(criticNetwork,observationInfo,actionInfo,'Observation',{'observation'},'Action',{'action'},criticOptions);
Агент DDPG решает который действие взять данный наблюдения с помощью представления агента. Чтобы создать агента, сначала создайте глубокую нейронную сеть с одним входом, наблюдением, и одним выводом, действием.
Создайте агента так же критику.
actorNetwork = [ imageInputLayer([3 1 1],'Normalization','none','Name','observation') fullyConnectedLayer(L, 'Name','fc1') reluLayer('Name','relu1') fullyConnectedLayer(L, 'Name','fc2') reluLayer('Name','relu2') fullyConnectedLayer(L, 'Name','fc3') reluLayer('Name','relu3') fullyConnectedLayer(1,'Name','fc4') tanhLayer('Name','tanh1') scalingLayer('Name','ActorScaling1','Scale',2.5,'Bias',-0.5)]; actorOptions = rlRepresentationOptions('LearnRate',1e-4,'GradientThreshold',1,'L2RegularizationFactor',1e-4); actor = rlRepresentation(actorNetwork,observationInfo,actionInfo,'Observation',{'observation'},'Action',{'ActorScaling1'},actorOptions);
Чтобы создать агент DDPG, сначала задайте опции агента DDPG с помощью rlDDPGAgentOptions
.
agentOptions = rlDDPGAgentOptions(... 'SampleTime',Ts,... 'TargetSmoothFactor',1e-3,... 'ExperienceBufferLength',1e6,... 'DiscountFactor',0.99, ... 'MiniBatchSize',64); agentOptions.NoiseOptions.Variance = 0.6; agentOptions.NoiseOptions.VarianceDecayRate = 1e-5;
Затем создайте агент DDPG с помощью заданного представления агента, представления критика и опций агента. Для получения дополнительной информации смотрите rlDDPGAgent
.
agent = rlDDPGAgent(actor,critic,agentOptions);
Чтобы обучить агент, сначала задайте опции обучения. В данном примере используйте следующие опции:
Запустите каждый учебный эпизод для в большинстве эпизодов 5000
с каждым эпизодом, длящимся самое большее 600 временных шагов.
Отобразите учебный прогресс диалогового окна Episode Manager.
Остановите обучение, когда агент получит вознаграждение эпизода, больше, чем 260.
Для получения дополнительной информации смотрите rlTrainingOptions
.
maxepisodes = 5000; maxsteps = ceil(Tf/Ts); trainingOpts = rlTrainingOptions(... 'MaxEpisodes',maxepisodes, ... 'MaxStepsPerEpisode',maxsteps, ... 'Verbose',false, ... 'Plots','training-progress',... 'StopTrainingCriteria','EpisodeReward',... 'StopTrainingValue',260);
Обучите агент с помощью функции train
. Это - в вычислительном отношении интенсивный процесс, который занимает несколько минут, чтобы завершиться. Чтобы сэкономить время при выполнении этого примера, загрузите предварительно обученный агент установкой doTraining
к false
. Чтобы обучить агент самостоятельно, установите doTraining
на true
.
doTraining = false; if doTraining % Train the agent. trainingStats = train(agent,env,trainingOpts); else % Load pretrained agent for the example. load('SimulinkACCDDPG.mat','agent') end
Чтобы подтвердить производительность обученного агента, не прокомментируйте следующие команды и моделируйте его в окружении Simulink. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions
и sim
.
% simOptions = rlSimulationOptions('MaxSteps',maxsteps); % experience = sim(env,agent,simOptions);
Чтобы продемонстрировать обученный агент с помощью детерминированных начальных условий, моделируйте модель в Simulink.
x0_lead = 80; sim(mdl)
Следующие графики показывают результаты симуляции, когда ведущий автомобиль 70 (m) перед автомобилем эго.
За первые 28 секунд относительное расстояние больше, чем безопасное расстояние (нижний график), поэтому скорость набора трамвайных путей эго (средний график). Чтобы убыстриться и достигнуть скорости набора, ускорение положительно (главный график).
С 28 до 60 секунд относительное расстояние является меньше, чем безопасное расстояние (нижний график), поэтому трамвайные пути эго минимум ведущей скорости и скорости набора. С 28 до 36 секунд ведущая скорость является меньше, чем скорость набора (средний график). Чтобы замедлиться и отследить ведущую автомобильную скорость, ускорение отрицательно (главный график). С 36 до 60 секунд автомобиль эго настраивает свое ускорение, чтобы отследить ссылочную скорость тесно (средний график). В этом временном интервале трамвайные пути эго скорость набора с 43 до 52 секунд и дорожек приводит скорость с 36 до 43 секунд и 52 - 60 секунд.
Закройте модель Simulink.
bdclose(mdl)
function in = localResetFcn(in) % reset initial position of lead car in = setVariable(in,'x0_lead',40+randi(60,1,1)); end
MATLAB и Simulink являются зарегистрированными торговыми марками MathWorks, Inc. См. www.mathworks.com/trademarks для списка других товарных знаков, принадлежавших MathWorks, Inc. Другим продуктом или фирменными знаками являются товарные знаки или зарегистрированные торговые марки их соответствующих владельцев.