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

В этом примере показано, как обучить агента актёра-критика (AC) балансировать систему тележки с шестом, смоделированную в MATLAB ®.

Для получения дополнительной информации об агентах AC см. «Агенты актёра-критика». Для примера, показывающего, как обучить агента AC с помощью параллельных вычислений, смотрите Обучите агента AC для балансировки системы тележки с шестом с помощью параллельных вычислений.

Тележка с шестом MATLAB Окружения

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

Для этого окружения:

  • Положение сбалансированного маятника вверх 0 радианы, и положение свисания вниз pi радианы.

  • Маятник запускается вертикально с начального угла между -0,05 и 0,5 рад.

  • Сигнал действия силы от агента к окружению от -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]

env.PenaltyForFalling = -10;

Интерфейс имеет дискретное пространство действий, где агент может применить одно из двух возможных значений силы к тележке, -10 или 10 Н.

Получите информацию о наблюдении и действии из интерфейса окружения.

obsInfo = getObservationInfo(env);
actInfo = getActionInfo(env);

Исправьте начальное значение генератора для повторяемости.

rng(0)

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

Агент AC аппроксимирует долгосрочное вознаграждение, заданные наблюдения и действия, используя представление функции ценности критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с одним входом (наблюдение) и одним выходом (значение состояния). Размер входа сети критика равен 4, поскольку окружение имеет четыре наблюдения. Для получения дополнительной информации о создании представления функции ценности глубокой нейронной сети, смотрите, Создают политику и представления функции ценности.

criticNetwork = [
    featureInputLayer(4,'Normalization','none','Name','state')
    fullyConnectedLayer(1,'Name','CriticFC')];

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

criticOpts = rlRepresentationOptions('LearnRate',8e-3,'GradientThreshold',1);

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

critic = rlValueRepresentation(criticNetwork,obsInfo,'Observation',{'state'},criticOpts);

Агент AC решает, какое действие предпринять, заданные наблюдения, используя представление актера. Чтобы создать актёра, создайте глубокую нейронную сеть с одним входом (наблюдение) и одним выходом (действие). Размер выхода сети актёра равен 2, так как окружение имеет два возможных действия, -10 и 10.

Построение актёра подобно критику. Для получения дополнительной информации смотрите rlStochasticActorRepresentation.

actorNetwork = [
    featureInputLayer(4,'Normalization','none','Name','state')
    fullyConnectedLayer(2,'Name','fc')
    softmaxLayer('Name','actionProb')];

actorOpts = rlRepresentationOptions('LearnRate',8e-3,'GradientThreshold',1);

actor = rlStochasticActorRepresentation(actorNetwork,obsInfo,actInfo,...
    'Observation',{'state'},actorOpts);

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

agentOpts = rlACAgentOptions(...
    'NumStepsToLookAhead',32, ...
    'DiscountFactor',0.99);

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

agent = rlACAgent(actor,critic,agentOpts);

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

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

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

  • Отображение процесса обучения в диалоговом окне Диспетчер эпизодов (установите Plots опция) и отключить отображение командной строки (установите Verbose опция для false).

  • Остановите обучение, когда агент получит среднее совокупное вознаграждение, больше 480 в 10 последовательных эпизодах. На данной точке агент может сбалансировать маятник в вертикальном положении.

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

trainOpts = rlTrainingOptions(...
    'MaxEpisodes',1000,...
    'MaxStepsPerEpisode',500,...
    'Verbose',false,...
    'Plots','training-progress',...
    'StopTrainingCriteria','AverageReward',...
    'StopTrainingValue',480,...
    'ScoreAveragingWindowLength',10); 

Можно визуализировать систему тележки с шестом во время обучения или симуляции с помощью plot функция.

plot(env)

Figure Cart Pole Visualizer contains an axes. The axes 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('MATLABCartpoleAC.mat','agent');
end

Симулируйте агент переменного тока

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

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

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

totalReward = sum(experience.Reward)
totalReward = 500

См. также

Похожие темы