Обучите агента DDPG адаптивному круиз-контролю

В этом примере показано, как обучить агента глубоко детерминированного градиента политики (DDPG) адаптивному круиз-контролю (ACC) в Simulink®. Для получения дополнительной информации об агентах DDPG смотрите Глубоко Детерминированных Агентов Градиента политики.

Модель Simulink

Среда обучения с подкреплением для этого примера является простой продольной динамикой для автомобиля эго и ведущего автомобиля. Цель обучения должна сделать автомобильное перемещение эго при скорости набора при поддержании безопасного расстояния от ведущего автомобиля путем управления продольным ускорением и торможением. Этот пример использует ту же модель транспортного средства в качестве Адаптивной Системы Круиз-контроля Используя Прогнозирующее Управление Модели (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.

  • Ссылочная скорость для автомобиля эго Vref определяется следующим образом. Если относительное расстояние меньше безопасного расстояния, трамвайные пути эго минимум ведущей автомобильной скорости и скорости набора драйверов. Этим способом автомобиль эго обеспечивает некоторое расстояние от ведущего автомобиля. Если относительное расстояние больше безопасного расстояния, трамвайные пути эго скорость набора драйверов. В этом примере безопасное расстояние задано как линейная функция автомобиля эго продольная скорость V; то есть, tgap*V+Ddefault. Безопасное расстояние определяет скорость отслеживания уставки для автомобиля эго.

  • Наблюдения средой являются ошибкой скорости e=Vref-Vego, его интеграл e, и автомобиль эго продольная скорость V.

  • Симуляция отключена, когда продольная скорость автомобиля эго меньше 0, или относительное расстояние между ведущим автомобилем и автомобилем эго становится меньше чем 0.

  • Вознаграждение rt, если на каждом временном шаге t,

rt=-(0.1et2+ut-12)+Mt

где ut-1 вход управления от предыдущего временного шага. Логическое значение Mt=1 если ошибка скорости et2<=0.25; в противном случае, Mt=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

Агент 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)

Figure contains an axes. The axes contains an object of type graphplot.

Задайте опции для представления критика с помощью 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

Симулируйте агента DDPG

Чтобы подтвердить производительность обученного агента, симулируйте агента в окружении 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

Смотрите также

Похожие темы