В этом примере показано, как преобразовать ПИ-контроллер в watertank
Модель Simulink® в агент глубокого обучения с подкреплением с градиентом детерминированной политики (DDPG). Для примера, который обучает агента DDPG в MATLAB®, смотрите, Обучают Агента DDPG Управлять Двойной Системой Интегратора.
Исходная модель для этого примера является моделью бака с водой. Цель состоит в том, чтобы управлять уровнем воды в баке. Для получения дополнительной информации о модели бака с водой, см. watertank Модель Simulink (Simulink Control Design).
Измените исходную модель путем внесения следующих изменений:
Удалите ПИД-регулятор.
Вставьте блок RL Agent.
Соедините вектор наблюдения , где высота бака, , и ссылочная высота.
Установите вознаграждение .
Сконфигурируйте сигнал завершения, таким образом, что симуляция останавливается если или .
Получившейся моделью является rlwatertank.slx
. Для получения дополнительной информации об этой модели и изменениях, смотрите, Создают окружения Simulink для Обучения с подкреплением.
open_system('rlwatertank')
Создание модели среды включает определение следующего:
Сигналы действия и наблюдения, которые агент использует для взаимодействия со средой. Для получения дополнительной информации смотрите rlNumericSpec
и rlFiniteSetSpec
.
Сигнал вознаграждения, который использует для измерения измерения своего успеха агент. Для получения дополнительной информации смотрите, Задают Сигналы вознаграждения.
Задайте спецификацию наблюдений obsInfo
и спецификация действия actInfo
.
obsInfo = rlNumericSpec([3 1],... 'LowerLimit',[-inf -inf 0 ]',... 'UpperLimit',[ inf inf inf]'); obsInfo.Name = 'observations'; obsInfo.Description = 'integrated error, error, and measured height'; numObservations = obsInfo.Dimension(1); actInfo = rlNumericSpec([1 1]); actInfo.Name = 'flow'; numActions = actInfo.Dimension(1);
Создайте объект интерфейса среды.
env = rlSimulinkEnv('rlwatertank','rlwatertank/RL Agent',... obsInfo,actInfo);
Установите пользовательскую функцию сброса, которая рандомизирует ссылочные значения для модели.
env.ResetFcn = @(in)localResetFcn(in);
Задайте время симуляции Tf
и шаг расчета агента Ts
в секундах.
Ts = 1.0; Tf = 200;
Для повторяемости результатов зафиксируйте начальное значение генератора случайных чисел.
rng(0)
Заданные наблюдения и действия, агент DDPG аппроксимирует долгосрочное вознаграждение с помощью представления функции ценности критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с двумя входами, наблюдением и действием, и одним выходом. Для получения дополнительной информации о создании представления функции ценности глубокой нейронной сети смотрите, Создают Представления Функции ценности и политика.
statePath = [ featureInputLayer(numObservations,'Normalization','none','Name','State') fullyConnectedLayer(50,'Name','CriticStateFC1') reluLayer('Name','CriticRelu1') fullyConnectedLayer(25,'Name','CriticStateFC2')]; actionPath = [ featureInputLayer(numActions,'Normalization','none','Name','Action') fullyConnectedLayer(25,'Name','CriticActionFC1')]; 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
.
critic = rlQValueRepresentation(criticNetwork,obsInfo,actInfo,'Observation',{'State'},'Action',{'Action'},criticOpts);
Заданные наблюдения, агент DDPG решает который действие взять использование представления актера. Чтобы создать агента, сначала создайте глубокую нейронную сеть с одним входом, наблюдением, и одним выходом, действием.
Создайте агента подобным образом критику. Для получения дополнительной информации смотрите rlDeterministicActorRepresentation
.
actorNetwork = [ featureInputLayer(numObservations,'Normalization','none','Name','State') fullyConnectedLayer(3, 'Name','actorFC') tanhLayer('Name','actorTanh') fullyConnectedLayer(numActions,'Name','Action') ]; actorOptions = rlRepresentationOptions('LearnRate',1e-04,'GradientThreshold',1); actor = rlDeterministicActorRepresentation(actorNetwork,obsInfo,actInfo,'Observation',{'State'},'Action',{'Action'},actorOptions);
Чтобы создать агента DDPG, сначала задайте опции агента DDPG с помощью rlDDPGAgentOptions
.
agentOpts = rlDDPGAgentOptions(... 'SampleTime',Ts,... 'TargetSmoothFactor',1e-3,... 'DiscountFactor',1.0, ... 'MiniBatchSize',64, ... 'ExperienceBufferLength',1e6); agentOpts.NoiseOptions.Variance = 0.3; agentOpts.NoiseOptions.VarianceDecayRate = 1e-5;
Затем создайте агента DDPG с помощью заданного представления актера, представления критика и опций агента. Для получения дополнительной информации смотрите rlDDPGAgent
.
agent = rlDDPGAgent(actor,critic,agentOpts);
Чтобы обучить агента, сначала задайте опции обучения. В данном примере используйте следующие опции:
Запустите каждое обучение в большей части 5000
эпизоды. Укажите, что каждый эпизод длится в большей части ceil(Tf/Ts)
(который является 200
) временные шаги.
Отобразите прогресс обучения в диалоговом окне Episode Manager (установите Plots
опция), и отключают отображение командной строки (установите Verbose
опция к false
).
Остановите обучение, когда агент получит среднее совокупное вознаграждение, больше, чем 800
по 20
последовательные эпизоды. На данном этапе агент может управлять уровнем воды в баке.
Для получения дополнительной информации смотрите rlTrainingOptions
.
maxepisodes = 5000; maxsteps = ceil(Tf/Ts); trainOpts = rlTrainingOptions(... 'MaxEpisodes',maxepisodes, ... 'MaxStepsPerEpisode',maxsteps, ... 'ScoreAveragingWindowLength',20, ... 'Verbose',false, ... 'Plots','training-progress',... 'StopTrainingCriteria','AverageReward',... 'StopTrainingValue',800);
Обучите агента с помощью 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('WaterTankDDPG.mat','agent') end
Подтвердите изученного агента против модели симуляцией.
simOpts = rlSimulationOptions('MaxSteps',maxsteps,'StopOnError','on'); experiences = sim(env,agent,simOpts);
function in = localResetFcn(in) % randomize reference signal blk = sprintf('rlwatertank/Desired \nWater Level'); h = 3*randn + 10; while h <= 0 || h >= 20 h = 3*randn + 10; end in = setBlockParameter(in,blk,'Value',num2str(h)); % randomize initial height h = 3*randn + 10; while h <= 0 || h >= 20 h = 3*randn + 10; end blk = 'rlwatertank/Water-Tank System/H'; in = setBlockParameter(in,blk,'InitialCondition',num2str(h)); end