Начиная с простого лишенного трения маятника модель Simulink® этот пример показывает, как преобразовать его в интерфейс среды обучения укрепления и обучает агент глубоко детерминированного градиента политики (DDPG) в этой среде.
Для получения дополнительной информации об агентах DDPG смотрите Глубоко Детерминированные Агенты Градиента политики. Для примера, который обучает агент DDPG в MATLAB®, смотрите Train Агент DDPG, чтобы Управлять Двойной Системой Интегратора.
Стартовая модель для этого примера является простым лишенным трения маятником. Учебная цель состоит в том, чтобы заставить маятник стоять вертикально, не запинаясь за использование и падая минимального усилия по управлению.
Зафиксируйте случайный seed генератора для воспроизводимости.
rng(0)
Откройте модель.
mdl = 'rlSimplePendulumModelBus';
open_system(mdl)
Для этой модели:
Восходящее сбалансированное положение маятника является радианами 0
, и нисходящее положение зависания является радианами pi
.
Сигналом действия крутящего момента от агента до среды является от -2
до 2
Nm.
Наблюдения от среды являются синусом угла маятника, косинусом угла маятника и угловой производной маятника.
И сигналы наблюдения и действия являются шинами Simulink.
Вознаграждение , если в каждый такт:
где:
угол смещения от вертикального положения
производная угла рассогласования
усилие по управлению от предыдущего временного шага.
Модель, используемая в этом примере, подобна модели математического маятника, описанной в Загрузке Предопределенные окружения 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 решает который действие взять данный наблюдения с помощью представления агента. Чтобы создать агента, сначала создайте глубокую нейронную сеть с тремя входными параметрами, этими тремя наблюдениями, и одним выводом, действием. Эти три наблюдения могут быть объединены с помощью 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);
Создайте представление критика с помощью заданной глубокой нейронной сети и опций. Необходимо также задать информацию о действии и наблюдении для критика, которого вы получаете из интерфейса среды. Для получения дополнительной информации смотрите rlRepresentation
.
actor = rlRepresentation(actorNetwork,actorOptions,'Observation',{'sin_theta','cos_theta','dtheta'},obsInfo, .... 'Action',{'ActorScaling1'},actInfo);
Агент DDPG аппроксимирует долгосрочное вознаграждение, данное наблюдения и действия с помощью представления функции значения критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с двумя входными параметрами, наблюдением и действием, и одним выводом, значением акта государственной власти.
Создайте критика так же к агенту.
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 = rlRepresentation(criticNetwork,criticOpts, ... 'Observation',{'sin_theta','cos_theta','dtheta'},obsInfo, ... 'Action',{'action'},actInfo);
Чтобы создать агент 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
с каждым эпизодом, длящимся самое большее 400
временные шаги.
Отобразитесь учебный прогресс диалогового окна Episode Manager (установите опцию Plots
), и отключите отображение командной строки (установите опцию Verbose
).
Остановите обучение, когда агент получит среднее совокупное вознаграждение, больше, чем -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
Чтобы подтвердить производительность обученного агента, моделируйте его в среде маятника. Для получения дополнительной информации о симуляции агента смотрите rlSimulationOptions
и sim
.
simOptions = rlSimulationOptions('MaxSteps',500);
experience = sim(env,agent,simOptions);
MATLAB и Simulink являются зарегистрированными торговыми марками MathWorks, Inc. См. www.mathworks.com/trademarks для списка других товарных знаков, принадлежавших MathWorks, Inc. Другим продуктом или фирменными знаками являются товарные знаки или зарегистрированные торговые марки их соответствующих владельцев.
bus2RLSpec
| rlDDPGAgent
| rlSimulinkEnv
| train