В этом примере показано, как обучить агент оптимизации проксимальной политики (PPO) с дискретным пространством действия для посадки ракеты на землю. Дополнительные сведения об агентах PPO см. в разделе Агенты оптимизации проксимальной политики.

Среда в этом примере представляет собой 3-DOF ракету, представленную круговым диском с массой. Ракета имеет два двигателя малой тяги для движения вперед и вращения. Сила тяжести действует вертикально вниз, и силы аэродинамического сопротивления отсутствуют. Целью обучения является посадка робота на землю в указанном месте.
Для этой среды:
Движение ракеты ограничено в X (горизонтальная ось) от -100 до 100 метров и Y (вертикальная ось) от 0 до 120 метров.
Положение цели составляет (0,0) метров, а ориентация цели - 0 радиан.
Максимальная тяга, применяемая каждым двигателем, составляет 8,5 Н.
Время выборки составляет 0,1 секунды.
Наблюдениями из окружающей среды являются положение ракеты ), ориентация ), скорость ), угловая скорость ) и показания датчика, который обнаруживает грубую посадку (-1), мягкую посадку (1) или состояние воздушной посадки (0). Наблюдения нормализуются между -1 и 1.
В начале каждого эпизода ракета начинается со случайного начального положения x и ориентации. Высота всегда сбрасывается до 100 метров.
Вознаграждение , предоставленное на временном шаге , является следующим.
y˙t≥-0.5 & & |x˙t|≤0.5)
Здесь:
xt,yt,x˙t, а - положения и скорости ракеты по осям x и y.
- нормированное расстояние ракеты от положения цели.
- нормированная скорость ракеты.
и - максимальные расстояния и скорости.
- ориентация относительно вертикальной оси.
и - значения действия для левого и правого двигателей малой тяги.
- разреженное вознаграждение за мягкую посадку с горизонтальной и вертикальной скоростями менее 0,5 м/с.
Создайте среду MATLAB для ракетного спускаемого аппарата с помощью RocketLander класс.
env = RocketLander;
Получение спецификаций наблюдения и действий из среды.
actionInfo = getActionInfo(env); observationInfo = getObservationInfo(env); numObs = observationInfo.Dimension(1); numAct = numel(actionInfo.Elements);
Установка времени образца для среды
Ts = 0.1;
Зафиксируйте начальное число случайного генератора для воспроизводимости.
rng(0)
Агент PPO в этом примере работает в пространстве дискретного действия. На каждом шаге времени агент выбирает одну из следующих пар дискретных действий.
+right (высоко)
Здесь = 0,5 H = 1,0 являются нормированными значениями тяги для каждого двигателя малой тяги.
Для оценки политики и функции значения агент поддерживает аппроксиматоры функций для актера и критика, которые моделируются с использованием глубоких нейронных сетей. Обучение может быть чувствительным к первоначальным весам сети и смещениям, а результаты могут варьироваться в зависимости от различных наборов значений. В этом примере веса сети произвольно инициализируются до малых значений.
Создайте глубокую нейронную сеть критика с шестью входами и одним выходом. Выход сети критиков - дисконтированное долгосрочное вознаграждение за входные наблюдения.
criticLayerSizes = [400 300];
actorLayerSizes = [400 300];
criticNetwork = [
featureInputLayer(numObs,'Normalization','none','Name','observation')
fullyConnectedLayer(criticLayerSizes(1),'Name','CriticFC1', ...
'Weights',sqrt(2/numObs)*(rand(criticLayerSizes(1),numObs)-0.5), ...
'Bias',1e-3*ones(criticLayerSizes(1),1))
reluLayer('Name','CriticRelu1')
fullyConnectedLayer(criticLayerSizes(2),'Name','CriticFC2', ...
'Weights',sqrt(2/criticLayerSizes(1))*(rand(criticLayerSizes(2),criticLayerSizes(1))-0.5), ...
'Bias',1e-3*ones(criticLayerSizes(2),1))
reluLayer('Name','CriticRelu2')
fullyConnectedLayer(1,'Name','CriticOutput', ...
'Weights',sqrt(2/criticLayerSizes(2))*(rand(1,criticLayerSizes(2))-0.5), ...
'Bias',1e-3)];Создайте представление критика.
criticOpts = rlRepresentationOptions('LearnRate',1e-4); critic = rlValueRepresentation(criticNetwork,observationInfo,'Observation',{'observation'},criticOpts);
Создайте актера с помощью глубокой нейронной сети с шестью входами и двумя выходами. Выходами сети акторов являются вероятности принятия каждой возможной пары действий. Каждая пара действий содержит нормированные значения действий для каждого двигателя малой тяги. Окружающая среда step функция масштабирует эти значения для определения фактических значений тяги.
actorNetwork = [featureInputLayer(numObs,'Normalization','none','Name','observation') fullyConnectedLayer(actorLayerSizes(1),'Name','ActorFC1', ... 'Weights',sqrt(2/numObs)*(rand(actorLayerSizes(1),numObs)-0.5), ... 'Bias',1e-3*ones(actorLayerSizes(1),1)) reluLayer('Name','ActorRelu1') fullyConnectedLayer(actorLayerSizes(2),'Name','ActorFC2', ... 'Weights',sqrt(2/actorLayerSizes(1))*(rand(actorLayerSizes(2),actorLayerSizes(1))-0.5), ... 'Bias',1e-3*ones(actorLayerSizes(2),1)) reluLayer('Name', 'ActorRelu2') fullyConnectedLayer(numAct,'Name','Action', ... 'Weights',sqrt(2/actorLayerSizes(2))*(rand(numAct,actorLayerSizes(2))-0.5), ... 'Bias',1e-3*ones(numAct,1)) softmaxLayer('Name','actionProb')];
Создайте актера с помощью стохастического представления актера.
actorOpts = rlRepresentationOptions('LearnRate',1e-4); actor = rlStochasticActorRepresentation(actorNetwork,observationInfo,actionInfo,... 'Observation',{'observation'},actorOpts);
Укажите гиперпараметры агента с помощью rlPPOAgentOptions объект.
agentOpts = rlPPOAgentOptions(... 'ExperienceHorizon',600,... 'ClipFactor',0.02,... 'EntropyLossWeight',0.01,... 'MiniBatchSize',128,... 'NumEpoch',3,... 'AdvantageEstimateMethod','gae',... 'GAEFactor',0.95,... 'SampleTime',Ts,... 'DiscountFactor',0.997);
Для этих гиперпараметров:
Агент собирает переживания, пока не достигнет горизонта переживания 600 шагов или прекращения эпизода, а затем тренируется из мини-партий 128 переживаний в течение 3 эпох.
Для повышения стабильности тренировок используйте коэффициент фиксации целевой функции 0,02.
Коэффициент дисконтирования 0,997 стимулирует долгосрочные вознаграждения.
Дисперсию в выходе критиков уменьшают с помощью метода Обобщенная оценка преимущества с коэффициентом GAE 0,95.
EntropyLossWeight срок в 0,01 увеличивает геологоразведку во время обучения.
Создайте агента PPO.
agent = rlPPOAgent(actor,critic,agentOpts);
Для обучения агента PPO укажите следующие параметры обучения.
Запустите тренировку максимум для 20000 эпизодов, причем каждый эпизод длится не более 600 временных шагов.
Остановите обучение, когда среднее вознаграждение за 100 последовательных эпизодов составляет 430 или более.
Сохраните копию агента для каждого эпизода, где награда за эпизод составляет 700 или более.
trainOpts = rlTrainingOptions(... 'MaxEpisodes',20000,... 'MaxStepsPerEpisode',600,... 'Plots','training-progress',... 'StopTrainingCriteria','AverageReward',... 'StopTrainingValue',430,... 'ScoreAveragingWindowLength',100,... 'SaveAgentCriteria',"EpisodeReward",... 'SaveAgentValue',700);
Обучение агента с помощью train функция. Из-за сложности среды процесс обучения является вычислительно интенсивным и занимает несколько часов. Чтобы сэкономить время при выполнении этого примера, загрузите предварительно подготовленный агент путем установки doTraining кому false.
doTraining = false; if doTraining trainingStats = train(agent,env,trainOpts); else load('rocketLanderAgent.mat'); end
Пример сеанса обучения показан ниже. Фактические результаты могут варьироваться из-за случайности в процессе обучения.

Постройте график среды спускаемого аппарата для визуализации моделирования.
plot(env)
Моделирование обучаемого агента в среде. Дополнительные сведения о моделировании агентов см. в разделе rlSimulationOptions и sim.
simOptions = rlSimulationOptions('MaxSteps',600); simOptions.NumSimulations = 5; % simulate the environment 5 times experience = sim(env,agent,simOptions);
