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

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

Для получения дополнительной информации об агентах DQN смотрите Глубокие Агенты Q-сети. Для примера, который обучает агент DQN в MATLAB®, смотрите Train Агент DQN, чтобы Сбалансировать полюсную Корзиной Систему.

Маятник модель 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-Discrete')
env = 
  SimulinkEnvWithAgent with properties:

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

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

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

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

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

Ts = 0.05;
Tf = 20;

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

rng(0)

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

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

statePath = [
    imageInputLayer([3 1 1],'Normalization','none','Name','state')
    fullyConnectedLayer(24, 'Name', 'CriticStateFC1')
    reluLayer('Name','CriticRelu1')
    fullyConnectedLayer(48,'Name','CriticStateFC2')];
actionPath = [
    imageInputLayer([1 1 1],'Normalization','none','Name','action')
    fullyConnectedLayer(48,'Name','CriticActionFC1','BiasLearnRateFactor',0)];
commonPath = [
    additionLayer(2,'Name','add')
    reluLayer('Name','CriticCommonRelu')
    fullyConnectedLayer(1,'Name','output')];
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.

criticOptions = rlRepresentationOptions('LearnRate',0.01,'GradientThreshold',1);

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

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

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

agentOptions = rlDQNAgentOptions(...
    'SampleTime',Ts,...
    'TargetSmoothFactor',1e-3,...
    'ExperienceBufferLength',3000,... 
    'UseDoubleDQN',false,...
    'DiscountFactor',0.9, ...
    'MiniBatchSize',64);

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

agent = rlDQNAgent(critic,agentOptions);

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

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

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

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

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

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

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

trainingOptions = rlTrainingOptions(...
    'MaxEpisodes',1000, ...
    'MaxStepsPerEpisode',500, ...
    'ScoreAveragingWindowLength',5,...
    'Verbose',false, ...
    'Plots','training-progress',...
    'StopTrainingCriteria','AverageReward',...
    'StopTrainingValue',-1100,...
    'SaveAgentCriteria','EpisodeReward',...
    'SaveAgentValue',-1100);

Обучите агент с помощью функции 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('SimulinkPendulumDQN.mat','agent');
end

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

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

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

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

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

Похожие темы

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