В этом примере показано, как создать усиление резервуара для воды, изучая среду Simulink ®, которая содержит блок агента RL вместо контроллера уровня воды в резервуаре. Чтобы смоделировать эту среду, необходимо создать агента и указать его в блоке RL Agent. Пример обучения агента с использованием этой среды см. в разделе Создание среды Simulink и агента обучения.
mdl = 'rlwatertank';
open_system(mdl)
Эта модель уже содержит блок агента RL, который подключается к следующим сигналам:
Выходной сигнал скалярного действия
Вектор входных сигналов наблюдения
Входной сигнал скалярного вознаграждения
Логический входной сигнал для остановки моделирования
Среда обучения усилению принимает сигналы действия от агента и генерирует сигналы наблюдения в ответ на эти действия. Для создания и обучения агента необходимо создать объекты спецификации действия и наблюдения.
Сигнал действия для этой среды - это сигнал управления расходом, который посылается на установку. Чтобы создать объект спецификации для этого непрерывного сигнала действия, используйте rlNumericSpec функция.
actionInfo = rlNumericSpec([1 1]);
actionInfo.Name = 'flow';Если сигнал действия принимает одно из дискретного набора возможных значений, создайте спецификацию с помощью rlFiniteSetSpec функция.
Для этой среды существует три сигнала наблюдения, посылаемых агенту, определяемых как векторный сигнал. Вектор наблюдения равен , где:
- высота воды в резервуаре.
r-h, r - опорное значение высоты воды.
Вычислите сигналы наблюдения в подсистеме формирования наблюдений.
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 функция.
Создайте скалярный сигнал вознаграждения. В этом примере укажите следующее вознаграждение.
(h≤0||h≥20)
Вознаграждение является положительным, если ошибка ниже 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