Создайте окружение Simulink и Обучите Агента

Этот пример показов, как преобразовать ПИ-контроллер в watertank Simulink ® моделирует агент глубокого детерминированного градиента политики (DDPG) обучения с подкреплением. Для примера, который обучает агента DDPG в MATLAB ®, смотрите Обучите Агента DDPG для управления Системой Double Integrator.

Модель бака с водой

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

Измените исходную модель путем внесения следующих изменений:

  1. Удалите ПИД-регулятор.

  2. Вставьте блок Агент.

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

  4. Настройте вознаграждение reward=10(|e|<0.1)-1(|e|0.1)-100(h0||h20).

  5. Сконфигурируйте сигнал завершения так, чтобы симуляция остановилась, если h0 или h20.

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

Учитывая наблюдения и действия, агент 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)

Figure contains an axes. The axes contains an object of type graphplot.

Задайте опции для представления критика используя 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

См. также

Похожие темы