exponenta event banner

Создание среды Simulink и агента подготовки

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

Модель резервуара для воды

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

Измените исходную модель, внеся следующие изменения.

  1. Удалите контроллер PID.

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

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

  4. Настройте вознаграждение = 10 (| e | < 0.1) -1 (|e|≥0.1) -100 (h≤0||h≥20).

  5. Сконфигурируйте сигнал окончания таким образом, чтобы моделирование прекращалось при 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

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

См. также

(инструментарий для обучения по усилению)

Связанные темы