Обучение с подкреплением для бака с водой Окружения модель

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

mdl = 'rlwatertank';
open_system(mdl)

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

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

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

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

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

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

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

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

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

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

Для этого окружения существует три сигнала наблюдения, посылаемые агенту, заданные как вектор сигнал. Вектор наблюдения [edteh]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 функция.

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

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

reward=10(|e|<0.1)-1(|e|0.1)-100(h0||h20)

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

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

open_system([mdl '/calculate reward'])

Стоп-сигнал

Чтобы завершить эпизоды тренировки и симуляции, задайте логический сигнал к isdone входной порт блока. В данном примере завершите эпизод, если h0 или h20.

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

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

См. также

Похожие темы