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

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

Для получения дополнительной информации об агентах DQN смотрите Глубоких Агентов Q-сети. Для примера, который обучает агента DQN в MATLAB®, смотрите, Обучают Агента 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;

Для повторяемости результатов зафиксируйте начальное значение генератора случайных чисел.

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);

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

obsInfo = getObservationInfo(env);
actInfo = getActionInfo(env);
critic = rlQValueRepresentation(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 опция к false).

  • Остановите обучение, когда агент получит среднее совокупное вознаграждение, больше, чем -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);

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

Похожие темы