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

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

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

Смотрите также

Похожие темы