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

Этот пример показывает, как обучить агент глубоко детерминированного градиента политики (DDPG) качаться и балансировать полюсную корзиной систему, смоделированную в Simscape™ Multibody™.

Для получения дополнительной информации об агентах DDPG смотрите Глубоко Детерминированные Агенты Градиента политики. Для примера, который обучает агент DDPG в MATLAB®, смотрите Train Агент DDPG, чтобы Управлять Двойной Системой Интегратора.

Полюсная корзиной модель Simscape

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

Откройте модель.

mdl = 'rlCartPoleSimscapeModel';
open_system(mdl)

Полюсная корзиной система моделируется с помощью Simscape Multibody.

Для этой модели:

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

  • Сигнал действия силы от агента до среды от -15 до 15 Н

  • Наблюдения от среды являются положением и скоростью корзины, и синусом, косинусом и производной угла маятника

  • Эпизод останавливается, если корзина перемещает больше чем 3,5 м от исходного положения

  • Вознаграждение rt, если в каждый такт:

rt=-0.1(5θt2+xt2+ 0.05ut-12)-100B

где:

  • θt угол смещения от вертикального положения маятника

  • xt смещение положения от центрального положения корзины

  • ut-1 усилие по управлению от предыдущего временного шага

  • B флаг (1 или 0), который указывает, выходит ли корзина за пределы

Для получения дополнительной информации об этой модели смотрите Загрузку Предопределенные окружения Simulink.

Создайте интерфейс среды

Создайте предопределенный интерфейс среды для маятника.

env = rlPredefinedEnv('CartPoleSimscapeModel-Continuous')
env = 
  SimulinkEnvWithAgent with properties:

             Model: "rlCartPoleSimscapeModel"
        AgentBlock: "rlCartPoleSimscapeModel/RL Agent"
          ResetFcn: []
    UseFastRestart: 'on'

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

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

obsInfo = getObservationInfo(env);
numObservations = obsInfo.Dimension(1);
actInfo = getActionInfo(env);

Задайте время симуляции Tf и шаг расчета агента Ts в секундах

Ts = 0.02;
Tf = 25;

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

rng(0)

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

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

statePath = [
    imageInputLayer([numObservations 1 1], 'Normalization', 'none', 'Name', 'observation')
    fullyConnectedLayer(128, 'Name', 'CriticStateFC1')
    reluLayer('Name', 'CriticRelu1')
    fullyConnectedLayer(200, 'Name', 'CriticStateFC2')];

actionPath = [
    imageInputLayer([1 1 1], 'Normalization', 'none', 'Name', 'action')
    fullyConnectedLayer(200, 'Name', 'CriticActionFC1', 'BiasLearnRateFactor', 0)];

commonPath = [
    additionLayer(2,'Name', 'add')
    reluLayer('Name','CriticCommonRelu')
    fullyConnectedLayer(1, 'Name', 'CriticOutput')];

criticNetwork = layerGraph(statePath);
criticNetwork = addLayers(criticNetwork, actionPath);
criticNetwork = addLayers(criticNetwork, commonPath);
    
criticNetwork = connectLayers(criticNetwork,'CriticStateFC2','add/in1');
criticNetwork = connectLayers(criticNetwork,'CriticActionFC1','add/in2');

Просмотрите конфигурацию сети критика.

figure
plot(criticNetwork)

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

criticOptions = rlRepresentationOptions('LearnRate',1e-03,'GradientThreshold',1);

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

critic = rlRepresentation(criticNetwork,criticOptions,'Observation',{'observation'},obsInfo,'Action',{'action'},actInfo);

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

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

actorNetwork = [
    imageInputLayer([numObservations 1 1], 'Normalization', 'none', 'Name', 'observation')
    fullyConnectedLayer(128, 'Name', 'ActorFC1')
    reluLayer('Name', 'ActorRelu1')
    fullyConnectedLayer(200, 'Name', 'ActorFC2')
    reluLayer('Name', 'ActorRelu2')
    fullyConnectedLayer(1, 'Name', 'ActorFC3')
    tanhLayer('Name', 'ActorTanh1')
    scalingLayer('Name','ActorScaling','Scale',max(actInfo.UpperLimit))];

actorOptions = rlRepresentationOptions('LearnRate',5e-04,'GradientThreshold',1);

actor = rlRepresentation(actorNetwork,actorOptions,'Observation',{'observation'},obsInfo,'Action',{'ActorScaling'},actInfo);

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

agentOptions = rlDDPGAgentOptions(...
    'SampleTime',Ts,...
    'TargetSmoothFactor',1e-3,...
    'ExperienceBufferLength',1e6,...
    'MiniBatchSize',128);
agentOptions.NoiseOptions.Variance = 0.4;
agentOptions.NoiseOptions.VarianceDecayRate = 1e-5;

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

agent = rlDDPGAgent(actor,critic,agentOptions);

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

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

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

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

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

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

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

maxepisodes = 2000;
maxsteps = ceil(Tf/Ts);
trainingOptions = rlTrainingOptions(...
    'MaxEpisodes',maxepisodes,...
    'MaxStepsPerEpisode',maxsteps,...
    'ScoreAveragingWindowLength',5,...
    'Verbose',false,...
    'Plots','training-progress',...
    'StopTrainingCriteria','AverageReward',...
    'StopTrainingValue',-400,...
    'SaveAgentCriteria','EpisodeReward',...
    'SaveAgentValue',-400);

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

doTraining = false;

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

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

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

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

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

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

| |

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте