Этот пример показов, как преобразовать ПИ-контроллер в watertank
Simulink ® моделирует агент глубокого детерминированного градиента политики (DDPG) обучения с подкреплением. Для примера, который обучает агента DDPG в MATLAB ®, смотрите Обучите Агента DDPG для управления Системой Double Integrator.
Исходная модель для этого примера является баком с водой моделью. Цель состоит в том, чтобы контролировать уровень воды в баке. Для получения дополнительной информации о модели бака с водой смотрите Модель Simulink (Simulink Control Design).
Измените исходную модель путем внесения следующих изменений:
Удалите ПИД-регулятор.
Вставьте блок Агент.
Соедините вектор наблюдения , где - высота бака, , и - высота ссылки.
Настройте вознаграждение .
Сконфигурируйте сигнал завершения так, чтобы симуляция остановилась, если или .
Получившаяся модель 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.StandardDeviation = 0.3; agentOpts.NoiseOptions.StandardDeviationDecayRate = 1e-5;
Затем создайте агента DDPG с помощью заданного представления актера, представления критика и опций агента. Для получения дополнительной информации смотрите rlDDPGAgent
.
agent = rlDDPGAgent(actor,critic,agentOpts);
Чтобы обучить агента, сначала укажите опции обучения. В данном примере используйте следующие опции:
Запускайте каждое обучение самое большее для 5000
эпизоды. Задайте, что каждый эпизод длится самое большее ceil(Tf/Ts)
(то есть 200
) временные шаги.
Отображение процесса обучения в диалоговом окне Диспетчер эпизодов (установите 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