В этом примере показано, как преобразовать ПИ-контроллер в 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.StandardDeviation = 0.3; agentOpts.NoiseOptions.StandardDeviationDecayRate = 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