이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.
물탱크 강화 학습 환경 모델
이 예제에서는 탱크 수위 제어기의 역할을 하는 RL 에이전트 블록이 포함되어 있는 강화 학습 Simulink® 환경을 만드는 방법을 보여줍니다. 이 환경을 시뮬레이션하려면 에이전트를 만들고 RL 에이전트 블록에서 이 에이전트를 지정해야 합니다. 이 환경을 사용하여 에이전트를 훈련하는 예제는 Simulink 환경 만들기 및 에이전트 훈련시키기 항목을 참조하십시오.
mdl = 'rlwatertank';
open_system(mdl)
이 모델에는 RL Agent 블록이 이미 포함되어 있으며, 이 블록은 다음과 같은 신호와 연결되어 있습니다.
스칼라형의 행동 출력 신호
벡터형의 관측값 입력 신호
스칼라형의 보상 입력 신호
시뮬레이션을 중단하는 논리형 입력 신호
행동 및 관측값
강화 학습 환경은 에이전트로부터 행동 신호를 받아서 이러한 행동에 대한 응답으로 관측값 신호를 생성합니다. 에이전트를 만들고 훈련시키려면 행동과 관측값의 사양 객체를 만들어야 합니다.
이 환경의 행동 신호는 플랜트로 보내지는 유량의 제어 신호입니다. 이 연속 행동 신호에 대한 사양 객체를 만들기 위해 rlNumericSpec
함수를 사용합니다.
actionInfo = rlNumericSpec([1 1]);
actionInfo.Name = 'flow';
행동 신호가 가능한 값으로 구성된 이산 집합의 값을 받는다면 rlFiniteSetSpec
함수를 사용하여 사양을 만듭니다.
이 환경에서는 에이전트로 보내지는 관측값 신호가 3개 있으며, 벡터 신호로 지정됩니다. 관측값 벡터는 입니다. 여기서 각 변수는 다음과 같습니다.
는 탱크 내부의 물 높이입니다.
, 여기서 은 물 높이에 대한 기준 값입니다.
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
함수를 사용하여 사양을 만드십시오.
보상 신호
스칼라 보상 신호를 생성합니다. 이 예제에서는 다음 보상을 지정합니다.
보상은 오차가 0.1
미만일 때 양수이고, 그렇지 않으면 음수입니다. 또한, 물 높이가 0
~ 20
범위를 벗어나는 경우에는 큰 보상 벌점이 있습니다.
이 보상을 calculate reward 서브시스템에 생성합니다.
open_system([mdl '/calculate reward'])
중지 신호
훈련 에피소드와 시뮬레이션을 종료하려면 블록의 isdone
입력 포트에 논리형 신호를 지정합니다. 이 예제에서는 또는 이면 에피소드를 종료합니다.
이 신호를 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