В этом примере показано, как обучить агента глубокого детерминированного градиента политики (DDPG) для адаптивного круиз-контроля (ACC) в Simulink ®. Дополнительные сведения об агентах DDPG см. в разделе Агенты градиента глубокой детерминированной политики.
Окружение обучения с подкреплением для этого примера является простой продольной динамикой для эго-автомобиля и свинцового автомобиля. Цель обучения состоит в том, чтобы заставить эго-автомобиль перемещаться с заданной скоростью при сохранении безопасного расстояния от свинцового автомобиля путем управления продольным ускорением и торможением. В этом примере используется та же модель транспортного средства, что и в примере Adaptive Cruise Control System Using Model Predictive Control (Model Predictive Control Toolbox).
Укажите начальное положение и скорость для двух транспортных средств.
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)
Задайте интервалы по умолчанию (m), промежутки времени и заданную драйвером скорость (m/s).
D_default = 10; t_gap = 1.4; v_set = 30;
Чтобы симулировать физические ограничения динамики аппарата, ограничьте ускорение до области значений [–3,2]
м/с ^ 2.
amin_ego = -3; amax_ego = 2;
Определите шаг расчета Ts
и длительность симуляции Tf
в секундах.
Ts = 0.1; Tf = 60;
Откройте модель.
mdl = 'rlACCMdl'; open_system(mdl) agentblk = [mdl '/RL Agent'];
Для этой модели:
Сигнал действия ускорения от агента к окружению от -3 до 2 м/с ^ 2.
Исходная скорость для ego-автомобиля определяется следующим образом. Если относительное расстояние меньше безопасного расстояния, эго-вагон отслеживает минимум скорости свинцового вагона и установленной водителем скорости. Таким образом эго-машина сохраняет некоторое расстояние от головной машины. Если относительное расстояние больше безопасного расстояния, ego-автомобиль отслеживает заданную водителем скорость. В этом примере безопасное расстояние определяется как линейная функция продольной скорости ego-автомобиля ; то есть, . Безопасное расстояние определяет скорость отслеживания уставки для эго-автомобиля.
Наблюдения от окружения являются ошибкой скорости , его интеграл , и продольная скорость ego-автомобиля .
Симуляция прекращается, когда продольная скорость эго-автомобиля меньше 0, или относительное расстояние между головным автомобилем и эго-автомобилем становится меньше 0.
Вознаграждение , предоставляется в каждый временной шаг является
где является управляющим входом от предыдущего временного шага. Логическое значение если ошибка скорости ; в противном случае, .
Создайте интерфейс окружения обучения с подкреплением для модели.
Создайте спецификацию наблюдений.
observationInfo = rlNumericSpec([3 1],'LowerLimit',-inf*ones(3,1),'UpperLimit',inf*ones(3,1)); observationInfo.Name = 'observations'; observationInfo.Description = 'information on velocity error and ego velocity';
Создайте спецификацию действия.
actionInfo = rlNumericSpec([1 1],'LowerLimit',-3,'UpperLimit',2); actionInfo.Name = 'acceleration';
Создайте интерфейс окружения.
env = rlSimulinkEnv(mdl,agentblk,observationInfo,actionInfo);
Чтобы определить начальное условие положения головного автомобиля, задайте функцию сброса окружения с помощью указателя анонимной функции. Функция сброса localResetFcn
, который задан в конце примера, рандомизирует начальное положение головного автомобиля.
env.ResetFcn = @(in)localResetFcn(in);
Исправьте начальное значение генератора для повторяемости.
rng('default')
Агент DDPG аппроксимирует долгосрочное вознаграждение, заданное наблюдениями и действиями, используя представление функции ценности критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с двумя входами, состоянием и действием и одним выходом. Для получения дополнительной информации о создании представления функции ценности нейронной сети, смотрите, Создают политику и Представления функции ценности.
L = 48; % number of neurons statePath = [ featureInputLayer(3,'Normalization','none','Name','observation') fullyConnectedLayer(L,'Name','fc1') reluLayer('Name','relu1') fullyConnectedLayer(L,'Name','fc2') additionLayer(2,'Name','add') reluLayer('Name','relu2') fullyConnectedLayer(L,'Name','fc3') reluLayer('Name','relu3') fullyConnectedLayer(1,'Name','fc4')]; actionPath = [ featureInputLayer(1,'Normalization','none','Name','action') fullyConnectedLayer(L, 'Name', 'fc5')]; criticNetwork = layerGraph(statePath); criticNetwork = addLayers(criticNetwork, actionPath); criticNetwork = connectLayers(criticNetwork,'fc5','add/in2');
Просмотрите строение критика.
plot(criticNetwork)
Задайте опции для представления критика используя rlRepresentationOptions
.
criticOptions = rlRepresentationOptions('LearnRate',1e-3,'GradientThreshold',1,'L2RegularizationFactor',1e-4);
Создайте представление критика с помощью заданной нейронной сети и опций. Вы также должны задать информацию о действии и наблюдении для критика, которую вы получаете из интерфейса окружения. Для получения дополнительной информации смотрите rlQValueRepresentation
.
critic = rlQValueRepresentation(criticNetwork,observationInfo,actionInfo,... 'Observation',{'observation'},'Action',{'action'},criticOptions);
Агент DDPG решает, какое действие взять заданные наблюдения с помощью представления актера. Чтобы создать актёра, сначала создайте глубокую нейронную сеть с одним входом, наблюдением и одним выходом, действием.
Построение актёра подобно критику. Для получения дополнительной информации смотрите rlDeterministicActorRepresentation
.
actorNetwork = [ featureInputLayer(3,'Normalization','none','Name','observation') fullyConnectedLayer(L,'Name','fc1') reluLayer('Name','relu1') fullyConnectedLayer(L,'Name','fc2') reluLayer('Name','relu2') fullyConnectedLayer(L,'Name','fc3') reluLayer('Name','relu3') fullyConnectedLayer(1,'Name','fc4') tanhLayer('Name','tanh1') scalingLayer('Name','ActorScaling1','Scale',2.5,'Bias',-0.5)]; actorOptions = rlRepresentationOptions('LearnRate',1e-4,'GradientThreshold',1,'L2RegularizationFactor',1e-4); actor = rlDeterministicActorRepresentation(actorNetwork,observationInfo,actionInfo,... 'Observation',{'observation'},'Action',{'ActorScaling1'},actorOptions);
Чтобы создать агента DDPG, сначала задайте опции агента DDPG, используя rlDDPGAgentOptions
.
agentOptions = rlDDPGAgentOptions(... 'SampleTime',Ts,... 'TargetSmoothFactor',1e-3,... 'ExperienceBufferLength',1e6,... 'DiscountFactor',0.99,... 'MiniBatchSize',64); agentOptions.NoiseOptions.StandardDeviation = 0.6; agentOptions.NoiseOptions.StandardDeviationDecayRate = 1e-5;
Затем создайте агента DDPG с помощью заданного представления актера, представления критика и опций агента. Для получения дополнительной информации смотрите rlDDPGAgent
.
agent = rlDDPGAgent(actor,critic,agentOptions);
Чтобы обучить агента, сначала укажите опции обучения. В данном примере используйте следующие опции:
Запускайте каждый эпизод тренировки самое большее для 5000
эпизоды с каждым эпизодом, длящимся самое большее 600 временных шагов.
Отображение процесса обучения в диалоговом окне Диспетчер эпизодов.
Остановите обучение, когда агент получит вознаграждение за эпизод, больше 260.
Для получения дополнительной информации смотрите rlTrainingOptions
.
maxepisodes = 5000; maxsteps = ceil(Tf/Ts); trainingOpts = rlTrainingOptions(... 'MaxEpisodes',maxepisodes,... 'MaxStepsPerEpisode',maxsteps,... 'Verbose',false,... 'Plots','training-progress',... 'StopTrainingCriteria','EpisodeReward',... 'StopTrainingValue',260);
Обучите агента с помощью train
функция. Обучение является интенсивным в вычислительном отношении процессом, который занимает несколько минут. Чтобы сэкономить время при запуске этого примера, загрузите предварительно обученного агента путем установки doTraining
на false
. Чтобы обучить агента самостоятельно, установите doTraining
на true
.
doTraining = false; if doTraining % Train the agent. trainingStats = train(agent,env,trainingOpts); else % Load a pretrained agent for the example. load('SimulinkACCDDPG.mat','agent') end
Чтобы подтвердить производительность обученного агента, симулируйте агент в окружение Simulink, отключив следующие команды. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions
и sim
.
% simOptions = rlSimulationOptions('MaxSteps',maxsteps); % experience = sim(env,agent,simOptions);
Чтобы продемонстрировать обученного агента с помощью детерминированных начальных условий, симулируйте модель в Simulink.
x0_lead = 80; sim(mdl)
Следующие графики показывают результаты симуляции, когда свинцовый автомобиль на 70 (м) опережает эго-автомобиль.
В первые 28 секунд относительное расстояние больше безопасного расстояния (нижний график), поэтому ego car отслеживает установленную скорость (средний график). Чтобы ускорить и достичь установленной скорости, ускорение положительно (верхний график).
От 28 до 60 секунд относительное расстояние меньше безопасного расстояния (нижнего графика), поэтому ego car отслеживает минимум скорости вывода и задает скорость. От 28 до 36 секунд скорость вывода меньше заданной скорости (средний график). Чтобы замедлить и отследить скорость свинцового автомобиля, ускорение отрицательно (верхний график). От 36 до 60 секунд эго-машина настраивает свое ускорение, чтобы внимательно отслеживать исходную скорость (средний график). В течение этого временного интервала эго-машина отслеживает установленную скорость от 43 до 52 секунд и отслеживает скорость свинца от 36 до 43 секунд и от 52 до 60 секунд.
Закройте модель Simulink.
bdclose(mdl)
function in = localResetFcn(in) % Reset the initial position of the lead car. in = setVariable(in,'x0_lead',40+randi(60,1,1)); end