exponenta event banner

Модель учебной среды для усиления резервуаров для воды

В этом примере показано, как создать усиление резервуара для воды, изучая среду Simulink ®, которая содержит блок агента RL вместо контроллера уровня воды в резервуаре. Чтобы смоделировать эту среду, необходимо создать агента и указать его в блоке RL Agent. Пример обучения агента с использованием этой среды см. в разделе Создание среды Simulink и агента обучения.

mdl = 'rlwatertank';
open_system(mdl)

Эта модель уже содержит блок агента RL, который подключается к следующим сигналам:

  • Выходной сигнал скалярного действия

  • Вектор входных сигналов наблюдения

  • Входной сигнал скалярного вознаграждения

  • Логический входной сигнал для остановки моделирования

Действия и наблюдения

Среда обучения усилению принимает сигналы действия от агента и генерирует сигналы наблюдения в ответ на эти действия. Для создания и обучения агента необходимо создать объекты спецификации действия и наблюдения.

Сигнал действия для этой среды - это сигнал управления расходом, который посылается на установку. Чтобы создать объект спецификации для этого непрерывного сигнала действия, используйте rlNumericSpec функция.

actionInfo = rlNumericSpec([1 1]);
actionInfo.Name = 'flow';

Если сигнал действия принимает одно из дискретного набора возможных значений, создайте спецификацию с помощью rlFiniteSetSpec функция.

Для этой среды существует три сигнала наблюдения, посылаемых агенту, определяемых как векторный сигнал. Вектор наблюдения равен [∫e dth] T, где:

  • h - высота воды в резервуаре.

  • e = 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 функция.

Сигнал вознаграждения

Создайте скалярный сигнал вознаграждения. В этом примере укажите следующее вознаграждение.

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

Вознаграждение является положительным, если ошибка ниже 0.1 и отрицательный в противном случае. Кроме того, существует большой штраф вознаграждения, когда высота воды находится за пределами 0 кому 20 диапазон.

Создайте это вознаграждение в подсистеме расчета вознаграждения.

open_system([mdl '/calculate reward'])

Стоп-сигнал

Чтобы завершить обучающие эпизоды и моделирование, укажите логический сигнал для isdone входной порт блока. Для этого примера завершите эпизод, если h≤0 или h≥20.

Вычислите этот сигнал в подсистеме моделирования остановки.

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

См. также

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