주요 콘텐츠

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

물탱크 강화 학습 환경 모델

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

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);

reset 함수가 항상 동일한 임의 초기값을 반환하도록 하려면 reset 함수를 호출하기 전에 난수 스트림 생성기를 고정합니다. 예를 들어 시드값 0과 난수 알고리즘인 메르센 트위스터를 사용하여 난수 스트림을 고정합니다. 난수 생성에 사용되는 시드값을 제어하는 방법에 대한 자세한 내용은 rng 항목을 참조하십시오.

previousRngState = rng(0,"twister");

로컬 함수

function in = localResetFcn(in)

% Randomize reference signal
h = 3*randn + 10;
while h <= 0 || h >= 20
    h = 3*randn + 10;
end
in = setBlockParameter(in, ...
    "rlwatertank/Desired \nWater Level", ...
    Value=num2str(h));

% Randomize initial height
h = 3*randn + 10;
while h <= 0 || h >= 20
    h = 3*randn + 10;
end
in = setBlockParameter(in, ...
    "rlwatertank/Water-Tank System/H", ...
    InitialCondition=num2str(h));

end

참고 항목

함수

도움말 항목