Обучите агент AC балансировать полюсную корзиной систему

Этот пример показывает, как обучить агент критика агента (AC) балансировать полюсную корзиной систему, смоделированную в MATLAB®.

Для получения дополнительной информации об агентах AC смотрите Агенты Критика Агента. Для примера на учебном агенте AC с помощью параллельных вычислений смотрите Агент AC Train, чтобы Сбалансировать полюсную Корзиной Систему Используя пример Параллельных вычислений.

Полюсная корзиной среда MATLAB

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

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

  • Восходящее сбалансированное положение маятника является радианами 0, и нисходящее положение зависания является радианами pi

  • Маятник запускается вертикально с начального угла + радианы/-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: [4×1 double]

env.PenaltyForFalling = -10;

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

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

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

Зафиксируйте случайный seed генератора для воспроизводимости.

rng(0)

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

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

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

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

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

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

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

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

Создайте агента подобным образом критику.

actorNetwork = [
    imageInputLayer([4 1 1],'Normalization','none','Name','state')
    fullyConnectedLayer(2,'Name','action')];

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

actor = rlRepresentation(actorNetwork,obsInfo,actInfo,'Observation',{'state'},'Action',{'action'},actorOpts);

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

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

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

agent = rlACAgent(actor,critic,agentOpts);

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

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

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

  • Отобразитесь учебный прогресс диалогового окна Episode Manager (установите опцию Plots), и отключите отображение командной строки (установите опцию Verbose).

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

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

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

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

plot(env)

Обучите агент с помощью функции train. Это - в вычислительном отношении интенсивный процесс, который занимает несколько минут, чтобы завершиться. Чтобы сэкономить время при выполнении этого примера, загрузите предварительно обученный агент установкой doTraining к false. Чтобы обучить агент самостоятельно, установите doTraining на true.

doTraining = false;

if doTraining    
    % Train the agent.
    trainingStats = train(agent,env,trainOpts);
else
    % Load pretrained agent for the example.
    load('MATLABCartpoleAC.mat','agent');
end

Моделируйте агент AC

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

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

totalReward = sum(experience.Reward)
totalReward = 500

MATLAB и Simulink являются зарегистрированными торговыми марками MathWorks, Inc. См. www.mathworks.com/trademarks для списка других товарных знаков, принадлежавших MathWorks, Inc. Другим продуктом или фирменными знаками являются товарные знаки или зарегистрированные торговые марки их соответствующих владельцев.

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

Похожие темы