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

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

Модель Simulink

Окружение обучения с подкреплением для этого примера является простой продольной динамикой для эго-автомобиля и свинцового автомобиля. Цель обучения состоит в том, чтобы заставить эго-автомобиль перемещаться с заданной скоростью при сохранении безопасного расстояния от свинцового автомобиля путем управления продольным ускорением и торможением. В этом примере используется та же модель транспортного средства, что и в примере Adaptive Cruise Control System Using Model Predictive Control (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.

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

  • Наблюдения от окружения являются ошибкой скорости e=Vref-Vego, его интеграл e, и продольная скорость ego-автомобиля 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 временных шагов.

  • Отображение процесса обучения в диалоговом окне Диспетчер эпизодов.

  • Остановите обучение, когда агент получит вознаграждение за эпизод, больше 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 (м) опережает эго-автомобиль.

  • В первые 28 секунд относительное расстояние больше безопасного расстояния (нижний график), поэтому ego car отслеживает установленную скорость (средний график). Чтобы ускорить и достичь установленной скорости, ускорение положительно (верхний график).

  • От 28 до 60 секунд относительное расстояние меньше безопасного расстояния (нижнего графика), поэтому ego car отслеживает минимум скорости вывода и задает скорость. От 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

См. также

Похожие темы