exponenta event banner

Подготовка агента DDPG к качанию вверх и балансировке маятника с сигналом шины

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

Дополнительные сведения об агентах DDPG см. в разделе Агенты градиента глубокой детерминированной политики. Пример обучения агента DDPG в MATLAB ® см. в разделе Подготовка агента DDPG к управлению системой двойного интегратора.

Маятниковая модель качания вверх с шиной

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

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

mdl = 'rlSimplePendulumModelBus';
open_system(mdl)

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

  • Уравновешенное вверх положение маятника 0 радианы, и положение подвешивания вниз pi радианы.

  • Сигнал воздействия крутящего момента от агента к окружающей среде составляет от -2 до 2 Н· м.

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

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

  • Вознаграждение rt, предоставляемое на каждом шаге времени, составляет

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

Здесь:

  • startt - угол смещения из вертикального положения.

  • θ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;

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

rng(0)

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

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

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

sinThetaInput = featureInputLayer(1,'Normalization','none','Name','sin_theta');
cosThetaInput = featureInputLayer(1,'Normalization','none','Name','cos_theta');
dThetaInput   = featureInputLayer(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)

Figure contains an axes. The axes contains an object of type graphplot.

Укажите параметры критического представления с помощью rlRepresentationOptions.

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

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

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

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

Сконструировать критика аналогично актёру. Дополнительные сведения см. в разделе rlQValueRepresentation.

statePath = [
    concatenationLayer(1,3,'Name','concat')
    fullyConnectedLayer(400,'Name','CriticStateFC1')
    reluLayer('Name','CriticRelu1')
    fullyConnectedLayer(300,'Name','CriticStateFC2')];

actionPath = [
    featureInputLayer(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 = rlQValueRepresentation(criticNetwork,obsInfo,actInfo,...
                         'Observation',{'sin_theta','cos_theta','dtheta'},'Action',{'action'},criticOpts);

Для создания агента DDPG сначала укажите параметры агента DDPG с помощью rlDDPGAgentOptions.

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

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

agent = rlDDPGAgent(actor,critic,agentOpts);

Агент поезда

Для обучения агента сначала укажите варианты обучения. В этом примере используются следующие опции:

  • Запускать каждый тренинг максимум для 50000 эпизодов, причем каждый эпизод длится максимум ceil(Tf/Ts) временные шаги.

  • Отображение хода обучения в диалоговом окне «Менеджер эпизодов» (установите Plots и отключите отображение командной строки (установите Verbose опция для false).

  • Прекратите обучение, когда агент получит среднее совокупное вознаграждение больше -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 the pretrained agent for the example.
    load('SimulinkPendBusDDPG.mat','agent')
end

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

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

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

Figure Simple Pendulum Visualizer contains an axes. The axes contains 2 objects of type line, rectangle.

См. также

| | |

Связанные темы