В этом примере показано, как преобразовать контроллер PI в watertank Модель Simulink ® для усиления обучающегося агента глубокого детерминированного градиента политики (DDPG). Пример подготовки агента DDPG в MATLAB ® см. в разделе Подготовка агента DDPG к управлению системой двойного интегратора.
Исходной моделью для этого примера является модель резервуара для воды. Цель - контролировать уровень воды в баке. Дополнительные сведения о модели резервуара для воды см. в разделе Модель резервуара для воды Simulink (Simulink Control Design).

Измените исходную модель, внеся следующие изменения.
Удалите контроллер PID.
Вставьте блок агента RL.
Подключите вектор наблюдения , где - высота резервуара, r-h, r - опорная высота.
Настройте (h≤0||h≥20).
Сконфигурируйте сигнал окончания таким образом, чтобы моделирование прекращалось при или .
Результирующая модель: 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