В этом примере показано, как создать обучение с подкреплением для бака с водой среда Simulink®, которая содержит блок RL Agent вместо контроллера для уровня воды в баке. Чтобы симулировать эту среду, необходимо создать агента и задать то свойство агента в блоке RL Agent. Для примера, который обучает агента с помощью этой среды, смотрите, Создают окружение Simulink и Обучают Агента.
mdl = 'rlwatertank';
open_system(mdl)
Эта модель уже содержит блок RL Agent, который соединяется со следующими сигналами:
Скалярный выходной сигнал действия
Вектор входных сигналов наблюдения
Скалярный входной сигнал вознаграждения
Логический входной сигнал для остановки симуляции
Среда обучения с подкреплением получает сигналы действия от агента и генерирует сигналы наблюдения в ответ на эти действия. Чтобы создать и обучить агента, вы должны создать объекты спецификаций действий наблюдений.
Сигнал действия для этой среды является управляющим сигналом скорости потока жидкости, который отправляется в объект. Чтобы создать объект спецификации для этого непрерывного сигнала действия, используйте rlNumericSpec
функция.
actionInfo = rlNumericSpec([1 1]);
actionInfo.Name = 'flow';
Если сигнал действия принимает одно из значений из дискретного набора возможных, создайте спецификацию с помощью rlFiniteSetSpec
функция.
Для этой среды существует три сигнала наблюдения, отправленные в агента в виде векторного сигнала. Вектор наблюдения , где:
уровень воды в баке.
, где уставка уровня воды.
Вычислите сигналы наблюдения в сгенерировать подсистеме наблюдений.
open_system([mdl '/generate observations'])
Создайте трехэлементный вектор спецификаций наблюдений. Задайте нижнюю границу 0 для уровня воды, оставив другие сигналы наблюдения неограниченными.
observationInfo = rlNumericSpec([3 1],... 'LowerLimit',[-inf -inf 0 ]',... 'UpperLimit',[ inf inf inf]'); observationInfo.Name = 'observations'; observationInfo.Description = 'integrated error, error, and measured height';
Если действия или наблюдения представлены сигналами шины, создают технические требования с помощью bus2RLSpec
функция.
Создайте скалярный сигнал вознаграждения. В данном примере задайте следующее вознаграждение.
Вознаграждение положительно, когда ошибка ниже 0.1
и отрицательный в противном случае. Кроме того, существует большой премиальный штраф, когда уровень воды находится вне 0
к 20
область значений.
Создайте это вознаграждение в вычислить премиальной подсистеме.
open_system([mdl '/calculate reward'])
Для остановки эпизодов обучения и моделирования задайте логический сигнал к isdone
входной порт блока. В данном примере закончите эпизод если или .
Вычислите этот сигнал в подсистеме симуляции остановки.
open_system([mdl '/stop simulation'])
Создайте объект среды для модели Simulink.
env = rlSimulinkEnv(mdl,[mdl '/RL Agent'],observationInfo,actionInfo);
Можно также создать пользовательскую функцию сброса, которая рандомизирует параметры, переменные или состояния модели. В этом примере функция сброса рандомизирует сигнал уставки и начальный уровень воды и устанавливает соответствующие параметры блоков.
env.ResetFcn = @(in)localResetFcn(in);
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