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

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

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

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

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

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

rng(0)

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

mdl = 'rlSimplePendulumModelBus';
open_system(mdl)

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

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

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

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

  • И сигналы наблюдения и действия являются шинами Simulink.

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

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

где:

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

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

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

Модель, используемая в этом примере, подобна модели математического маятника, описанной в Загрузке Предопределенные окружения Simulink. Различие - то, что модель в этом примере использует шины Simulink для сигналов действия и наблюдения.

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

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

Задайте путь к блоку агента.

agentBlk = 'rlSimplePendulumModelBus/RL Agent';

Создайте объект Bus наблюдения.

obsBus = Simulink.Bus();
obs(1) = Simulink.BusElement;
obs(1).Name = 'sin_theta';
obs(2) = Simulink.BusElement;
obs(2).Name = 'cos_theta';
obs(3) = Simulink.BusElement;
obs(3).Name = 'dtheta';
obsBus.Elements = obs;

Создайте объект Bus действия.

actBus = Simulink.Bus();
act(1) = Simulink.BusElement;
act(1).Name = 'tau';
act(1).Min = -2;
act(1).Max =  2;
actBus.Elements = act;

Создайте объекты спецификации действия и наблюдения с помощью шин Simulink.

obsInfo = bus2RLSpec('obsBus','Model',mdl);
actInfo = bus2RLSpec('actBus','Model',mdl);

Создайте среду обучения укрепления для модели маятника.

env = rlSimulinkEnv(mdl,agentBlk,obsInfo,actInfo);

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

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

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

Ts = 0.05;
Tf = 20;

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

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

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

sinThetaInput = imageInputLayer([1 1 1],'Normalization','none','Name','sin_theta');
cosThetaInput = imageInputLayer([1 1 1],'Normalization','none','Name','cos_theta');
dThetaInput   = imageInputLayer([1 1 1],'Normalization','none','Name','dtheta');
commonPath = [
    concatenationLayer(1,3,'Name','concat')
    fullyConnectedLayer(400, 'Name','ActorFC1')
    reluLayer('Name','ActorRelu1')
    fullyConnectedLayer(300,'Name','ActorFC2')
    reluLayer('Name','ActorRelu2')
    fullyConnectedLayer(1,'Name','ActorFC3')
    tanhLayer('Name','ActorTanh1')
    scalingLayer('Name','ActorScaling1','Scale',max(actInfo.UpperLimit))];

actorNetwork = layerGraph(sinThetaInput);
actorNetwork = addLayers(actorNetwork,cosThetaInput);
actorNetwork = addLayers(actorNetwork,dThetaInput);
actorNetwork = addLayers(actorNetwork,commonPath);
    
actorNetwork = connectLayers(actorNetwork,'sin_theta','concat/in1');
actorNetwork = connectLayers(actorNetwork,'cos_theta','concat/in2');
actorNetwork = connectLayers(actorNetwork,'dtheta','concat/in3');

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

figure
plot(actorNetwork)

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

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

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

actor = rlRepresentation(actorNetwork,actorOptions,'Observation',{'sin_theta','cos_theta','dtheta'},obsInfo, ....
                                                   'Action',{'ActorScaling1'},actInfo);

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

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

statePath = [
    concatenationLayer(1,3,'Name','concat')
    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(sinThetaInput);
criticNetwork = addLayers(criticNetwork,cosThetaInput);
criticNetwork = addLayers(criticNetwork,dThetaInput);
criticNetwork = addLayers(criticNetwork,actionPath);
criticNetwork = addLayers(criticNetwork,statePath);
criticNetwork = addLayers(criticNetwork,commonPath);

criticNetwork = connectLayers(criticNetwork,'sin_theta','concat/in1');
criticNetwork = connectLayers(criticNetwork,'cos_theta','concat/in2');
criticNetwork = connectLayers(criticNetwork,'dtheta','concat/in3');
criticNetwork = connectLayers(criticNetwork,'CriticStateFC2','add/in1');
criticNetwork = connectLayers(criticNetwork,'CriticActionFC1','add/in2');

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

critic = rlRepresentation(criticNetwork,criticOpts, ...
                         'Observation',{'sin_theta','cos_theta','dtheta'},obsInfo, ...
                         'Action',{'action'},actInfo);

Чтобы создать агент 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);

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

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

| | |

Похожие темы

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