MATLAB 강화 학습 전투 (8) 협업 작업을 수행하기 위해 여러 에이전트 교육

협업 작업을 수행하도록 여러 에이전트 교육

이 예제는 Simulink® 환경에서 다중 에이전트 교육을 설정하는 방법을 보여줍니다. 이 예에서는 개체를 함께 이동하는 작업을 수행하도록 두 명의 에이전트를 교육했습니다.

여기에 사진 설명 삽입
이 예에서 환경은 원으로 표시되는 요소를 포함하는 마찰없는 2 차원 표면입니다. 대상 물체 C는 반경 2m의 파란색 원으로 표시되고 로봇 A ( 빨간색 ) 및 B ( 녹색 )는 반경 1m의 작은 원으로 표시됩니다. 로봇은 충돌 력을 통해 반경 8m의 원 밖으로 물체 C를 이동하려고합니다. 환경의 모든 요소는 질량을 가지며 뉴턴의 운동 법칙을 따릅니다. 또한 요소와 환경 경계 사이의 접촉력은 스프링 및 질량 댐퍼 시스템으로 모델링됩니다. 요소는 X 및 Y 방향으로 외부 힘을 적용하여 표면에서 이동할 수 있습니다. 3 차원에서는 움직임이 없으며 시스템의 전체 에너지가 보존됩니다.

이 예제에 필요한 매개 변수 세트를 작성하십시오.

rlCollaborativeTaskParams

Simulink 모델을 엽니 다.

mdl = "rlCollaborativeTask";
open_system(mdl)

여기에 사진 설명 삽입
이 환경의 경우 :

  1. X 및 Y 방향의 2 차원 공간 범위는 –12m에서 12m입니다.

  2. 접촉 스프링의 강성 및 감쇠 값은 각각 100N / m 및 0.1N / m / s입니다.

  3. 에이전트는 A, B, C의 이전 시간 단계의 위치, 속도 및 동작 값에 대해 동일한 관찰 결과를 가지고 있습니다.

  4. 개체 C가 원 밖으로 이동하면 시뮬레이션이 종료됩니다.

  5. 각 단계에서 에이전트는 다음과 같은 보상을받습니다.

여기에 사진 설명 삽입

여기:

  1. r A r_A 아르 자형A그리고 r B r_B아르 자형B에이전트 A와 에이전트 B가 각각받는 보상입니다.
  2. rglobal r_ {global} 아르 자형g의 O B 리터팀 보상으로, 오브젝트 C가 링 경계에 가까워지면 두 에이전트 모두이 보상을 받게됩니다.
  3. rlocal, A r_ {local, A} 아르 자형L O C L ,rlocal, B r_ {local, B}아르 자형L O C L , B에이전트 A와 에이전트 B가받는 로컬 페널티입니다. 페널티는 에이전트 A와 에이전트 B, 오브젝트 C 사이의 거리와 이전 시간 단계의 액션 크기를 기반으로합니다.
  4. d C d_C C개체 C에서 링 중심까지의 거리입니다.
  5. d AC d_ {AC} C그리고 d BC d_ {BC}B C에이전트 A와 개체 C 사이, 에이전트 B와 개체 C 사이의 거리입니다.
  6. u A u_A Au B u_BB이전 시간 단계에서 에이전트 A와 에이전트 B의 작업 값입니다.

이 예에서는 개별 운영 공간이있는 근거리 정책 최적화 (PPO) 에이전트를 사용합니다. PPO 에이전트에 대한 자세한 내용은 근거리 전략 최적화 에이전트 를 참조하십시오 . 에이전트는 로봇에 외력을 가하여 움직임을 유발합니다. 각 단계에서 에이전트는 수행 할 작업을 선택합니다. u A, B = [FX, FY] u_ {A, B} = [F_X, F_Y], B=[ F엑스,에프] , 여기서FX, FY F_X, F_Y에프엑스,에프다음 두 가지 외력 중 하나입니다.
여기에 사진 설명 삽입

환경 만들기

다중 에이전트 환경을 만들려면 문자열 배열을 사용하여 에이전트의 블록 경로를 지정합니다. 또한 셀형 배열을 사용하여 관찰 및 동작 지정 객체를 지정합니다. 셀형 배열에서 표준 객체의 순서는 블록 경로 배열에 지정된 순서와 일치해야합니다. 환경이 생성 될 때 MATLAB 작업 공간에서 에이전트를 사용할 수있는 경우 관찰 및 작업 사양 배열은 선택 사항입니다. 다중 에이전트 환경 만들기에 대한 자세한 내용은 rlSimulinkEnv를 참조하십시오 .

환경의 I / O 사양을 만듭니다. 이 예에서 에이전트는 동종이며 I / O 사양이 동일합니다.

% Number of observations
numObs = 16;

% Number of actions
numAct = 2;

% Maximum value of externally applied force (N)
maxF = 1.0;

% I/O specifications for each agent
oinfo = rlNumericSpec([numObs,1]);
ainfo = rlFiniteSetSpec({
    
    
    [-maxF -maxF]
    [-maxF  0   ]
    [-maxF  maxF]
    [ 0    -maxF]
    [ 0     0   ]
    [ 0     maxF]
    [ maxF -maxF]
    [ maxF  0   ]
    [ maxF  maxF]});
oinfo.Name = 'observations';
ainfo.Name = 'forces';

Simulink 환경 인터페이스 생성

blks = ["rlCollaborativeTask/Agent A", "rlCollaborativeTask/Agent B"];
obsInfos = {
    
    oinfo,oinfo};
actInfos = {
    
    ainfo,ainfo};
env = rlSimulinkEnv(mdl,blks,obsInfos,actInfos);

환경의 재설정 기능을 지정하십시오. 재설정 기능 resetRobots는 로봇이 각 에피소드의 시작 부분에서 임의의 초기 위치에서 시작하도록합니다.

env.ResetFcn = @(in) resetRobots(in,RA,RB,RC,boundaryR);

에이전트 만들기

PPO 에이전트는 최고의 전략을 배우기 위해 배우 및 해설자의 에이전트에 의존합니다. 이 예에서 에이전트는 배우와 댓글 작성자를 위해 신경망 기반 함수 근사치를 유지합니다.

신경망과 댓글 작성자의 표현을 만듭니다. 검토 자 네트워크의 출력은 상태 s 의 상태 값 함수 V (s) V (s) 입니다.V s

% Reset the random seed to improve reproducibility
rng(0)

% Critic networks
criticNetwork = [...
    featureInputLayer(oinfo.Dimension(1),'Normalization','none','Name','observation')
    fullyConnectedLayer(128,'Name','CriticFC1','WeightsInitializer','he')
    reluLayer('Name','CriticRelu1')
    fullyConnectedLayer(64,'Name','CriticFC2','WeightsInitializer','he')
    reluLayer('Name','CriticRelu2')
    fullyConnectedLayer(32,'Name','CriticFC3','WeightsInitializer','he')
    reluLayer('Name','CriticRelu3')
    fullyConnectedLayer(1,'Name','CriticOutput')];

% Critic representations
criticOpts = rlRepresentationOptions('LearnRate',1e-4);
criticA = rlValueRepresentation(criticNetwork,oinfo,'Observation',{
    
    'observation'},criticOpts);
criticB = rlValueRepresentation(criticNetwork,oinfo,'Observation',{
    
    'observation'},criticOpts);

행위자 네트워크의 출력은 특정 상태 s에서 가능한 각 행동 쌍을 취할 확률 π (a ∣ s) π (a | s)입니다.π ( a s ) . 신경망과 행위자의 표현을 만듭니다.

% Actor networks
actorNetwork = [...
    featureInputLayer(oinfo.Dimension(1),'Normalization','none','Name','observation')
    fullyConnectedLayer(128,'Name','ActorFC1','WeightsInitializer','he')
    reluLayer('Name','ActorRelu1')
    fullyConnectedLayer(64,'Name','ActorFC2','WeightsInitializer','he')
    reluLayer('Name','ActorRelu2')
    fullyConnectedLayer(32,'Name','ActorFC3','WeightsInitializer','he')
    reluLayer('Name','ActorRelu3')
    fullyConnectedLayer(numel(ainfo.Elements),'Name','Action')
    softmaxLayer('Name','SM')];

% Actor representations
actorOpts = rlRepresentationOptions('LearnRate',1e-4);
actorA = rlStochasticActorRepresentation(actorNetwork,oinfo,ainfo,...
    'Observation',{
    
    'observation'},actorOpts);
actorB = rlStochasticActorRepresentation(actorNetwork,oinfo,ainfo,...
    'Observation',{
    
    'observation'},actorOpts);

에이전트를 만듭니다. 두 에이전트 모두 동일한 옵션을 사용합니다.

agentOptions = rlPPOAgentOptions(...
    'ExperienceHorizon',256,...
    'ClipFactor',0.125,...
    'EntropyLossWeight',0.001,...
    'MiniBatchSize',64,...
    'NumEpoch',3,...
    'AdvantageEstimateMethod','gae',...
    'GAEFactor',0.95,...
    'SampleTime',Ts,...
    'DiscountFactor',0.9995);
agentA = rlPPOAgent(actorA,criticA,agentOptions);
agentB = rlPPOAgent(actorB,criticB,agentOptions);

훈련 중에 에이전트는 256 단계의 경험 범위에 도달하거나 에피소드가 종료 될 때까지 경험을 수집 한 다음 64 개의 경험으로 구성된 작은 배치에서 훈련합니다. 이 예제에서는 훈련 안정성을 향상시키기 위해 0.125의 목적 함수 제한 계수를 사용하고 장기 보상을 장려하기 위해 0.9995의 할인 계수를 사용합니다.

교육 에이전트

에이전트를 훈련하려면 다음 훈련 옵션을 지정하십시오.

  1. 최대 1000 개의 에피소드를 훈련하고 각 에피소드는 최대 5000 개의 시간 단계로 진행됩니다.

  2. 연속 100 회 이상 에이전트의 평균 보상이 -10 이상이면 에이전트 교육을 중지합니다.

maxEpisodes = 1000;
maxSteps = 5e3;
trainOpts = rlTrainingOptions(...
    'MaxEpisodes',maxEpisodes,...
    'MaxStepsPerEpisode',maxSteps,...
    'ScoreAveragingWindowLength',100,...
    'Plots','training-progress',...
    'StopTrainingCriteria','AverageReward',...
    'StopTrainingValue',-10);

여러 에이전트를 훈련 시키려면 훈련 함수에 대한 에이전트 배열을 지정하십시오 . 어레이의 에이전트 순서는 환경 생성 중에 지정된 에이전트 블록 경로의 순서와 일치해야합니다. 이렇게하면 에이전트 개체가 환경의 해당 I / O 인터페이스에 연결됩니다. 이러한 에이전트 교육은 사용 가능한 컴퓨팅 성능에 따라 완료하는 데 몇 시간이 걸릴 수 있습니다.

MAT 파일 rlCollaborativeTaskAgents에는 사전 훈련 된 에이전트 세트가 포함되어 있습니다. 파일을로드하고 에이전트의 성능을 볼 수 있습니다. 에이전트를 직접 훈련하려면 doTraining을 true로 설정하십시오 .

doTraining = false;
if doTraining
    stats = train([agentA, agentB],env,trainOpts);
else
    load('rlCollaborativeTaskAgents.mat');
end

아래 그림은 교육 진행 상황의 스크린 샷을 보여줍니다. 훈련 과정의 무작위성으로 인해 다른 결과를 얻을 수 있습니다.
여기에 사진 설명 삽입

에이전트 시뮬레이션

시뮬레이션 된 환경에서 훈련 된 에이전트.

simOptions = rlSimulationOptions('MaxSteps',maxSteps);
exp = sim(env,[agentA agentB],simOptions);

여기에 사진 설명 삽입
에이전트 시뮬레이션에 대한 자세한 내용은 rlSimulationOptionssim을 참조하십시오 .

추천

출처blog.csdn.net/wangyifan123456zz/article/details/109614456