В этом примере показано, как создать окружение Simulink ® обучения с подкреплением гидроемкости, которая содержит блок RL Agent вместо контроллера уровня воды в баке. Чтобы симулировать это окружение, вы должны создать агента и указать этого агента в блоке RL Agent. Пример, который обучает агента, используя это окружение, см. в разделе Создание Окружении Simulink и Train агента.
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