В этом примере показано, как обучить агента обучения усилению (RL) адаптивному круиз-контролю (ACC) с использованием управляемого исследования с помощью блока «Обеспечение ограничений».
В этом примере целью является обеспечение движения эго-автомобиля с заданной скоростью при сохранении безопасного расстояния от ведущего автомобиля путем управления продольным ускорением и торможением. В этом примере используются те же модели транспортных средств и те же параметры, что и в примере Train DDPG Agent for Adaptive Cruise Control (Achimentation Learning Toolbox).
Задайте случайное начальное значение и настройте параметры модели.
% 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 сигналами безопасности являются скорость эго-автомобиля и относительное расстояние между эго-автомобилем и ведущим автомобилем. В этом примере ограничения для этих сигналов являются и . Ограничения зависят от следующих состояний в : фактическое ускорение эго-автомобиля, скорость эго-автомобиля, относительное расстояние и скорость ведущего автомобиля.
Действие - это команда ускорения эго-автомобиля. Следующее уравнение описывает сигналы безопасности в терминах действия и состояний.
xk) g2 (xk)] uk
Блок «Применение ограничений» принимает ограничения формы. Для этого примера коэффициенты этой функции ограничения следующие.
c = [-10-530.5]
Для изучения неизвестных функций и необходимо сначала собрать данные обучения из среды. Для этого сначала создайте среду RL с помощью rlLearnConstraintACC модель.
mdl = 'rlLearnConstraintACC';
open_system(mdl)
В этой модели блок агента RL не генерирует действия. Вместо этого он конфигурируется для передачи случайного внешнего действия в среду. Целью использования модели сбора данных с неактивным блоком агента RL является обеспечение соответствия модели среды, конфигураций сигналов действий и наблюдений и функции сброса модели, используемой во время сбора данных, тем, которые используются во время последующего обучения агента.
Сигнал случайного внешнего воздействия равномерно распределяется в диапазоне ]; то есть эго-автомобиль имеет максимальную тормозную мощность м/с ^ 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 функция помощника. Эта функция моделирует среду и агента и собирает результирующие входные и выходные данные. Полученные данные обучения содержат девять столбцов.
Относительное расстояние между вагонами
Скорость ведущего вагона
Скорость эго-автомобиля
Фактическое ускорение автомобиля Ego
Команда Ego acceleration
Относительное расстояние между автомобилями на следующем шаге времени
Скорость ведущего автомобиля на следующем шаге
Скорость автомобиля Ego на следующем шаге времени
Фактическое ускорение автомобиля Ego на следующем шаге времени
В этом примере выполняется загрузка предварительно собранных учебных данных. Чтобы собрать данные самостоятельно, установите collectData кому true.
collectData = false; if collectData count = 1000; data = collectDataACC(env,agent,count); else load trainingDataACC data end
Для этого примера динамика эго-автомобиля и ведущего автомобиля линейна. Поэтому можно найти решение с наименьшими квадратами для ограничений сигнала безопасности; то есть RvI RdI, где I ; 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)
Чтобы просмотреть реализацию ограничения, откройте подсистему ограничения. Здесь модель генерирует значения и из уравнений линейных ограничений. Эти значения вместе с границами ограничений отправляются в блок «Применение ограничений».

Создайте среду RL с помощью этой модели. Спецификация действия та же, что и для среды обучения ограничениям. Для обучения существует три наблюдения из окружающей среды: интеграл ошибки скорости, ошибки скорости и скорости эго-вагона.
Подсистема Environment генерирует isDone сигнал при нарушении критических ограничений - Либо эго-автомобиль имеет отрицательную скорость (движется назад), либо относительное расстояние меньше нуля (эго-автомобиль сталкивается с ведущим автомобилем). Агент 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
На следующем рисунке показаны результаты обучения.

Поскольку общее количество шагов равно произведению номера эпизода и шагов эпизода, каждый учебный эпизод проходит до конца без досрочного прекращения. Поэтому блок «Применение ограничений» гарантирует, что эго-автомобиль никогда не нарушает критических ограничений.
Запустите обученного агента и просмотрите результаты моделирования.
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