Обучайтесь агент DQN для хранения маршрута помогают

В этом примере показано, как обучить Глубокую Q-образовательную-сеть (DQN) агент для хранения маршрута помогает (LKA) в Simulink®. Для получения дополнительной информации об агентах DQN смотрите Глубоких Агентов Q-сети.

Модель Simulink для автомобиля эго

Среда обучения с подкреплением для этого примера является простой моделью велосипеда для динамики автомобиля, оборудованного датчиком. Учебная цель состоит в том, чтобы сохранить автомобиль, оборудованный датчиком, перемещающийся вдоль средней линии маршрутов путем корректировки переднего руководящего угла. Этот пример использует ту же модель транспортного средства, как в Маршруте Хранение Помогает Системе Используя Прогнозирующее Управление Модели (Model Predictive Control Toolbox) пример.

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 является передним руководящим углом автомобиля эго. Рассматривая физические ограничения автомобиля эго, держащийся угол ограничивается к области значений [-0.5 0.5] рад.

u_min = -0.5;
u_max = 0.5;

Искривление дороги задано постоянными 0.001 (m-1). Начальное значение для бокового отклонения составляет 0,2 м, и начальное значение для относительного угла отклонения от курса является-0.1 рад.

rho = 0.001;
e1_initial = 0.2;
e2_initial = -0.1;

Откройте модель.

mdl = 'rlLKAMdl';
open_system(mdl);
agentblk = [mdl '/RL Agent'];

Для этой модели:

  • Сигнал действия руководящего угла от агента до среды от-15 градусов до 15 градусов.

  • Наблюдения средой являются боковым отклонением e1, относительный угол отклонения от курса e2, их производные e˙1 и e˙2, и их интегралы e1 и e2.

  • Симуляция отключена когда боковое отклонение |e1|>1.

  • Вознаграждение rt, если на каждом временном шаге t:

rt=-(10e12+5e22+2u2+5e˙12+5e˙22)

где u вход управления от предыдущего временного шага t-1.

Создайте интерфейс среды

Создайте интерфейс среды обучения с подкреплением для автомобиля, оборудованного датчиком. Для этого сначала создайте наблюдение и спецификации действия.

% create observation info
observationInfo = rlNumericSpec([6 1],'LowerLimit',-inf*ones(6,1),'UpperLimit',inf*ones(6,1));
observationInfo.Name = 'observations';
observationInfo.Description = 'information on lateral deviation and relative yaw angle';
% create action Info
actionInfo = rlFiniteSetSpec((-15:15)*pi/180);
actionInfo.Name = 'steering';
% define environment
env = rlSimulinkEnv(mdl,agentblk,observationInfo,actionInfo);

Интерфейс имеет дискретный пробел действия, где агент может применить один из 31 возможного руководящего угла от-15 градусов до 15 градусов.

Чтобы задать начальное условие для бокового отклонения и относительного угла отклонения от курса, задайте функцию сброса среды использование указателя анонимной функции.

% randomize initial values for lateral deviation and relative yaw angle
env.ResetFcn = @(in)localResetFcn(in);

Для повторяемости результатов зафиксируйте начальное значение генератора случайных чисел.

rng(0)

Создайте агента DQN

Агент DQN аппроксимирует долгосрочное вознаграждение, данное наблюдения и действия с помощью представления функции значения критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с двумя входными параметрами, состоянием и действием и одним выходом. Для получения дополнительной информации о создании представления функции значения глубокой нейронной сети смотрите, Создают политику и Представления Функции Значения.

L = 24; % number of neurons
statePath = [
    imageInputLayer([6 1 1],'Normalization','none','Name','state')
    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 = [
    imageInputLayer([1 1 1],'Normalization','none','Name','action')
    fullyConnectedLayer(L,'Name','fc5')];

criticNetwork = layerGraph(statePath);
criticNetwork = addLayers(criticNetwork, actionPath);    
criticNetwork = connectLayers(criticNetwork,'fc5','add/in2');

Просмотрите конфигурацию сети критика.

figure
plot(criticNetwork)

Задайте опции для представления критика с помощью rlRepresentationOptions.

criticOptions = rlRepresentationOptions('LearnRate',1e-3,'GradientThreshold',1,'L2RegularizationFactor',1e-4);

Создайте представление критика с помощью заданной глубокой нейронной сети и опций. Необходимо также указать информацию действия и наблюдения для критика, которого вы получаете из интерфейса среды. Для получения дополнительной информации смотрите rlRepresentation.

critic = rlRepresentation(criticNetwork,observationInfo,actionInfo,...
    'Observation',{'state'},'Action',{'action'},criticOptions);

Чтобы создать агента DQN, сначала задайте опции агента DQN с помощью rlDQNAgentOptions.

agentOptions = rlDQNAgentOptions(...
    'SampleTime',Ts,...
    'UseDoubleDQN',true,...
    'TargetSmoothFactor',1e-3,...
    'DiscountFactor',0.99,...
    'ExperienceBufferLength',1e6,...
    'MiniBatchSize',64);

Затем создайте агента DQN с помощью заданного представления критика и опций агента. Для получения дополнительной информации смотрите rlDQNAgent.

agent = rlDQNAgent(critic,agentOptions);

Обучите агента

Чтобы обучить агента, сначала задайте опции обучения. В данном примере используйте следующие опции:

  • Запустите каждый эпизод тренировки для самое большее 5 000 эпизодов с каждым эпизодом, длящимся самое большее 150 временных шагов.

  • Отобразите прогресс обучения в диалоговом окне Episode Manager.

  • Остановите обучение, когда вознаграждение эпизода достигнет-1.

  • Сохраните копию агента для каждого эпизода, где совокупное вознаграждение больше -2.5.

Для получения дополнительной информации смотрите rlTrainingOptions.

maxepisodes = 5000;
maxsteps = ceil(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('SimulinkLKADQN.mat','agent')       
end

Симулируйте агента DQN

Чтобы подтвердить производительность обученного агента, не прокомментируйте следующие две линии и симулируйте ее в среде. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions и sim.

% simOptions = rlSimulationOptions('MaxSteps',maxsteps);
% experience = sim(env,agent,simOptions);

Чтобы продемонстрировать обученного агента на детерминированных начальных условиях, симулируйте модель в Simulink.

e1_initial = -0.4;
e2_initial = 0.2;
sim(mdl)

Как показано ниже, боковая ошибка (средний график) и относительный угол отклонения от курса (нижний график) оба управляется, чтобы обнулить. Транспортное средство начинает с от средней линии (-0.4 м) и ненулевая угловая погрешность отклонения от курса (0,2 рад). Хранение маршрута помогает, делает автомобиль эго, перемещающийся вдоль средней линии приблизительно 2,5 секунды. Держащийся угол (главный график) показывает, что контроллер достигает установившийся после 2 секунд.

Закройте модель Simulink.

bdclose(mdl)

Локальная функция

function in = localResetFcn(in)
% reset
in = setVariable(in,'e1_initial', 0.5*(-1+2*rand)); % random value for lateral deviation
in = setVariable(in,'e2_initial', 0.1*(-1+2*rand)); % random value for relative yaw angle
end

Смотрите также

Похожие темы