Main Content

물탱크 강화 학습 환경 모델

이 예제에서는 탱크 수위 제어기의 역할을 하는 RL 에이전트 블록이 포함되어 있는 강화 학습 Simulink® 환경을 만드는 방법을 보여줍니다. 이 환경을 시뮬레이션하려면 에이전트를 만들고 RL 에이전트 블록에서 이 에이전트를 지정해야 합니다. 이 환경을 사용하여 에이전트를 훈련하는 예제는 Simulink 환경 만들기 및 에이전트 훈련시키기 항목을 참조하십시오.

mdl = 'rlwatertank';
open_system(mdl)

이 모델에는 RL Agent 블록이 이미 포함되어 있으며, 이 블록은 다음과 같은 신호와 연결되어 있습니다.

  • 스칼라형의 행동 출력 신호

  • 벡터형의 관측값 입력 신호

  • 스칼라형의 보상 입력 신호

  • 시뮬레이션을 중단하는 논리형 입력 신호

행동 및 관측값

강화 학습 환경은 에이전트로부터 행동 신호를 받아서 이러한 행동에 대한 응답으로 관측값 신호를 생성합니다. 에이전트를 만들고 훈련시키려면 행동과 관측값의 사양 객체를 만들어야 합니다.

이 환경의 행동 신호는 플랜트로 보내지는 유량의 제어 신호입니다. 이 연속 행동 신호에 대한 사양 객체를 만들기 위해 rlNumericSpec 함수를 사용합니다.

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

행동 신호가 가능한 값으로 구성된 이산 집합의 값을 받는다면 rlFiniteSetSpec 함수를 사용하여 사양을 만듭니다.

이 환경에서는 에이전트로 보내지는 관측값 신호가 3개 있으며, 벡터 신호로 지정됩니다. 관측값 벡터는 [e dteh]T 입니다. 여기서 각 변수는 다음과 같습니다.

  • h는 탱크 내부의 물 높이입니다.

  • e=r-h, 여기서 r은 물 높이에 대한 기준 값입니다.

generate observations 서브시스템에서 관측값 신호를 계산합니다.

open_system([mdl '/generate observations'])

3개 요소를 갖는 관측값 사양 벡터를 만듭니다. 물 높이의 하한을 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 범위를 벗어나는 경우에는 큰 보상 벌점이 있습니다.

이 보상을 calculate reward 서브시스템에 생성합니다.

open_system([mdl '/calculate reward'])

중지 신호

훈련 에피소드와 시뮬레이션을 종료하려면 블록의 isdone 입력 포트에 논리형 신호를 지정합니다. 이 예제에서는 h0 또는 h20이면 에피소드를 종료합니다.

이 신호를 stop simulation 서브시스템에서 계산합니다.

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

참고 항목

관련 항목