Этот пример показывает, как обучить агента градиента политики (PG) для балансировки системы тележки с шестом, смоделированной в MATLAB ®. Дополнительные сведения об агентах PG см. в разделе «Агенты градиента политики ».
Для примера, который обучает агента PG с базовым уровнем, смотрите Обучите агента PG с базовым уровнем для управления системой Double Integrator.
Окружение обучения с подкреплением для этого примера является шестом, прикрепленным к неактуированному соединению на тележке, которое перемещается по безфрикционной дорожке. Цель обучения состоит в том, чтобы сделать маятник стоять вертикально, не опускаясь.
Для этого окружения:
Положение сбалансированного маятника вверх 0
радианы, и положение свисания вниз pi
радианы.
Маятник запускается вертикально с начального угла между -0,05 и 0.05 радианами.
Сигнал действия силы от агента к окружению от -10 до 10 Н.
Наблюдения от окружения являются положением и скоростью тележки, углом маятника и производной угла маятника.
Эпизод прекращается, если полюс находится более чем в 12 степенях от вертикали или если тележка перемещается более чем на 2,4 м от исходного положения.
Вознаграждение + 1 предоставляется за каждый временной шаг, когда шест остается вертикальным. Штраф -5 применяется при падении маятника.
Для получения дополнительной информации об этой модели смотрите Загрузка предопределённых окружений системы управления.
Создайте предопределенный интерфейс окружения для маятника.
env = rlPredefinedEnv("CartPole-Discrete")
env = CartPoleDiscreteAction with properties: Gravity: 9.8000 MassCart: 1 MassPole: 0.1000 Length: 0.5000 MaxForce: 10 Ts: 0.0200 ThetaThresholdRadians: 0.2094 XThreshold: 2.4000 RewardForNotFalling: 1 PenaltyForFalling: -5 State: [4x1 double]
Интерфейс имеет дискретное пространство действий, где агент может применить одно из двух возможных значений силы к тележке, -10 или 10 Н.
Получите информацию о наблюдении и действии из интерфейса окружения.
obsInfo = getObservationInfo(env); numObservations = obsInfo.Dimension(1); actInfo = getActionInfo(env);
Исправьте начальное значение генератора для повторяемости.
rng(0)
Агент PG решает, какое действие взять заданные наблюдения с помощью представления актера. Чтобы создать актёра, сначала создайте глубокую нейронную сеть с одним входом (наблюдение) и одним выходом (действие). Сеть актёра имеет два выхода, что соответствует количеству возможных действий. Для получения дополнительной информации о создании представления политики глубоких нейронных сетей, смотрите, Создают представления политики и функции ценности.
actorNetwork = [ featureInputLayer(numObservations,'Normalization','none','Name','state') fullyConnectedLayer(2,'Name','fc') softmaxLayer('Name','actionProb') ];
Задайте опции для представления актера используя rlRepresentationOptions
.
actorOpts = rlRepresentationOptions('LearnRate',1e-2,'GradientThreshold',1);
Создайте представление актера с помощью указанной глубокой нейронной сети и опций. Вы также должны задать информацию о действии и наблюдении для критика, которую вы получили из интерфейса окружения. Для получения дополнительной информации смотрите rlStochasticActorRepresentation
.
actor = rlStochasticActorRepresentation(actorNetwork,obsInfo,actInfo,'Observation',{'state'},actorOpts);
Создайте агента с помощью заданного представления актера и опций агента по умолчанию. Для получения дополнительной информации смотрите rlPGAgent
.
agent = rlPGAgent(actor);
Чтобы обучить агента, сначала укажите опции обучения. В данном примере используйте следующие опции.
Запускает каждый эпизод тренировки для самое большее 1000 эпизодов с каждым эпизодом, длящимся самое большее 200 временных шагов.
Отображение процесса обучения в диалоговом окне Диспетчер эпизодов (установите Plots
опция) и отключить отображение командной строки (установите Verbose
опция для false
).
Остановите обучение, когда агент получит среднее совокупное вознаграждение, больше 195 для 100 последовательных эпизодов. На данной точке агент может сбалансировать маятник в вертикальном положении.
Для получения дополнительной информации смотрите rlTrainingOptions
.
trainOpts = rlTrainingOptions(... 'MaxEpisodes', 1000, ... 'MaxStepsPerEpisode', 200, ... 'Verbose', false, ... 'Plots','training-progress',... 'StopTrainingCriteria','AverageReward',... 'StopTrainingValue',195,... 'ScoreAveragingWindowLength',100);
Можно визуализировать систему тележки с шестом при помощи plot
функция во время обучения или симуляции.
plot(env)
Обучите агента с помощью train
функция. Обучение этого агента является интенсивным в вычислительном отношении процессом, который занимает несколько минут. Чтобы сэкономить время при запуске этого примера, загрузите предварительно обученного агента путем установки doTraining
на false
. Чтобы обучить агента самостоятельно, установите doTraining
на true
.
doTraining = false; if doTraining % Train the agent. trainingStats = train(agent,env,trainOpts); else % Load the pretrained agent for the example. load('MATLABCartpolePG.mat','agent'); end
Чтобы подтвердить производительность обученного агента, симулируйте его в среде тележки с шестом. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions
и sim
. Агент может сбалансировать систему тележки с шестом, даже когда время симуляции увеличивается до 500 шагов.
simOptions = rlSimulationOptions('MaxSteps',500);
experience = sim(env,agent,simOptions);
totalReward = sum(experience.Reward)
totalReward = 500