В этом примере показано, как обучить агента глубоко детерминированного градиента политики (DDPG) хранению маршрута помогает (LKA) в Simulink. Чтобы сделать обучение более эффективным, агент агента DDPG инициализируется глубокой нейронной сетью, которая была ранее обучена с помощью контролируемого изучения. Этот обученный агент обучен в Подражать Контроллере MPC Хранению Маршрута, Помогают примеру.
Для получения дополнительной информации об агентах DDPG смотрите Глубоко Детерминированных Агентов Градиента политики.
Цель обучения для сохраняющего маршрут приложения должна сохранить автомобиль, оборудованный датчиком, перемещающийся вдоль средней линии маршрут путем корректировки переднего руководящего угла. Этот пример использует ту же динамику автомобиля, оборудованного датчиком и динамику датчика, как Обучение Агента DQN для Хранения Маршрута Помогает примеру.
m = 1575; % total vehicle mass (kg) Iz = 2875; % yaw moment of inertia (mNs^2) lf = 1.2; % longitudinal distance from center of gravity to front tires (m) lr = 1.6; % longitudinal distance from center of gravity to rear tires (m) Cf = 19000; % cornering stiffness of front tires (N/rad) Cr = 33000; % cornering stiffness of rear tires (N/rad) Vx = 15; % longitudinal velocity (m/s)
Задайте шаг расчета, Ts
, и длительность симуляции, T
, в секундах.
Ts = 0.1; T = 15;
Выход системы LKA является передним руководящим углом автомобиля, оборудованного датчиком. При рассмотрении физических ограничений автомобиля, оборудованного датчиком ограничьте его руководящий угол к области значений [-60,60] степени. Задайте ограничения в радианах.
u_min = -1.04; u_max = 1.04;
Задайте искривление дороги как постоянные 0.001 ().
rho = 0.001;
Установите начальные значения для бокового отклонения (e1_initial
) и относительный угол рыскания (e2_initial
). Во время обучения эти начальные условия установлены к случайным значениям для каждого эпизода тренировки.
e1_initial = 0.2; e2_initial = -0.1;
Откройте модель.
mdl = 'rlActorLKAMdl';
open_system(mdl)
Задайте путь к блоку RL Agent в модели.
agentblk = [mdl '/RL Agent'];
Создайте интерфейс среды обучения с подкреплением для автомобиля, оборудованного датчиком. Для этого сначала задайте спецификации наблюдений и спецификации действия. Эти наблюдения и действия эквивалентны, функции контролируемого изучения, используемого в, Подражают, Контроллер MPC для Хранения Маршрута Помогают.
Эти шесть наблюдений для среды являются поперечной скоростью , уровень рыскания , боковое отклонение , относительный угол рыскания , регулирование угла на предыдущем шаге , и искривление .
observationInfo = rlNumericSpec([6 1],... 'LowerLimit',-inf*ones(6,1),'UpperLimit',inf*ones(6,1)); observationInfo.Name = 'observations';
Действие для среды является передним руководящим углом. Задайте держащиеся угловые ограничения при создании объекта спецификации действия.
actionInfo = rlNumericSpec([1 1],'LowerLimit',u_min,'UpperLimit',u_max); actionInfo.Name = 'steering';
В модели блок Signal Processing for LKA создает сигнал вектора наблюдения, вычисляет премиальную функцию и вычисляет сигнал остановки.
Вознаграждение , если на каждом временном шаге , можно следующим образом, где вход управления от предыдущего временного шага .
Симуляция останавливается когда .
Создайте среду обучения с подкреплением.
env = rlSimulinkEnv(mdl,agentblk,observationInfo,actionInfo);
Чтобы задать начальное условие для бокового отклонения и относительного угла рыскания, задайте функцию сброса среды использование указателя анонимной функции. localResetFcn
функция, которая задана в конце примера, устанавливает начальное боковое отклонение и относительный угол рыскания к случайным значениям.
env.ResetFcn = @(in)localResetFcn(in);
Для повторяемости результатов зафиксируйте начальное значение генератора случайных чисел.
rng(0)
Агент DDPG аппроксимирует долгосрочные премиальные заданные наблюдения и действия с помощью представления функции ценности критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с двумя входными параметрами, состоянием и действием и одним выходом. Для получения дополнительной информации о создании представления функции ценности глубокой нейронной сети смотрите, Создают Представления Функции ценности и политика.
critic = createLaneKeepingCritic(observationInfo,actionInfo);
Агент DDPG решает который действие взять заданные наблюдения с помощью представления актера. Чтобы создать агента, сначала создайте глубокую нейронную сеть с одним входом (наблюдение) и один выход (действие).
[actor,actorOptions] = createLaneKeepingActor(observationInfo,actionInfo);
Они подписывают агента, и сети критика имеют случайные начальные значения параметров.
Чтобы создать агента DDPG, сначала задайте опции агента DDPG.
agentOptions = rlDDPGAgentOptions(... 'SampleTime',Ts,... 'TargetSmoothFactor',1e-3,... 'ExperienceBufferLength',1e6,... 'DiscountFactor',0.99,... 'MiniBatchSize',64 ... ); agentOptions.NoiseOptions.Variance = 0.3; agentOptions.NoiseOptions.VarianceDecayRate = 1e-5;
Создайте агента DDPG с помощью заданного представления актера, представления критика и опций агента. Для получения дополнительной информации смотрите rlDDPGAgent
.
agent = rlDDPGAgent(actor,critic,agentOptions);
Как базовая линия, обучите агента с агентом, который имеет случайные начальные параметры. Чтобы обучить агента, сначала задайте опции обучения. В данном примере используйте следующие опции.
Запустите обучение самое большее 50 000 эпизодов с каждым эпизодом, длящимся самое большее 150 временных шагов.
Отобразите прогресс обучения в диалоговом окне Episode Manager.
Остановите обучение, когда вознаграждение эпизода достигнет –1.
Сохраните копию агента для каждого эпизода, где совокупное вознаграждение больше –2.5
.
Для получения дополнительной информации смотрите rlTrainingOptions
.
maxepisodes = 50000; maxsteps = T/Ts; trainingOpts = rlTrainingOptions(... 'MaxEpisodes',maxepisodes,... 'MaxStepsPerEpisode',maxsteps,... 'Verbose',false,... 'Plots','training-progress',... 'StopTrainingCriteria','EpisodeReward',... 'StopTrainingValue',-1,... 'SaveAgentCriteria','EpisodeReward',... 'SaveAgentValue',-2.5);
Обучите агента с помощью train
функция. Обучение является в вычислительном отношении интенсивным процессом, который занимает несколько часов, чтобы завершиться. Чтобы сэкономить время при выполнении этого примера, загрузите предварительно обученного агента установкой doTraining
к false
. Чтобы обучить агента самостоятельно, установите doTraining
к true
.
doTraining = false; if doTraining % Train the agent. trainingStats = train(agent,env,trainingOpts); else % Load pretrained agent for the example. load('ddpgFromScratch.mat'); end
Можно установить сеть агента агента к глубокой нейронной сети, которая была ранее обучена. В данном примере используйте глубокую нейронную сеть от Подражать Диспетчера MPC для Хранения Маршрута, Помогают примеру. Эта сеть была обучена, чтобы подражать прогнозирующему контроллеру модели, использующему контролируемое изучение.
Загрузите предварительно обученную сеть агента.
load('imitateMPCNetActorObj.mat','imitateMPCNetObj');
Создайте представление актера с помощью предварительно обученного агента.
supervisedActor = rlDeterministicActorRepresentation(imitateMPCNetObj,observationInfo,actionInfo, ... 'Observation',imitateMPCNetObj.InputNames,'Action',{'Scale1'},actorOptions);
Проверяйте что сеть, используемая supervisedActor
тот же, который загрузился. Для этого оцените и сеть и агента с помощью того же случайного входного наблюдения.
testData = rand(6,1);
Оцените глубокую нейронную сеть.
predictImNN = predict(imitateMPCNetObj,testData');
Оцените агента.
evaluateRLRep = getAction(supervisedActor,{testData});
Сравнение результатов.
error = evaluateRLRep{:} - predictImNN
error = single
2.2352e-08
Создайте агента DDPG с помощью предварительно обученного агента.
agent = rlDDPGAgent(supervisedActor,critic,agentOptions);
Сократите максимальное количество эпизодов тренировки и обучите агента с помощью train
функция. Чтобы сэкономить время при выполнении этого примера, загрузите предварительно обученного агента установкой doTraining
к false
. Чтобы обучить агента самостоятельно, установите doTraining
к true
.
trainingOpts.MaxEpisodes = 5000; doTraining = false; if doTraining % Train the agent. trainingStats = train(agent,env,trainingOpts); else % Load pretrained agent for the example. load('ddpgFromPretrained.mat'); end
При помощи предварительно обученной сети агента обучение агента DDPG более эффективно. И общее учебное время и общее количество учебных шагов улучшились приблизительно на 20%. Кроме того, количество эпизодов для обучения приблизиться к окружению оптимального результата, уменьшенного от приблизительно 4 500 до приблизительно 3 500.
Чтобы подтвердить производительность обученного агента, не прокомментируйте следующие две линии и симулируйте ее в среде. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions
и sim
.
% simOptions = rlSimulationOptions('MaxSteps',maxsteps); % experience = sim(env,agent,simOptions);
Чтобы проверять производительность обученного агента в модели Simulink, симулируйте модель с помощью ранее заданных начальных условий (e1_initial = 0.2
и e2_initial = -0.1
).
sim(mdl)
Как показано ниже, боковая ошибка (средний график) и относительный угол рыскания (нижний график) оба управляется, чтобы обнулить. Транспортное средство запускается с бокового отклонения от средней линии (0,2 м) и ненулевой угловой погрешности рыскания (-0.1 рад). Сохраняющий маршрут контроллер делает перемещение автомобиля, оборудованного датчиком вдоль средней линии приблизительно после двух секунд. Держащийся угол (главный график) показывает, что контроллер достигает устойчивого состояния приблизительно после двух секунд.
Закройте модель Simulink, не сохраняя изменений.
bdclose(mdl)
function in = localResetFcn(in) % Set random value for lateral deviation. in = setVariable(in,'e1_initial', 0.5*(-1+2*rand)); % Set random value for relative yaw angle. in = setVariable(in,'e2_initial', 0.1*(-1+2*rand)); end function agent = loadPretrainedParams(agent,actorParams,criticParams) % Set actor parameters. actor = getActor(agent); pretrainedActor = setLearnableParameters(actor,actorParams); % Set critic parameters. critic = getCritic(agent); pretrainedCritic = setLearnableParameters(critic,criticParams); % Set actor and critic representations in the agent. agent = setActor(agent,pretrainedActor); agent = setCritic(agent,pretrainedCritic); end