В этом примере показано, как обучить агента глубокого детерминированного градиента политики (DDPG) управлять динамической системой второго порядка, смоделированной в MATLAB ®.
Дополнительные сведения об агентах DDPG см. в разделе Агенты градиента глубокой детерминированной политики. Пример обучения агента DDPG в Simulink ® см. в разделе Подготовка агента DDPG к качанию вверх и балансировке маятника.
Среда обучения усилению для этого примера представляет собой систему двойного интегратора второго порядка с коэффициентом усиления. Цель обучения состоит в управлении положением массы в системе второго порядка с помощью ввода силы.

Для этой среды:
Масса начинается в исходном положении от -4 до 4 единиц.
Сигнал силового воздействия от агента к окружающей среде составляет от -2 до 2 Н.
Наблюдения из окружающей среды - это положение и скорость массы.
Эпизод заканчивается, если масса перемещается более чем на 5 м от исходного положения или если 0,01.
Вознаграждение , предоставляемое на каждом временном шаге, представляет собой дискретизацию ):
) ′ R u (t))
Здесь:
- вектор состояния массы.
- сила, приложенная к массе.
- веса, влияющие на эффективность управления; 0 1].
- вес контрольного усилия; 0,01.
Дополнительные сведения об этой модели см. в разделе Загрузка предопределенных сред системы управления.
Создайте предопределенный интерфейс среды для системы двойного интегратора.
env = rlPredefinedEnv("DoubleIntegrator-Continuous")env =
DoubleIntegratorContinuousAction with properties:
Gain: 1
Ts: 0.1000
MaxDistance: 5
GoalThreshold: 0.0100
Q: [2x2 double]
R: 0.0100
MaxForce: Inf
State: [2x1 double]
env.MaxForce = Inf;
Интерфейс имеет непрерывное пространство действий, в котором агент может применять значения силы из -Inf кому Inf к массе.
Получение информации о наблюдениях и действиях из интерфейса среды.
obsInfo = getObservationInfo(env); numObservations = obsInfo.Dimension(1); actInfo = getActionInfo(env); numActions = numel(actInfo);
Зафиксируйте начальное число случайного генератора для воспроизводимости.
rng(0)
Агент DDPG аппроксимирует долгосрочное вознаграждение, учитывая наблюдения и действия, используя представление функции значения критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с двумя входами (состояние и действие) и одним выходом. Дополнительные сведения о создании представления функции значений нейронной сети см. в разделе Создание представлений политик и функций значений.
statePath = imageInputLayer([numObservations 1 1],'Normalization','none','Name','state'); actionPath = imageInputLayer([numActions 1 1],'Normalization','none','Name','action'); commonPath = [concatenationLayer(1,2,'Name','concat') quadraticLayer('Name','quadratic') fullyConnectedLayer(1,'Name','StateValue','BiasLearnRateFactor',0,'Bias',0)]; criticNetwork = layerGraph(statePath); criticNetwork = addLayers(criticNetwork,actionPath); criticNetwork = addLayers(criticNetwork,commonPath); criticNetwork = connectLayers(criticNetwork,'state','concat/in1'); criticNetwork = connectLayers(criticNetwork,'action','concat/in2');
Просмотр конфигурации сети критиков.
figure plot(criticNetwork)

Укажите параметры критического представления с помощью rlRepresentationOptions.
criticOpts = rlRepresentationOptions('LearnRate',5e-3,'GradientThreshold',1);
Создайте критическое представление, используя указанную нейронную сеть и опции. Необходимо также указать информацию о действиях и наблюдениях для критика, которую можно получить из интерфейса среды. Дополнительные сведения см. в разделе rlQValueRepresentation.
critic = rlQValueRepresentation(criticNetwork,obsInfo,actInfo,'Observation',{'state'},'Action',{'action'},criticOpts);
Агент DDPG решает, какое действие предпринять, учитывая наблюдения, используя представление актера. Для создания актёра сначала создать глубокую нейронную сеть с одним входом (наблюдение) и одним выходом (действие).
Сконструировать актера аналогично критику.
actorNetwork = [
imageInputLayer([numObservations 1 1],'Normalization','none','Name','state')
fullyConnectedLayer(numActions,'Name','action','BiasLearnRateFactor',0,'Bias',0)];
actorOpts = rlRepresentationOptions('LearnRate',1e-04,'GradientThreshold',1);
actor = rlDeterministicActorRepresentation(actorNetwork,obsInfo,actInfo,'Observation',{'state'},'Action',{'action'},actorOpts);Для создания агента DDPG сначала укажите параметры агента DDPG с помощью rlDDPGAgentOptions.
agentOpts = rlDDPGAgentOptions(... 'SampleTime',env.Ts,... 'TargetSmoothFactor',1e-3,... 'ExperienceBufferLength',1e6,... 'DiscountFactor',0.99,... 'MiniBatchSize',32); agentOpts.NoiseOptions.StandardDeviation = 0.3; agentOpts.NoiseOptions.StandardDeviationDecayRate = 1e-6;
Создайте агент DDPG, используя указанное представление актера, представление критика и параметры агента. Дополнительные сведения см. в разделе rlDDPGAgent.
agent = rlDDPGAgent(actor,critic,agentOpts);
Для обучения агента сначала укажите варианты обучения. В этом примере используются следующие опции.
Запустить не более 1000 эпизодов в тренировке, причем каждый эпизод длится не более 200 временных шагов.
Отображение хода обучения в диалоговом окне «Менеджер эпизодов» (установите Plots и отключите отображение командной строки (установите Verbose опция).
Прекратите обучение, когда агент получит скользящее среднее совокупное вознаграждение, превышающее -66. В этот момент агент может контролировать положение массы, используя минимальное контрольное усилие.
Дополнительные сведения см. в разделе rlTrainingOptions.
trainOpts = rlTrainingOptions(... 'MaxEpisodes', 5000, ... 'MaxStepsPerEpisode', 200, ... 'Verbose', false, ... 'Plots','training-progress',... 'StopTrainingCriteria','AverageReward',... 'StopTrainingValue',-66);
Вы можете визуализировать среду двойного интегратора с помощью plot функция во время обучения или моделирования.
plot(env)

Обучение агента с помощью 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('DoubleIntegDDPG.mat','agent'); end

Для проверки производительности обучаемого агента смоделируйте его в среде двойного интегратора. Дополнительные сведения о моделировании агентов см. в разделе rlSimulationOptions и sim.
simOptions = rlSimulationOptions('MaxSteps',500);
experience = sim(env,agent,simOptions);
totalReward = sum(experience.Reward)
totalReward = single
-65.9933