В этом примере показано, как обучить агента глубокого детерминированного градиента политики (DDPG) адаптивному круиз-контролю (ACC) в Simulink ®. Дополнительные сведения об агентах DDPG см. в разделе Агенты градиента глубокой детерминированной политики.
Среда обучения армированию для этого примера представляет собой простую продольную динамику для эго-автомобиля и ведущего автомобиля. Целью обучения является обеспечение движения эго-автомобиля с заданной скоростью при сохранении безопасного расстояния от ведущего автомобиля путем управления продольным ускорением и торможением. В этом примере используется та же модель транспортного средства, что и в примере адаптивной системы круиз-контроля с использованием модельного прогнозирующего управления (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.
Опорная скорость для эго-вагона определяется следующим образом. Если относительное расстояние меньше безопасного расстояния, эго-автомобиль отслеживает минимальную скорость ведущего автомобиля и заданную водителем скорость. Таким образом, эго-вагон сохраняет некоторое расстояние от ведущего вагона. Если относительное расстояние больше безопасного расстояния, эго-автомобиль отслеживает заданную водителем скорость. В этом примере безопасное расстояние определяется как линейная функция продольной скорости эго-вагона; то есть Ddefault. Безопасное расстояние определяет контрольную скорость слежения за эго-автомобилем.
Наблюдениями из окружающей среды являются погрешность скорости Vref-Vego, ее ∫e и продольная V эго-вагона.
Моделирование завершается, когда продольная скорость эго-вагона меньше 0, или относительное расстояние между ведущим вагоном и эго-вагоном становится меньше 0.
Вознаграждение , предоставляемое на каждом шаге , равно
ut-12) + Mt
где - управляющий вход предыдущего временного шага. Логическое значение 1, если скорости
Создайте интерфейс среды обучения армированию для модели.
Создайте спецификацию наблюдения.
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 tracks устанавливает скорость (средний график). Для ускорения и достижения заданной скорости ускорение является положительным (верхний график).
От 28 до 60 секунд относительное расстояние меньше, чем безопасное расстояние (нижний график), поэтому эго-автомобиль отслеживает минимум скорости вывода и заданную скорость. От 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