Capacite a múltiples agentes para realizar tareas colaborativas
Este ejemplo muestra cómo configurar la formación de varios agentes en el entorno de Simulink®. En este ejemplo, entrenó a dos agentes para realizar la tarea de mover objetos juntos.
En este ejemplo, el entorno es una superficie bidimensional sin fricción que contiene elementos representados por círculos . El objeto objetivo C está representado por un círculo azul con un radio de 2 m , y los robots A ( rojo ) y B ( verde ) están representados por círculos más pequeños con un radio de 1 m. El robot intenta mover el objeto C fuera del círculo con un radio de 8 m a través de la fuerza de colisión. Todos los elementos del entorno tienen masa y obedecen las leyes de movimiento de Newton. Además, la fuerza de contacto entre el elemento y el límite ambiental se modela como un sistema amortiguador de resorte y masa. Los elementos pueden moverse en la superficie aplicando fuerzas externas en las direcciones X e Y. No hay movimiento en tres dimensiones y se conserva la energía total del sistema.
Cree el conjunto de parámetros necesario para este ejemplo.
rlCollaborativeTaskParams
Abra el modelo de Simulink.
mdl = "rlCollaborativeTask";
open_system(mdl)
Para este entorno:
-
El rango del espacio bidimensional en las direcciones X e Y es de –12 ma 12 m.
-
Los valores de rigidez y amortiguación del resorte de contacto son 100 N / my 0,1 N / m / s, respectivamente.
-
El agente tiene los mismos resultados de observación para la posición, la velocidad y el valor de acción del paso de tiempo anterior de A, B y C.
-
Cuando el objeto C se mueve fuera del círculo, la simulación termina.
-
En cada paso de tiempo, el agente recibirá las siguientes recompensas:
Aquí:
- r A r_A rlaY r B r_BrBEstas son las recompensas recibidas por el agente A y el agente B, respectivamente.
- rglobal r_ {global} rg l o b un lEs una recompensa de equipo.Cuando el objeto C está cerca del límite del anillo, ambos agentes obtendrán esta recompensa.
- rlocal, A r_ {local, A} rl o c a l , A和rlocal, B r_ {local, B}rl o c a l , BEs la penalización local recibida por el agente A y el agente B. La penalización se basa en la distancia entre el agente A y el agente B y el objeto C y el tamaño de la acción del paso de tiempo anterior.
- d C d_C DCEs la distancia del objeto C al centro del anillo.
- d AC d_ {AC} DA CY d BC d_ {BC}DB CEstas son las distancias entre el agente A y el objeto C, y entre el agente B y el objeto C.
- u A u_A tulaSuma u B u_BtuBEs el valor de acción del agente A y del agente B en el paso de tiempo anterior.
Este ejemplo utiliza un agente de optimización de políticas de extremo cercano (PPO) con un espacio operativo discreto. Para obtener más información sobre el agente PPO, consulte el agente de optimización de la estrategia de extremo cercano . El agente aplica una fuerza externa al robot, lo que provoca el movimiento. En cada paso de tiempo, el agente elegirá la acción que desea realizar u A, B = [FX, FY] u_ {A, B} = [F_X, F_Y]tuA , B=[ FX,FY] , DondeFX, FY F_X, F_YFX,FYEs una de las siguientes dos fuerzas externas.
Crea el medio ambiente
Para crear un entorno de agentes múltiples, utilice una matriz de cadenas para especificar la ruta del bloque del agente. Además, utilice matrices de celdas para especificar objetos de observación y acción especificados. El orden de los objetos canónicos en la matriz de celdas debe coincidir con el orden especificado en la matriz de ruta del bloque. Cuando un agente está disponible en el espacio de trabajo de MATLAB cuando se crea el entorno, las matrices de especificación de observación y operación son opcionales. Para obtener más información sobre cómo crear un entorno de agentes múltiples, consulte rlSimulinkEnv .
Cree la especificación de E / S del entorno. En este ejemplo, los agentes son homogéneos y tienen las mismas especificaciones de E / S.
% 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';
Crear interfaz de entorno Simulink
blks = ["rlCollaborativeTask/Agent A", "rlCollaborativeTask/Agent B"];
obsInfos = {
oinfo,oinfo};
actInfos = {
ainfo,ainfo};
env = rlSimulinkEnv(mdl,blks,obsInfos,actInfos);
Especifique la función de reinicio del entorno. La función de reinicio resetRobots asegura que el robot comience desde una posición inicial aleatoria al comienzo de cada episodio.
env.ResetFcn = @(in) resetRobots(in,RA,RB,RC,boundaryR);
Crea un agente
Los agentes de PPO confían en los agentes de los actores y comentaristas para aprender la mejor estrategia. En este ejemplo, el agente mantiene un aproximador de funciones basado en redes neuronales para actores y comentaristas.
Crea una red neuronal y una representación de comentaristas. La salida de la red del revisor es la función de valor de estado V (s) V (s) del estado sV (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);
La salida de la red de actores es la probabilidad π (a ∣ s) π (a | s) de tomar cada posible par de acciones en un cierto estado sπ ( una ∣ s ) . Crear redes neuronales y representaciones de actores.
% 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);
Crea un agente. Ambos agentes usan las mismas opciones.
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);
Durante el entrenamiento, el agente recopila experiencia hasta que alcanza el rango de experiencia de 256 pasos o el episodio termina, y luego se entrena a partir de un pequeño lote de 64 experiencias. Este ejemplo utiliza un factor limitante de función objetivo de 0,125 para mejorar la estabilidad del entrenamiento y un factor de descuento de 0,9995 para fomentar las recompensas a largo plazo.
Agente de formación
Especifique las siguientes opciones de capacitación para capacitar al agente.
-
Entrena hasta 1000 episodios, y cada episodio dura hasta 5000 pasos de tiempo.
-
Cuando la recompensa promedio del agente por más de 100 veces consecutivas sea -10 o más, deje de entrenar al agente.
maxEpisodes = 1000;
maxSteps = 5e3;
trainOpts = rlTrainingOptions(...
'MaxEpisodes',maxEpisodes,...
'MaxStepsPerEpisode',maxSteps,...
'ScoreAveragingWindowLength',100,...
'Plots','training-progress',...
'StopTrainingCriteria','AverageReward',...
'StopTrainingValue',-10);
Para capacitar a varios agentes, especifique una matriz de agentes para la función de capacitación . El orden de los agentes en la matriz debe coincidir con el orden de las rutas de bloqueo del agente especificado durante la creación del entorno. Al hacerlo, se asegura de que el objeto de agente esté vinculado a la interfaz de E / S correspondiente en el entorno. La formación de estos agentes puede tardar varias horas en completarse, según la potencia informática disponible.
El archivo MAT rlCollaborativeTaskAgents contiene un conjunto de agentes entrenados previamente. Puede cargar el archivo y ver el desempeño del agente. Para capacitar al agente usted mismo, configure doTraining en verdadero .
doTraining = false;
if doTraining
stats = train([agentA, agentB],env,trainOpts);
else
load('rlCollaborativeTaskAgents.mat');
end
La siguiente figura muestra una captura de pantalla del progreso del entrenamiento. Debido a la aleatoriedad del proceso de entrenamiento, es posible que obtenga resultados diferentes.
Simulación de agentes
Un agente capacitado en un entorno simulado.
simOptions = rlSimulationOptions('MaxSteps',maxSteps);
exp = sim(env,[agentA agentB],simOptions);
Para obtener más información sobre la simulación de agentes, consulte rlSimulationOptions y sim .