В этом примере показано, как обучить агент глубокого детерминированного политического градиента (DDPG) качаться вверх и балансировать маятник, смоделированный в Simulink ®.
Дополнительные сведения об агентах DDPG см. в разделе Агенты градиента глубокой детерминированной политики. Пример подготовки агента DDPG в MATLAB ® см. в разделе Подготовка агента DDPG к управлению системой двойного интегратора.
Среда обучения армированию для этого примера представляет собой простой бесфрикционный маятник, который первоначально висит в нижнем положении. Цель тренировки состоит в том, чтобы сделать маятник стоящим вертикально, не падая при минимальном усилии управления.
Откройте модель.
mdl = 'rlSimplePendulumModel';
open_system(mdl)
Для этой модели:
Уравновешенное вверх положение маятника 0 радианы, и положение подвешивания вниз pi радианы.
Сигнал воздействия крутящего момента от агента к окружающей среде составляет от -2 до 2 Н· м.
Наблюдениями из окружающей среды являются синус угла маятника, косинус угла маятника и производная угла маятника.
Вознаграждение , предоставляемое на каждом шаге времени, составляет
θt2+0.1θt˙2+0.001ut-12)
Здесь:
- угол смещения из вертикального положения.
- производная угла смещения.
- контрольное усилие от предыдущего временного шага.
Дополнительные сведения об этой модели см. в разделе Загрузка предопределенных сред Simulink.
Создайте предопределенный интерфейс среды для маятника.
env = rlPredefinedEnv('SimplePendulumModel-Continuous')env =
SimulinkEnvWithAgent with properties:
Model : rlSimplePendulumModel
AgentBlock : rlSimplePendulumModel/RL Agent
ResetFcn : []
UseFastRestart : on
Интерфейс имеет непрерывное пространство действия, в котором агент может прикладывать к маятнику значения крутящего момента от -2 до 2 Н· м.
Задайте для наблюдений окружающей среды синус угла маятника, косинус угла маятника и производную угла маятника.
numObs = 3; set_param('rlSimplePendulumModel/create observations','ThetaObservationHandling','sincos');
Чтобы определить начальное состояние маятника как свисающее вниз, укажите функцию сброса окружения с помощью анонимного дескриптора функции. Эта функция сброса задает переменную рабочего пространства модели theta0 кому pi.
env.ResetFcn = @(in)setVariable(in,'theta0',pi,'Workspace',mdl);
Укажите время моделирования Tf и время выборки агента Ts в секундах.
Ts = 0.05; Tf = 20;
Зафиксируйте начальное число случайного генератора для воспроизводимости.
rng(0)
Агент DDPG аппроксимирует долгосрочное вознаграждение, учитывая наблюдения и действия, используя представление функции значения критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с двумя входами (состояние и действие) и одним выходом. Дополнительные сведения о создании глубокого представления функции значений нейронной сети см. в разделе Создание представлений политик и функций значений.
statePath = [
featureInputLayer(numObs,'Normalization','none','Name','observation')
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();
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.
criticOpts = rlRepresentationOptions('LearnRate',1e-03,'GradientThreshold',1);
Создайте критическое представление, используя заданную глубокую нейронную сеть и опции. Необходимо также указать информацию о действиях и наблюдениях для критика, которую можно получить из интерфейса среды. Дополнительные сведения см. в разделе rlQValueRepresentation.
obsInfo = getObservationInfo(env); actInfo = getActionInfo(env); critic = rlQValueRepresentation(criticNetwork,obsInfo,actInfo,'Observation',{'observation'},'Action',{'action'},criticOpts);
Агент DDPG решает, какое действие предпринять для данных наблюдений, используя представление актера. Чтобы создать актера, сначала создайте глубокую нейронную сеть с одним входом, наблюдением и одним выходом, действием.
Построить актера в манере, похожей на критика. Дополнительные сведения см. в разделе rlDeterministicActorRepresentation.
actorNetwork = [
featureInputLayer(numObs,'Normalization','none','Name','observation')
fullyConnectedLayer(400,'Name','ActorFC1')
reluLayer('Name','ActorRelu1')
fullyConnectedLayer(300,'Name','ActorFC2')
reluLayer('Name','ActorRelu2')
fullyConnectedLayer(1,'Name','ActorFC3')
tanhLayer('Name','ActorTanh')
scalingLayer('Name','ActorScaling','Scale',max(actInfo.UpperLimit))];
actorOpts = rlRepresentationOptions('LearnRate',1e-04,'GradientThreshold',1);
actor = rlDeterministicActorRepresentation(actorNetwork,obsInfo,actInfo,'Observation',{'observation'},'Action',{'ActorScaling'},actorOpts);Для создания агента 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,... 'SaveAgentCriteria','EpisodeReward',... 'SaveAgentValue',-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('SimulinkPendulumDDPG.mat','agent') end

Для проверки работоспособности обучаемого агента смоделируйте его в маятниковой среде. Дополнительные сведения о моделировании агентов см. в разделе rlSimulationOptions и sim.
simOptions = rlSimulationOptions('MaxSteps',500);
experience = sim(env,agent,simOptions);
rlDDPGAgent | rlSimulinkEnv | train