В этом примере показано, как обучить агента обучения с подкреплением (RL) для адаптивного круиз-контроля (ACC) с помощью управляемого исследования с блоком Constraint Enforcement.
В этом примере цель состоит в том, чтобы заставить эго-автомобиль перемещаться с заданной скоростью при сохранении безопасного расстояния от головного автомобиля путем управления продольным ускорением и торможением. Этот пример использует те же модели и параметры транспортного средства, что и пример Train DDPG Agent для адаптивного круиз-контроля (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 сигналами безопасности являются скорость ego-автомобиля и относительное расстояние между эго-машиной и ведущей машиной. В этом примере ограничения для этих сигналов и . Ограничения зависят от следующих состояний в : ego автомобиль фактическое ускорение, скорость ego автомобиль, относительное расстояние, и скорость свинцового автомобиля.
Действие - команда ускорения ego car. Следующее уравнение описывает сигналы безопасности в терминах действия и состояний.
Блок Constraint Enforcement принимает ограничения формы . В данном примере коэффициенты этой ограничительной функции следующие.
Чтобы узнать неизвестные функции и Сначала необходимо собрать обучающие данные из окружения. Для этого сначала создайте окружение RL с помощью rlLearnConstraintACC
модель.
mdl = 'rlLearnConstraintACC';
open_system(mdl)
В этой модели блок Агент не генерирует действия. Вместо этого он сконфигурирован для передачи случайного внешнего действия в окружение. Цель использования модели сбора данных с неактивным блоком RL Agent состоит в том, чтобы гарантировать, что модели окружения, строения сигналов действия и наблюдения и функция сброса модели, используемые во время набора данных, совпадают с теми, которые используются во время последующего обучения агента.
Случайный сигнал внешнего действия равномерно распределен в области значений ; то есть эго-автомобиль имеет максимальную степень торможения m/s ^ 2 и максимальная степень ускорения м/с ^ 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
вспомогательная функция. Эта функция моделирует окружение и агента и собирает получившиеся входные и выходные данные. Получившиеся обучающие данные имеют девять столбцов.
Относительное расстояние между автомобилями
Скорость головного автомобиля
Скорость Ego автомобиля
Ego автомобиль фактическое ускорение
Команда ускорения Ego
Относительное расстояние между автомобилями на следующем временном шаге
Скорость головного автомобиля на следующем временном шаге
Скорость Ego автомобиля на следующем временном шаге
Ego автомобиль фактическое ускорение на следующем временном шаге
В данном примере загружает предварительно собранные обучающие данные. Чтобы собрать данные самостоятельно, установите collectData
на true
.
collectData = false; if collectData count = 1000; data = collectDataACC(env,agent,count); else load trainingDataACC data end
В данном примере динамика ego-автомобиля и свинцового автомобиля линейная. Поэтому можно найти решение методом наименьших квадратов для ограничений сигнала безопасности; то есть, и , где является .
% 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)
Чтобы просмотреть реализацию ограничений, откройте Подсистему ограничений. Здесь модель генерирует значения и от линейных ограничительных уравнений. Эти значения вместе с ограничениями отправляются в блок «Принудительное применение ограничений».
Создайте окружение RL с помощью этой модели. Спецификация действия такая же, как и для окружения ограничения-обучения. Для обучения существует три наблюдения от окружения: интеграл ошибки скорости, ошибка скорости и скорость ego-car.
Подсистема Окружения генерирует isDone
сигнал, когда критические ограничения нарушены - Либо ego автомобиль имеет отрицательную скорость (движется назад), либо относительное расстояние меньше нуля (ego автомобиль сталкивается с ведущим автомобилем). Агент RL использует этот сигнал для раннего завершения эпизодов тренировки.
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);
Укажите опции для настройки агента. Обучите агента на самое большее 5000 эпизодов. Остановите обучение, если вознаграждение эпизода превышает 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 гарантирует, что ego car никогда не нарушает критические ограничения.
Запустите обученного агента и просмотрите результаты симуляции.
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
к true.
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