Этот пример показывает, как преобразовать контроллер PI в watertank.slx
к укреплению, изучив агент глубоко детерминированного градиента политики (DDPG). Для примера, который обучает агент DDPG в MATLAB®, смотрите Train Агент DDPG, чтобы Управлять Двойной Системой Интегратора.
Исходная модель для этого примера является моделью бака для воды. Цель состоит в том, чтобы управлять уровнем воды в корпусе. Для получения дополнительной информации о модели бака для воды, см. watertank Модель Simulink.
Из исходной модели измените модель со следующими шагами:
Удалите блок PID Controller.
Вставьте блок RL Agent.
Соедините вектор наблюдения , где высота корпуса, , и ссылочная высота.
Настройте премиальный сигнал предоставить положительное вознаграждение, когда ошибка является небольшой и штрафы, когда вознаграждение является большим, или высота воды вне целевого диапазона:
Настройте оконечный сигнал остановить симуляцию, если высота воды вне данной области значений:
Получившейся моделью является rlwatertank.slx
. Откройте получившуюся модель.
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 = numel(actInfo);
Создайте объект интерфейса среды.
env = rlSimulinkEnv('rlwatertank','rlwatertank/RL Agent',... obsInfo,actInfo);
Установите пользовательскую функцию сброса, которая рандомизирует ссылочные значения для модели.
env.ResetFcn = @(in)localResetFcn(in);
Задайте время симуляции Tf
и шаг расчета агента Ts
в секундах
Ts = 1.0; Tf = 200;
Зафиксируйте случайный seed генератора для воспроизводимости.
rng(0)
Агент DDPG аппроксимирует долгосрочное вознаграждение, данное наблюдения и действия с помощью представления функции значения критика. Чтобы создать критика, сначала создайте глубокую нейронную сеть с двумя входными параметрами, наблюдением и действием и одним выводом. Для получения дополнительной информации о создании представления функции значения глубокой нейронной сети смотрите, Создают политику и Представления Функции Значения.
statePath = [ imageInputLayer([numObservations 1 1], 'Normalization', 'none', 'Name', 'State') fullyConnectedLayer(50, 'Name', 'CriticStateFC1') reluLayer('Name', 'CriticRelu1') fullyConnectedLayer(25, 'Name', 'CriticStateFC2')]; actionPath = [ imageInputLayer([numActions 1 1], '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);
Создайте представление критика с помощью заданной глубокой нейронной сети и опций. Необходимо также задать спецификации действия и наблюдения для критика, которого вы получаете из интерфейса среды. Для получения дополнительной информации смотрите rlRepresentation
.
critic = rlRepresentation(criticNetwork,obsInfo,actInfo,'Observation',{'State'},'Action',{'Action'},criticOpts);
Агент DDPG решает который действие взять данный наблюдения с помощью представления агента. Чтобы создать агента, сначала создайте глубокую нейронную сеть с одним входом, наблюдением, и одним выводом, действием.
Создайте агента подобным образом как критика.
actorNetwork = [ imageInputLayer([numObservations 1 1], 'Normalization', 'none', 'Name', 'State') fullyConnectedLayer(3, 'Name', 'actorFC') tanhLayer('Name', 'actorTanh') fullyConnectedLayer(numActions, 'Name', 'Action') ]; actorOptions = rlRepresentationOptions('LearnRate',1e-04,'GradientThreshold',1); actor = rlRepresentation(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
с каждым эпизодом, длящимся самое большее 200
временные шаги.
Отобразитесь учебный прогресс диалогового окна Episode Manager (установите опцию Plots
), и отключите отображение командной строки (установите опцию Verbose
).
Остановите обучение, когда агент получит среднее совокупное вознаграждение, больше, чем 800 более чем двадцать последовательных эпизодов. На данном этапе агент может управлять уровнем воды в корпусе.
Для получения дополнительной информации смотрите 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 pretrained agent for the example. load('WaterTankDDPG.mat','agent') end
Подтвердите изученный агент против модели симуляцией.
rlSimulationOptions('MaxSteps',maxsteps,'StopOnError','on'); experiences = sim(env,agent);
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
MATLAB и Simulink являются зарегистрированными торговыми марками MathWorks, Inc. См. www.mathworks.com/trademarks для списка других товарных знаков, принадлежавших MathWorks, Inc. Другим продуктом или фирменными знаками являются товарные знаки или зарегистрированные торговые марки их соответствующих владельцев.