Main Content

SimulinkEnvWithAgent

Simulink에서 구현된 동적 모델을 사용하는 강화 학습 환경

설명

SimulinkEnvWithAgent 객체는 Simulink®에서 구현된 동적 모델을 사용하는 강화 학습 환경을 나타냅니다. 환경 객체는 인터페이스로 동작하기 때문에 sim 또는 train을 호출하면 이 함수에서 다시 Simulink 모델을 호출하여 에이전트의 경험을 생성합니다.

생성

SimulinkEnvWithAgent 객체를 만들려면 다음 함수 중 하나를 사용하십시오.

  • rlSimulinkEnv — 적어도 하나의 RL Agent 블록을 가진 Simulink 모델을 사용하여 환경을 생성합니다.

  • createIntegratedEnv — 참조 모델을 강화 학습 환경으로 사용합니다.

  • rlPredefinedEnv — 미리 정의된 강화 학습 환경을 만듭니다.

속성

모두 확장

Simulink 모델 이름으로, string형 또는 문자형 벡터로 지정됩니다. 지정된 모델은 RL Agent 블록을 하나 이상 포함해야 합니다.

에이전트 블록 경로로, string형 또는 string형 배열로 지정됩니다.

Model에 훈련을 위한 한 개의 RL Agent 블록이 포함된 경우 AgentBlock은 블록 경로를 포함하는 string형입니다.

Model에 훈련을 위한 여러 개의 RL Agent 블록이 포함된 경우 AgentBlock은 각 요소에 하나의 에이전트 블록의 경로가 포함된 string형 배열입니다.

ModelAgentBlock에 경로가 포함되지 않은 RL Agent 블록을 포함할 수 있습니다. 이러한 에이전트 블록은 환경의 일부로 동작하고 현재 정책을 기반으로 행동을 선택합니다. sim 또는 train을 호출했을 때 이러한 에이전트의 경험은 반환되지 않으며 정책이 업데이트되지 않습니다.

에이전트 블록은 모델 참조의 내부에 있을 수 있습니다. 강화 학습을 위해 에이전트 블록을 구성하는 방법에 대한 자세한 내용은 RL Agent 항목을 참조하십시오.

환경에 대한 재설정 동작으로, 함수 핸들 또는 익명 함수 핸들로 지정됩니다. 이 함수는 하나의 Simulink.SimulationInput 입력 인수와 하나의 Simulink.SimulationInput 출력 인수를 가져야 합니다.

재설정 함수는 Simulink 환경의 초기 상태를 설정합니다. 예를 들어, 각 훈련 에피소드가 매번 다른 초기 조건에서 시작하도록 특정 블록 상태를 무작위로 할당하는 재설정 함수를 만들 수 있습니다.

MATLAB® 경로에 기존 재설정 함수 myResetFunction이 있는 경우 그 함수에 대한 핸들을 사용하여 ResetFcn을 설정하십시오.

env.ResetFcn = @(in)myResetFunction(in);

재설정 동작이 간단한 경우 익명 함수 핸들을 사용하여 동작을 구현할 수 있습니다. 예를 들어 다음 코드는 변수 x0을 난수 값으로 설정합니다.

env.ResetFcn = @(in) setVariable(in,'x0',rand());

sim 함수는 각 시뮬레이션이 시작될 때 재설정 함수를 호출하여 환경을 재설정하고, train 함수는 각 훈련 에피소드가 시작될 때 재설정 함수를 호출합니다.

빠른 재시작을 켜거나 끄는 옵션으로, "on" 또는 "off"로 지정됩니다. 빠른 재시작을 사용하면 매번 모델을 컴파일하거나 시뮬레이션을 종료하지 않고도 반복 시뮬레이션을 수행할 수 있습니다.

빠른 재시작에 대한 자세한 내용은 How Fast Restart Improves Iterative Simulations (Simulink) 항목을 참조하십시오.

객체 함수

trainTrain reinforcement learning agents within a specified environment
simSimulate trained reinforcement learning agents within specified environment
getObservationInfo강화 학습 환경, 에이전트 또는 경험 버퍼에서 관측값 데이터 사양 가져오기
getActionInfo강화 학습 환경, 에이전트 또는 경험 버퍼에서 행동 데이터 사양 가져오기

예제

모두 축소

Simulink 환경 만들기 및 에이전트 훈련시키기 예제에서 훈련된 에이전트와 해당 Simulink 모델을 사용하여 Simulink 환경을 만듭니다.

MATLAB® 작업 공간에 에이전트를 불러옵니다.

load rlWaterTankDDPGAgent

RL Agent 블록이 포함된 rlwatertank 모델의 환경을 만듭니다. 블록에 사용되는 에이전트가 이미 작업 공간에 있으므로 환경을 만들 때 관측값 사양과 행동 사양을 전달할 필요가 없습니다.

env = rlSimulinkEnv("rlwatertank","rlwatertank/RL Agent")
env = 
SimulinkEnvWithAgent with properties:

           Model : rlwatertank
      AgentBlock : rlwatertank/RL Agent
        ResetFcn : []
  UseFastRestart : on

2개 샘플 시간에 대해 짧은 시뮬레이션을 수행하여 환경을 검증합니다.

validateEnvironment(env)

이제 trainsim을 각각 사용하여 환경 내에서 에이전트를 훈련시키고 시뮬레이션할 수 있습니다.

이 예제에서는 Simulink® 모델 rlSimplePendulumModel이 있다고 가정해 보겠습니다. 이 모델은 처음에 아래쪽을 향해 매달려 있는 마찰 없는 단순 진자입니다.

모델을 엽니다.

mdl = "rlSimplePendulumModel";
open_system(mdl)

관측값 사양과 행동 사양에 대해 각각 rlNumericSpecrlFiniteSetSpec 객체를 만듭니다.

관측값은 각도의 사인, 코사인 및 시간 도함수에 해당하는 3개의 신호를 포함하는 벡터입니다.

obsInfo = rlNumericSpec([3 1]) 
obsInfo = 
  rlNumericSpec with properties:

     LowerLimit: -Inf
     UpperLimit: Inf
           Name: [0x0 string]
    Description: [0x0 string]
      Dimension: [3 1]
       DataType: "double"

행동은 토크를 표현하는 스칼라이며 -2Nm, 0Nm, 2Nm의 3개 값 중 하나일 수 있습니다.

actInfo = rlFiniteSetSpec([-2 0 2])
actInfo = 
  rlFiniteSetSpec with properties:

       Elements: [3x1 double]
           Name: [0x0 string]
    Description: [0x0 string]
      Dimension: [1 1]
       DataType: "double"

점 표기법을 사용하여 rlNumericSpecrlFiniteSetSpec 객체에 대한 속성값을 할당할 수 있습니다.

obsInfo.Name = "observations";
actInfo.Name = "torque";

에이전트 블록 경로 정보를 할당하고, 이전 단계에서 추출된 정보를 사용하여 Simulink 모델에 대한 강화 학습 환경을 만듭니다.

agentBlk = mdl + "/RL Agent";
env = rlSimulinkEnv(mdl,agentBlk,obsInfo,actInfo)
env = 
SimulinkEnvWithAgent with properties:

           Model : rlSimplePendulumModel
      AgentBlock : rlSimplePendulumModel/RL Agent
        ResetFcn : []
  UseFastRestart : on

점 표기법을 사용하여 재설정 함수를 지정할 수도 있습니다. 이 예제에서는 모델 작업 공간에서 theta0을 임의로 초기화합니다.

env.ResetFcn = @(in) setVariable(in,"theta0",randn,"Workspace",mdl)
env = 
SimulinkEnvWithAgent with properties:

           Model : rlSimplePendulumModel
      AgentBlock : rlSimplePendulumModel/RL Agent
        ResetFcn : @(in)setVariable(in,"theta0",randn,"Workspace",mdl)
  UseFastRestart : on

예제 여러 개의 에이전트가 협업해서 작업을 수행하도록 훈련시키기의 Simulink 모델에 대한 환경을 만듭니다.

에이전트가 포함된 파일을 불러옵니다. 이 예제에서는 분산 학습을 사용하여 사전 훈련된 에이전트를 불러옵니다.

load decentralizedAgents.mat

두 에이전트 블록을 갖는 rlCollaborativeTask 모델의 환경을 만듭니다. 두 블록(agentAagentB)에 사용되는 에이전트가 이미 작업 공간에 있으므로 환경을 만들 때 관측값 사양과 행동 사양을 전달할 필요가 없습니다.

env = rlSimulinkEnv( ...
    "rlCollaborativeTask", ...
    ["rlCollaborativeTask/Agent A","rlCollaborativeTask/Agent B"])
env = 
SimulinkEnvWithAgent with properties:

           Model : rlCollaborativeTask
      AgentBlock : [
                     rlCollaborativeTask/Agent A
                     rlCollaborativeTask/Agent B
                   ]
        ResetFcn : []
  UseFastRestart : on

각 에피소드가 시작할 때마다 에이전트가 임의의 초기 위치에서 시작하도록 환경에 대한 reset 함수를 지정하는 것이 좋습니다. 예제는 여러 개의 에이전트가 협업해서 작업을 수행하도록 훈련시키기에 정의된 resetRobots 함수를 참조하십시오.

이제 환경 내에서 sim 또는 train을 각각 사용하여 에이전트를 시뮬레이션하거나 훈련시킬 수 있습니다.

미리 정의된 "SimplePendulumModel-Continuous" 키워드를 사용하여 연속 단진자 모델 강화 학습 환경을 만듭니다.

env = rlPredefinedEnv("SimplePendulumModel-Continuous")
env = 
SimulinkEnvWithAgent with properties:

           Model : rlSimplePendulumModel
      AgentBlock : rlSimplePendulumModel/RL Agent
        ResetFcn : []
  UseFastRestart : on

이 예제에서는 에이전트가 상호 작용하는 시스템을 구현하고 에이전트 블록을 갖지 않는 Simulink 모델에서 시작하여 createIntegratedEnv를 사용하여 환경 객체를 만드는 방법을 보여줍니다. 이러한 시스템은 흔히 플랜트, 개루프 시스템 또는 기준 시스템이라고 하고, 에이전트를 포함하는 전체 (통합) 시스템은 흔히 폐루프 시스템이라고 합니다.

이 예제에서는 슬라이딩 로봇을 조종하도록 DDPG 에이전트 훈련시키기에 설명된 비행 로봇 모델을 기준 (개루프) 시스템으로 사용합니다.

비행 로봇 모델을 엽니다.

open_system("rlFlyingRobotEnv")

상태 변수와 샘플 시간을 초기화합니다.

% initial model state variables
theta0 = 0;
x0 = -15;
y0 = 0;

% sample time
Ts = 0.4;

비행 로봇 모델을 포함하는 Simulink 모델 myIntegratedEnv인데 폐루프에서 에이전트 블록에 연결되는 모델을 만듭니다. 이 함수는 훈련에 사용할 강화 학습 환경 객체 env도 반환합니다.

env = createIntegratedEnv( ...
    "rlFlyingRobotEnv", ...
    "myIntegratedEn")
env = 
SimulinkEnvWithAgent with properties:

           Model : myIntegratedEn
      AgentBlock : myIntegratedEn/RL Agent
        ResetFcn : []
  UseFastRestart : on

이 함수는 새로운 통합 모델의 RL Agent 블록에 대한 블록 경로뿐 아니라 참조 모델의 관측값 사양 및 행동 사양을 반환할 수도 있습니다.

[~,agentBlk,observationInfo,actionInfo] = ...
    createIntegratedEnv( ...
    "rlFlyingRobotEnv","myIntegratedEnv")
agentBlk = 
"myIntegratedEnv/RL Agent"
observationInfo = 
  rlNumericSpec with properties:

     LowerLimit: -Inf
     UpperLimit: Inf
           Name: "observation"
    Description: [0x0 string]
      Dimension: [7 1]
       DataType: "double"

actionInfo = 
  rlNumericSpec with properties:

     LowerLimit: -Inf
     UpperLimit: Inf
           Name: "action"
    Description: [0x0 string]
      Dimension: [2 1]
       DataType: "double"

블록 경로와 사양을 반환하면 observationInfoactionInfo의 설명, 제한값 또는 이름을 수정해야 하는 경우에 유용합니다. 사양을 수정한 후에 rlSimulinkEnv 함수를 사용하여 통합 모델 IntegratedEnv로부터 환경을 만들 수 있습니다.

버전 내역

R2019a에 개발됨