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

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

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

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

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

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

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

Создайте представление актера с помощью заданной глубокой нейронной сети и опций. Необходимо также задать информацию о действии и наблюдении для агента, которого вы получили из интерфейса среды. Для получения дополнительной информации смотрите 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 = [
    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 = 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.Variance = 0.6;
agentOpts.NoiseOptions.VarianceDecayRate = 1e-5;

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

agent = rlDDPGAgent(actor,critic,agentOpts);

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

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

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

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

Симулируйте агента DDPG

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

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

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

| | |

Похожие темы