Обучите агент DDPG к Swing и маятнику баланса

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

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

Маятник модель Swing

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

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

mdl = 'rlSimplePendulumModel';
open_system(mdl)

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

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

  • Сигналом действия крутящего момента от агента до среды является от -2 до 2 Nm.

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

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

rt=-(θt2+0.1θt˙2+0.001ut-12)

где:

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

  • θt˙ производная угла рассогласования

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

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

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

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

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

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

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

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

numObs = 3;
set_param('rlSimplePendulumModel/create observations','ThetaObservationHandling','sincos');

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

env.ResetFcn = @(in)setVariable(in,'theta0',pi,'Workspace',mdl);

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

Ts = 0.05;
Tf = 20;

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

rng(0)

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

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

statePath = [
    imageInputLayer([numObs 1 1], 'Normalization', 'none', 'Name', 'observation')
    fullyConnectedLayer(400, 'Name', 'CriticStateFC1')
    reluLayer('Name', 'CriticRelu1')
    fullyConnectedLayer(300, 'Name', 'CriticStateFC2')];
actionPath = [
    imageInputLayer([1 1 1], 'Normalization', 'none', 'Name', 'action')
    fullyConnectedLayer(300, 'Name', 'CriticActionFC1', 'BiasLearnRateFactor', 0)];
commonPath = [
    additionLayer(2,'Name', 'add')
    reluLayer('Name','CriticCommonRelu')
    fullyConnectedLayer(1, 'Name', 'CriticOutput')];

criticNetwork = layerGraph();
criticNetwork = addLayers(criticNetwork,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.

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

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

obsInfo = getObservationInfo(env);
actInfo = getActionInfo(env);
critic = rlRepresentation(criticNetwork,obsInfo,actInfo,'Observation',{'observation'},'Action',{'action'},criticOpts);

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

Создайте агента так же критику.

actorNetwork = [
    imageInputLayer([numObs 1 1], 'Normalization', 'none', 'Name', 'observation')
    fullyConnectedLayer(400, 'Name', 'ActorFC1')
    reluLayer('Name', 'ActorRelu1')
    fullyConnectedLayer(300, 'Name', 'ActorFC2')
    reluLayer('Name', 'ActorRelu2')
    fullyConnectedLayer(1, 'Name', 'ActorFC3')
    tanhLayer('Name', 'ActorTanh')
    scalingLayer('Name','ActorScaling','Scale',max(actInfo.UpperLimit))];

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

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

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

agentOpts = rlDDPGAgentOptions(...
    'SampleTime',Ts,...
    'TargetSmoothFactor',1e-3,...
    'ExperienceBufferLength',1e6,...
    'DiscountFactor',0.99,...
    'MiniBatchSize',128);
agentOpts.NoiseOptions.Variance = 0.6;
agentOpts.NoiseOptions.VarianceDecayRate = 1e-5;

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

agent = rlDDPGAgent(actor,critic,agentOpts);

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

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

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

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

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

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

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

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

Обучите агент с помощью функции 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('SimulinkPendulumDDPG.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. Другим продуктом или фирменными знаками являются товарные знаки или зарегистрированные торговые марки их соответствующих владельцев.

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

| |

Похожие темы

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