Обучите агента RL адаптивному круиз-контролю с ограничительным осуществлением

В этом примере показано, как обучить агента обучения с подкреплением (RL) адаптивному круиз-контролю (ACC) с помощью ведомого исследования с блоком Constraint Enforcement.

Обзор

В этом примере цель состоит в том, чтобы сделать автомобильное перемещение эго при скорости набора при поддержании безопасного расстояния от ведущего автомобиля путем управления продольным ускорением и торможением. Этот пример использует те же модели транспортных средств и параметры как Обучение Агента DDPG для Адаптивного Круиз-контроля (Reinforcement Learning Toolbox) пример.

Установите случайный seed и сконфигурируйте параметры модели.

% set random seed
rng('default')
% parameters
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)
D_default = 10; % default spacing (m)
t_gap = 1.4;    % time gap (s)
v_set = 30;     % driver-set velocity (m/s)
amin_ego = -3;  % minimum acceleration for driver comfort (m/s^2)
amax_ego = 2;   % maximum acceleration for driver comfort (m/s^2)
Ts = 0.1;       % sample time (s)     
Tf = 60;        % duration (s)

Изучите уравнение ограничений

Для приложения ACC сигналы безопасности являются автомобильной скоростью эго v и относительное расстояние d между автомобилем эго и ведущим автомобилем. В этом примере ограничения для этих сигналов 10v30.5 и d5. Ограничения зависят от следующих состояний в x: автомобиль эго фактическое ускорение, автомобильная скорость эго, относительное расстояние и ведущая автомобильная скорость.

Действие u автомобильная ускоряющая команда эго. Следующее уравнение описывает сигналы безопасности в терминах действия и состояний.

[vk+1dk+1]=[f1(xk)f2(xk)]+[g1(xk)g2(xk)]uk

Блок Constraint Enforcement принимает ограничения формы fx+gxuc. В данном примере коэффициенты этой ограничительной функции следующие.

fx=[-f1(xk)-f2(xk)f1(xk)],gx=[-g1(xk)-g2(xk)g1(xk)],c=[-10-530.5]

Изучить неизвестные функции fi и gi, необходимо сначала собрать обучающие данные средой. Для этого сначала создайте среду RL с помощью rlLearnConstraintACC модель.

mdl = 'rlLearnConstraintACC';
open_system(mdl)

В этой модели блок RL Agent не генерирует действия. Вместо этого это сконфигурировано, чтобы передать случайное внешнее действие среде. Цель для использования модели сбора данных с неактивным блоком RL Agent состоит в том, чтобы гарантировать, что модель среды, настройки сигнала действия и наблюдения и функция сброса модели, используемая во время сбора данных, совпадают с используемыми во время последующего обучения агента.

Случайный сигнал внешнего действия равномерно распределен в области значений [-10,6]; то есть, автомобиль эго имеет максимальную мощность торможения -10 м/с^2 и максимальная ускоряющая степень 6 м/с^2.

Для обучения эти четыре наблюдения средой являются относительным расстоянием между транспортными средствами, скоростями вывода и автомобилей эго и автомобильного ускорения эго. Задайте непрерывное пространство наблюдений для этих значений.

obsInfo = rlNumericSpec([4 1]);

Действие, выведенное агентом, является ускоряющей командой. Создайте соответствующее непрерывное пространство действий с ускоряющими пределами.

actInfo = rlNumericSpec([1 1],'LowerLimit',-3,'UpperLimit',2);

Создайте среду RL для этой модели. Задайте функцию сброса, чтобы установить случайное положение для ведущего автомобиля в начале каждого эпизода тренировки или симуляции.

agentblk = [mdl '/RL Agent'];
env = rlSimulinkEnv(mdl,agentblk,obsInfo,actInfo);
env.ResetFcn = @(in)localResetFcn(in);

Затем создайте агента обучения с подкреплением DDPG, который поддерживает непрерывные действия и наблюдения, с помощью createDDPGAgentBACC функция помощника. Эта функция создает критика и представления актера на основе действия и спецификаций наблюдений и использует представления, чтобы создать агента DDPG.

agent = createDDPGAgentACC(Ts,obsInfo,actInfo);

Чтобы собрать данные, используйте collectDataACC функция помощника. Эта функция симулирует среду и агента и собирает получившиеся входные и выходные данные. Получившиеся обучающие данные имеют девять столбцов.

  • Относительное расстояние между автомобилями

  • Ведущая автомобильная скорость

  • Автомобильная скорость эго

  • Автомобиль эго фактическое ускорение

  • Ускоряющая команда эго

  • Относительное расстояние между автомобилями в следующем временном шаге

  • Ведущая автомобильная скорость в следующем временном шаге

  • Автомобильная скорость эго в следующем временном шаге

  • Автомобиль эго фактическое ускорение в следующем временном шаге

В данном примере загрузите предварительно собранные обучающие данные. Чтобы собрать данные самостоятельно, установите collectData к true.

collectData = false;
if collectData
    count = 1000;
    data = collectDataACC(env,agent,count);
else
    load trainingDataACC data
end

В данном примере движущие силы автомобиля эго и ведущего автомобиля линейны. Поэтому можно найти решение методом наименьших квадратов для ограничений сигнала безопасностью; то есть, v=RvI и d=RdI, где I [xk;uk].

% Extract state and input data.
I = data(1:1000,[4,3,1,2,5]);
% Extract data for the relative distance in the next time step
d = data(1:1000,6);
% Compute the relation from the state and input to relative distance.
Rd = I\d;
% Extract data for actual ego car velocity.
v = data(1:1000,8);
% Compute the relation from the state and input to ego car velocity.
Rv = I\v;

Подтвердите изученные ограничения с помощью validateConstraintACC функция помощника. Этот функциональные процессы входные обучающие данные с помощью изученных ограничений. Это затем сравнивает сетевой выход с учебным выходом и вычисляет среднеквадратическую ошибку (RMSE).

validateConstraintACC(data,Rd,Rv)
Test Data RMSE for Relative Distance  = 8.118162e-04
Test Data RMSE for Ego Velocity = 3.798159e-15

Маленькие значения RMSE указывают на успешное ограничительное изучение.

Обучите агента с ограничительным осуществлением

Чтобы обучить агента с ограничительным осуществлением, используйте rlACCwithConstraint модель. Эта модель ограничивает ускоряющую команду от агента прежде, чем применить его к среде.

mdl = 'rlACCwithConstraint';
open_system(mdl)

Чтобы просмотреть ограничительную реализацию, откройте Ограничительную подсистему. Здесь, модель генерирует значения fi и gi от линейных ограничительных отношений. Эти значения наряду с ограничительными границами отправляются в блок Constraint Enforcement.

Создайте среду RL с помощью этой модели. Спецификация действия эквивалентна для ограничительной среды обучения. Для обучения средой существует три наблюдения: интеграл ошибки скорости, ошибки скорости и скорости автомобиля эго.

Подсистема Среды генерирует isDone предупредите, когда критические ограничения нарушены — Любой, который автомобиль эго имеет отрицательную скорость (перемещения назад), или относительное расстояние меньше нуля (автомобиль эго сталкивается с ведущим автомобилем). РЛ Аджент использует этот сигнал отключить эпизоды тренировки рано.

obsInfo = rlNumericSpec([3 1]);
agentblk = [mdl '/RL Agent'];
env = rlSimulinkEnv(mdl,agentblk,obsInfo,actInfo);
env.ResetFcn = @(in)localResetFcn(in);

Начиная со спецификации наблюдений отличаются для обучения, необходимо также создать нового агента DDPG.

agent = createDDPGAgentACC(Ts,obsInfo,actInfo);

Задайте опции для обучения агент. Обучите агента самое большее 5 000 эпизодов. Остановите обучение, если вознаграждение эпизода превышает 260.

maxepisodes = 5000;
maxsteps = ceil(Tf/Ts);
trainingOpts = rlTrainingOptions(...
    'MaxEpisodes',maxepisodes,...
    'MaxStepsPerEpisode',maxsteps,...
    'Verbose',false,...
    'Plots','training-progress',...
    'StopTrainingCriteria','EpisodeReward',...
    'StopTrainingValue',260);

Обучите агента. Обучение является длительным процессом. В данном примере загрузите предварительно обученного агента. Чтобы обучить агента самостоятельно, установите trainAgent к true.

trainAgent = false;
if trainAgent
    trainingStats = train(agent,env,trainingOpts);
else
    load rlAgentConstraintACC agent
end

Следующий рисунок показывает учебные результаты.

Поскольку Общее количество Шагов равняется продукту Шагов Номера и Эпизода Эпизода, каждый эпизод тренировки запуски в конец без раннего завершения. Поэтому блок Constraint Enforcement гарантирует, что автомобиль эго никогда не нарушает критические ограничения.

Запустите обученного агента и просмотрите результаты симуляции.

x0_lead = 80;
sim(mdl)

Обучите агента без ограничений

Чтобы видеть преимущество обучения агента с ограничительным осуществлением, можно обучить агента без ограничений и сравнить учебные результаты с ограничительным случаем принудительного исполнения.

Чтобы обучить агента без ограничений, используйте rlACCwithoutConstraint модель. Эта модель применяет действия от агента непосредственно к среде, и агент использует то же действие и спецификации наблюдений.

mdl = 'rlACCwithoutConstraint';
open_system(mdl)

Создайте среду RL с помощью этой модели.

agentblk = [mdl '/RL Agent'];
env = rlSimulinkEnv(mdl,agentblk,obsInfo,actInfo);
env.ResetFcn = @(in)localResetFcn(in);

Создайте нового агента DDPG, чтобы обучаться. Этот агент имеет ту же настройку как агент, используемый в предыдущем обучении.

agent = createDDPGAgentACC(Ts,obsInfo,actInfo);

Обучите агента с помощью тех же опций обучения в качестве в ограничительном случае принудительного исполнения. В данном примере как с предыдущим обучением, загрузите предварительно обученного агента. Чтобы обучить агента самостоятельно, установите trainAgent к истине.

trainAgent = false;
if trainAgent
    trainingStats2 = train(agent,env,trainingOpts);
else
    load rlAgentACC agent
end

Следующий рисунок показывает учебные результаты.

Поскольку Общее количество Шагов меньше продукта Шагов Номера и Эпизода Эпизода, обучение включает эпизоды, которые завершили работу рано из-за нарушений ограничений.

Запустите обученного агента и постройте результаты симуляции.

x0_lead = 80;
sim(mdl)

bdclose('rlLearnConstraintACC')
bdclose('rlACCwithConstraint')
bdclose('rlACCwithoutConstraint')

Локальная функция сброса

function in = localResetFcn(in)
% Reset the initial position of the lead car.
in = setVariable(in,'x0_lead',40+randi(60,1,1));
end

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

Блоки

Похожие темы