В этом примере показано, как обучить агента обучения с подкреплением (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 сигналы безопасности являются автомобильной скоростью эго и относительное расстояние между автомобилем эго и ведущим автомобилем. В этом примере ограничения для этих сигналов и . Ограничения зависят от следующих состояний в : автомобиль эго фактическое ускорение, автомобильная скорость эго, относительное расстояние и ведущая автомобильная скорость.
Действие автомобильная ускоряющая команда эго. Следующее уравнение описывает сигналы безопасности в терминах действия и состояний.
Блок Constraint Enforcement принимает ограничения формы . В данном примере коэффициенты этой ограничительной функции следующие.
Изучить неизвестные функции и , необходимо сначала собрать обучающие данные средой. Для этого сначала создайте среду 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
В данном примере движущие силы автомобиля эго и ведущего автомобиля линейны. Поэтому можно найти решение методом наименьших квадратов для ограничений сигнала безопасностью; то есть, и , где .
% 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 = 5.967300e-15
Маленькие значения RMSE указывают на успешное ограничительное изучение.
Чтобы обучить агента с ограничительным осуществлением, используйте rlACCwithConstraint
модель. Эта модель ограничивает ускоряющую команду от агента прежде, чем применить его к среде.
mdl = 'rlACCwithConstraint';
open_system(mdl)
Чтобы просмотреть ограничительную реализацию, откройте Ограничительную подсистему. Здесь, модель генерирует значения и от линейных ограничительных отношений. Модель отправляет эти значения наряду с ограничительными границами с блоком Constraint Enforcement.
Создайте среду RL с помощью этой модели. Спецификация действия эквивалентна для ограничительной среды обучения. Для обучения среда производит три наблюдения: интеграл ошибки скорости, ошибки скорости и скорости автомобиля эго.
Подсистема Среды генерирует isDone
предупредите, когда критические ограничения нарушены — любой, который автомобиль эго имеет отрицательную скорость (перемещения назад), или относительное расстояние меньше нуля (автомобиль эго сталкивается с ведущим автомобилем). Блок RL Agent использует этот сигнал отключить эпизоды тренировки рано.
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