В этом примере показано, как обучить агента глубоко детерминированного градиента политики (DDPG) качаться и балансировать систему тележки с шестом, смоделированную в Simscape™ Multibody™.
Для получения дополнительной информации об агентах DDPG смотрите Глубоко Детерминированных Агентов Градиента политики. Для примера, показывающего, как обучить агента DDPG в MATLAB®, смотрите, Обучают Агента DDPG Управлять Двойной Системой Интегратора.
Среда обучения с подкреплением для этого примера является полюсом, присоединенным к неприводимому в движение соединению на тележке, которая проходит лишенная трения дорожка. Цель обучения должна заставить полюс стоять вертикально, не падая и используя минимальные усилия по управлению.
Откройте модель.
mdl = 'rlCartPoleSimscapeModel';
open_system(mdl)
Система тележки с шестом моделируется с помощью Simscape Multibody.
Для этой модели:
Восходящим сбалансированным выигрышным положением является 0
радианами и нисходящим положением зависания является pi
радианы.
Сигнал действия силы от агента до среды от –15 до 15 Н.
Наблюдения средой являются положением и скоростью тележки, и синусом, косинусом и производной угла полюса.
Эпизод завершает работу, если тележка перемещает больше чем 3,5 м от исходного положения.
Вознаграждение , если в каждый такт,
Здесь:
угол смещения от вертикального положения полюса.
смещение положения от центрального положения тележки.
усилие по управлению от предыдущего временного шага.
флаг (1 или 0), который указывает, выходит ли тележка за пределы.
Для получения дополнительной информации об этой модели смотрите Загрузку Предопределенные окружения Simulink.
Создайте предопределенный интерфейс среды для полюса.
env = rlPredefinedEnv('CartPoleSimscapeModel-Continuous')
env = SimulinkEnvWithAgent with properties: Model : rlCartPoleSimscapeModel AgentBlock : rlCartPoleSimscapeModel/RL Agent ResetFcn : [] UseFastRestart : on
Интерфейс имеет непрерывное пространство действий, где агент может применить возможные значения крутящего момента от –15 до 15 Н к полюсу.
Получите информацию о наблюдении и действии из интерфейса среды.
obsInfo = getObservationInfo(env); numObservations = obsInfo.Dimension(1); actInfo = getActionInfo(env);
Задайте время симуляции Tf
и шаг расчета агента Ts
в секундах
Ts = 0.02; Tf = 25;
Для повторяемости результатов зафиксируйте начальное значение генератора случайных чисел.
rng(0)
Агент DDPG аппроксимирует долгосрочное вознаграждение, заданные наблюдения и действия, с помощью представления функции ценности критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с двумя входными параметрами (состояние и действие) и один выход. Входным размером пути к действию является [1 1 1]
поскольку агент может применить действие как одно значение силы к среде. Для получения дополнительной информации о создании представления функции ценности глубокой нейронной сети смотрите, Создают Представления Функции ценности и политика.
statePath = [ featureInputLayer(numObservations,'Normalization','none','Name','observation') fullyConnectedLayer(128,'Name','CriticStateFC1') reluLayer('Name','CriticRelu1') fullyConnectedLayer(200,'Name','CriticStateFC2')]; actionPath = [ featureInputLayer(1,'Normalization','none','Name','action') fullyConnectedLayer(200,'Name','CriticActionFC1','BiasLearnRateFactor',0)]; commonPath = [ additionLayer(2,'Name','add') reluLayer('Name','CriticCommonRelu') fullyConnectedLayer(1,'Name','CriticOutput')]; criticNetwork = layerGraph(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
.
criticOptions = rlRepresentationOptions('LearnRate',1e-03,'GradientThreshold',1);
Создайте представление критика с помощью заданной глубокой нейронной сети и опций. Необходимо также указать информацию действия и наблюдения для критика, которого вы уже получили из интерфейса среды. Для получения дополнительной информации смотрите rlQValueRepresentation
.
critic = rlQValueRepresentation(criticNetwork,obsInfo,actInfo,... 'Observation',{'observation'},'Action',{'action'},criticOptions);
Агент DDPG решает который действие взять, заданные наблюдения, с помощью представления актера. Чтобы создать агента, сначала создайте глубокую нейронную сеть с одним входом (наблюдение) и один выход (действие).
Создайте агента подобным образом критику. Для получения дополнительной информации смотрите rlDeterministicActorRepresentation
.
actorNetwork = [ featureInputLayer(numObservations,'Normalization','none','Name','observation') fullyConnectedLayer(128,'Name','ActorFC1') reluLayer('Name','ActorRelu1') fullyConnectedLayer(200,'Name','ActorFC2') reluLayer('Name','ActorRelu2') fullyConnectedLayer(1,'Name','ActorFC3') tanhLayer('Name','ActorTanh1') scalingLayer('Name','ActorScaling','Scale',max(actInfo.UpperLimit))]; actorOptions = rlRepresentationOptions('LearnRate',5e-04,'GradientThreshold',1); actor = rlDeterministicActorRepresentation(actorNetwork,obsInfo,actInfo,... 'Observation',{'observation'},'Action',{'ActorScaling'},actorOptions);
Чтобы создать агента DDPG, сначала задайте опции агента DDPG с помощью rlDDPGAgentOptions
.
agentOptions = rlDDPGAgentOptions(... 'SampleTime',Ts,... 'TargetSmoothFactor',1e-3,... 'ExperienceBufferLength',1e6,... 'MiniBatchSize',128); agentOptions.NoiseOptions.Variance = 0.4; agentOptions.NoiseOptions.VarianceDecayRate = 1e-5;
Затем создайте агента с помощью заданного представления актера, представления критика и опций агента. Для получения дополнительной информации смотрите rlDDPGAgent
.
agent = rlDDPGAgent(actor,critic,agentOptions);
Чтобы обучить агента, сначала задайте опции обучения. В данном примере используйте следующие опции.
Запустите каждый эпизод тренировки для самое большее 2 000 эпизодов с каждым эпизодом, длящимся в большей части ceil(Tf/Ts)
временные шаги.
Отобразите прогресс обучения в диалоговом окне Episode Manager (установите Plots
опция), и отключают отображение командной строки (установите Verbose
опция к false
).
Остановите обучение, когда агент получит среднее совокупное вознаграждение, больше, чем –400 более чем пять последовательных эпизодов. На данном этапе агент может быстро сбалансировать полюс в вертикальном положении с помощью минимального усилия по управлению.
Сохраните копию агента для каждого эпизода, где совокупное вознаграждение больше –400.
Для получения дополнительной информации смотрите rlTrainingOptions
.
maxepisodes = 2000; maxsteps = ceil(Tf/Ts); trainingOptions = rlTrainingOptions(... 'MaxEpisodes',maxepisodes,... 'MaxStepsPerEpisode',maxsteps,... 'ScoreAveragingWindowLength',5,... 'Verbose',false,... 'Plots','training-progress',... 'StopTrainingCriteria','AverageReward',... 'StopTrainingValue',-400,... 'SaveAgentCriteria','EpisodeReward',... 'SaveAgentValue',-400);
Обучите агента с помощью train
функция. Обучение этот процесс агента в вычислительном отношении интенсивен и занимает несколько часов, чтобы завершиться. Чтобы сэкономить время при выполнении этого примера, загрузите предварительно обученного агента установкой doTraining
к false
. Чтобы обучить агента самостоятельно, установите doTraining
к true
.
doTraining = false; if doTraining % Train the agent. trainingStats = train(agent,env,trainingOptions); else % Load the pretrained agent for the example. load('SimscapeCartPoleDDPG.mat','agent') end
Чтобы подтвердить производительность обученного агента, симулируйте его в среде тележки с шестом. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions
и sim
.
simOptions = rlSimulationOptions('MaxSteps',500);
experience = sim(env,agent,simOptions);
bdclose(mdl)
rlDDPGAgent
| rlSimulinkEnv
| train