Обучите агента PG балансировать систему тележки с шестом

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

Для примера, который обучает агента PG с базовой линией, смотрите, Обучают Агента PG с Базовой линией Управлять Двойной Системой Интегратора.

Среда MATLAB тележки с шестом

Среда обучения с подкреплением для этого примера является полюсом, присоединенным к неприводимому в движение соединению на тележке, которая проходит лишенная трения дорожка. Цель обучения должна заставить маятник стоять вертикально без падения.

Для этой среды:

  • Восходящим сбалансированным положением маятника является 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

Агент 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);

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

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

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

  • Отобразите прогресс обучения в диалоговом окне Episode Manager (установите 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)

Figure Cart Pole Visualizer contains an axes object. The axes object contains 6 objects of type line, polygon.

Обучите агента с помощью 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

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

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

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

Figure Cart Pole Visualizer contains an axes object. The axes object contains 6 objects of type line, polygon.

totalReward = sum(experience.Reward)
totalReward = 500

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

Похожие темы