Создайте агент окружения Simulink и Train

Этот пример показывает, как преобразовать контроллер PI в watertank.slx к укреплению, изучив агент глубоко детерминированного градиента политики (DDPG). Для примера, который обучает агент DDPG в MATLAB®, смотрите Train Агент DDPG, чтобы Управлять Двойной Системой Интегратора.

Модель бака для воды

Исходная модель для этого примера является моделью бака для воды. Цель состоит в том, чтобы управлять уровнем воды в корпусе. Для получения дополнительной информации о модели бака для воды, см. watertank Модель Simulink.

Из исходной модели измените модель со следующими шагами:

  1. Удалите блок PID Controller.

  2. Вставьте блок RL Agent.

  3. Соедините вектор наблюдения [edt eh]T, где h высота корпуса, e=r-h, и r ссылочная высота.

  4. Настройте премиальный сигнал предоставить положительное вознаграждение, когда ошибка является небольшой и штрафы, когда вознаграждение является большим, или высота воды вне целевого диапазона: вознаграждение=10(|e|<0.1)-1(|e|0.1)-100(h0||h20)

  5. Настройте оконечный сигнал остановить симуляцию, если высота воды вне данной области значений: h0||h20

Получившейся моделью является 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

Агент 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);

Localfunctions

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. Другим продуктом или фирменными знаками являются товарные знаки или зарегистрированные торговые марки их соответствующих владельцев.

Смотрите также

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте