В этом примере показано, как обучить агента глубоко детерминированного градиента политики (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]
м/с^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 м/с^2.
Ссылочная скорость для автомобиля эго определяется следующим образом. Если относительное расстояние меньше безопасного расстояния, трамвайные пути эго минимум ведущей автомобильной скорости и скорости набора драйверов. Этим способом автомобиль эго обеспечивает некоторое расстояние от ведущего автомобиля. Если относительное расстояние больше безопасного расстояния, трамвайные пути эго скорость набора драйверов. В этом примере безопасное расстояние задано как линейная функция автомобиля эго продольная скорость ; то есть, . Безопасное расстояние определяет скорость отслеживания уставки для автомобиля эго.
Наблюдения средой являются ошибкой скорости , его интеграл , и автомобиль эго продольная скорость .
Симуляция отключена, когда продольная скорость автомобиля эго меньше 0, или относительное расстояние между ведущим автомобилем и автомобилем эго становится меньше чем 0.
Вознаграждение , если на каждом временном шаге ,
где вход управления от предыдущего временного шага. Логическое значение если ошибка скорости ; в противном случае, .
Создайте интерфейс среды обучения с подкреплением для модели.
Создайте спецификацию наблюдений.
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';
Создайте спецификацию действия.
actionInfo = rlNumericSpec([1 1],'LowerLimit',-3,'UpperLimit',2); actionInfo.Name = 'acceleration';
Создайте интерфейс среды.
env = rlSimulinkEnv(mdl,agentblk,observationInfo,actionInfo);
Чтобы задать начальное условие для положения ведущего автомобиля, задайте функцию сброса среды использование указателя анонимной функции. Функция сброса localResetFcn
, то, которое задано в конце примера, рандомизирует исходное положение ведущего автомобиля.
env.ResetFcn = @(in)localResetFcn(in);
Для повторяемости результатов зафиксируйте начальное значение генератора случайных чисел.
rng('default')
Агент DDPG аппроксимирует долгосрочные премиальные заданные наблюдения и действия с помощью представления функции ценности критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с двумя входными параметрами, состоянием и действием и одним выходом. Для получения дополнительной информации о создании представления функции ценности нейронной сети смотрите, Создают Представления Функции ценности и политика.
L = 48; % number of neurons statePath = [ featureInputLayer(3,'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 = [ featureInputLayer(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);
Создайте представление критика с помощью заданной нейронной сети и опций. Необходимо также задать информацию о действии и наблюдении для критика, которого вы получаете из интерфейса среды. Для получения дополнительной информации смотрите rlQValueRepresentation
.
critic = rlQValueRepresentation(criticNetwork,observationInfo,actionInfo,... 'Observation',{'observation'},'Action',{'action'},criticOptions);
Агент DDPG решает который действие взять заданные наблюдения при помощи представления актера. Чтобы создать агента, сначала создайте глубокую нейронную сеть с одним входом, наблюдением, и одним выходом, действием.
Создайте агента так же критику. Для получения дополнительной информации смотрите rlDeterministicActorRepresentation
.
actorNetwork = [ featureInputLayer(3,'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 = rlDeterministicActorRepresentation(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.StandardDeviation = 0.6; agentOptions.NoiseOptions.StandardDeviationDecayRate = 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 a 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 the initial position of the lead car. in = setVariable(in,'x0_lead',40+randi(60,1,1)); end