多智能体倒立摆的自定义环境设置

#为了实现多智能体倒立摆控制,让每一个倒立摆独立学习并且共同训练同一个神经网络。我这里选用两个倒立摆)在环境配置这一块一直报错,simulink中的agent块也显示红色。在我的理解中agent应该在设置完actor,critic和训练选项后才能创建,但是环境又是自定义的,在设置环境的时候得用{env = rlSimulinkEnv(mdl,blks,obsInfo,actInfo);}但是agent块在后面才能定义出来。所以感觉一直陷入了一个死循环。并且问一下这个simulink模型设置有没有问题(ps:刚开始学习只是把自己的想法说出来了)

img

img

img

img

根据参考资料中的代码和描述,应该在创建 Simulink 环境之后,再设置 actor 和 critic,并将其用于定义智能体。agent 块也应在其后面定义。在使用 rlSimulinkEnv 函数时,需要提供 Simulink 模型、环境块名称、状态观测信息和动作信息等参数。至于 agent 块显示为红色,可能是因为在模型中并没有定义相应的 agent。建议在模型中添加状态观测器、动作选择器、连续动态和奖励等组件,并按照文档中的要求为每个组件命名,才能正确连接到 agent 块,并顺利地创建智能体。

以下是一个简单的示例代码,用于演示如何在自定义环境中使用 DDPG 智能体,每个倒立摆可以独立学习并共同训练一个神经网络:

% 设置环境参数
mdl = 'CustomEnvModel';
blks = {'CustomEnvModel/Pendulum1', 'CustomEnvModel/Pendulum2'};
obsInfo = rlNumericSpec([4 1], 'LowerLimit', -inf(4,1), 'UpperLimit', inf(4,1));
actInfo = rlNumericSpec([2 1], 'LowerLimit', -1, 'UpperLimit', 1);

% 创建环境
env = rlSimulinkEnv(mdl, blks, obsInfo, actInfo);

% 设置 actor 和 critic
actor = getModelFromBlock(env, 'CustomEnvModel/Actor');
critic = getModelFromBlock(env, 'CustomEnvModel/Critic');
actorOpts = rlRepresentationOptions('LearnRate', 1e-3);
criticOpts = rlRepresentationOptions('LearnRate', 3e-3);
actor = rlStochasticActorRepresentation(actor, obsInfo, actInfo, 'Observation', {'input'}, actorOpts);
critic = rlQValueRepresentation(critic, obsInfo, actInfo, 'Observation', {'input'}, criticOpts);

% 设置 DDPG 智能体
agentOpts = rlDDPGAgentOptions(...
    'SampleTime', 0.01, ...
    'ExperienceBufferLength', 1e6, ...
    'TargetSmoothFactor', 1, ...
    'TargetNoise', 0.2, ...
    'MiniBatchSize', 128, ...
    'DiscountFactor', 0.99, ...
    'SaveExperienceBufferWithAgent', true);
agent = rlDDPGAgent(actor, critic, agentOpts);

% 训练智能体
trainOpts = rlTrainingOptions(...
    'MaxEpisodes', 5000, ...
    'MaxStepsPerEpisode', 200, ...
    'ScoreAveragingWindowLength', 5, ...
    'Verbose', true, ...
    'Plots', 'training-progress', ...
    'StopTrainingCriteria', 'AverageReward', ...
    'StopTrainingValue', -120, ...
    'SaveAgentCriteria', 'EpisodeReward', ...
    'SaveAgentValue', -120);
trainingStats = train(agent, env, trainOpts);

% 模拟智能体行为
simOpts = rlSimulationOptions('MaxSteps', 500);
exp = sim(env, agent, simOpts);

% 可选:保存智能体
save('ddpg_agent.mat', 'agent');

该示例代码中,首先通过 rlSimulinkEnv 函数创建自定义环境,然后分别从模型中获取 actor 和 critic,使用 rlStochasticActorRepresentation 和 rlQValueRepresentation 函数创建 rlDDPGAgent 所需的 actor 和 critic 表示,并使用 rlDDPGAgentOptions 函数创建智能体参数选项。最后,调用 train 函数训练智能体,调用 sim 函数模拟智能体行为,可选地保存智能体。需要注意的是,模型中必须正确定义了状态观测器、奖励、动作选择器等组件,才能顺利创建智能体。

对于多智能体倒立摆的自定义环境设置,可以参考以下步骤:

  1. 在Simulink中创建一个RL模型,包括Actor、Critic和训练选项等组件。
  2. 创建两个倒立摆的Agent块,并将它们连接到Actor和Critic组件上。
  3. 对于每个倒立摆,使用rlSimulinkEnv函数创建一个自定义环境,并将其保存在env变量中。
  4. 在训练过程中,为每个倒立摆提供不同的环境配置,可以使用不同的随机种子来生成不同的状态空间。
  5. 在仿真过程中,观察每个倒立摆的控制效果,并根据反馈信息来更新神经网络参数。

关于你提到的问题,可能是因为你在设置环境时没有正确连接Agent块。你可以尝试按照以下步骤进行操作:

  1. 在Simulink中创建一个rlSimulinkEnv函数,用于创建自定义环境。该函数需要接受四个参数:模型文件路径、状态空间大小、观测信息和动作信息。
  2. 在调用rlSimulinkEnv函数时,将返回的环境对象保存在env变量中。
  3. 在Actor和Critic组件中,分别将env变量作为输入和输出连接起来。
  4. 在Agent块中,将env变量作为输入连接到Actor和Critic组件上。

如果你仍然遇到问题,建议检查代码中的语法错误和逻辑错误,或者提供更详细的错误信息以便更好地帮助你解决问题。

该回答引用ChatGPT
根据描述,问题可能在于Agent的创建和环境的设置没有区分开来,导致陷入死循环。在设置环境后,应该先创建好Agent,再将其和环境绑定。以下是一份可能的代码片段,供参考:

matlab
% 定义Simulink模型
mdl = 'CustomInvertedPendulumEnv_sl';
load_system(mdl);

% 定义倒立摆Block
blks = [mdl, '/Inverted Pendulum', '/Inverted Pendulum1'];

% 定义状态观测信息
obsInfo = rlNumericSpec([4 1]);
obsInfo.Name = 'observations';
obsInfo.Description = 'joint angular velocity, joint angle, cart position, cart velocity';

% 定义动作信息
actInfo = rlNumericSpec([1 1]);
actInfo.LowerLimit = -10;
actInfo.UpperLimit = 10;
actInfo.Name = 'cart velocity';

% 定义Agent
actorNetwork = rlSACActor(obsInfo, actInfo);
criticNetwork = rlSACCritic(obsInfo, actInfo);
agent = rlSACAgent(actorNetwork, criticNetwork);
agent.Options.TargetEntropy = 0.1;

% 定义环境
env = rlSimulinkEnv(mdl, blks, obsInfo, actInfo);

% 将Agent和环境绑定
trainOpts = rlTrainingOptions(...
'MaxEpisodes', 200, ...
'MaxStepsPerEpisode', 500, ...
'ScoreAveragingWindowLength', 50, ...
'Verbose', false, ...
'Plots', 'training-progress',...
'StopTrainingCriteria','AverageReward',...
'StopTrainingValue',605);

trainingStats = train(agent, env, trainOpts);


另外,关于Simulink模型的正确性,需要结合具体的情况进行分析。可以参考官方的示例,在模型中添加连杆、关节等模块,以确保模型的正确性。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
首先,为了实现多智能体倒立摆控制,每个倒立摆应该有自己的 actor 和 critic 神经网络。你可以在for循环中为每个倒立摆创建一个独立的 agent。
在环境配置这一块,你可以考虑使用 MATLAB 的 RL 函数来创建一个自定义的环境。
以下是一个简单的示例代码,展示如何使用 MATLAB 的 RL 函数来创建一个自定义的环境:

%% 定义环境模型
mdl = 'multi_agent_pendulum';
open_system(mdl);

%% 定义环境
% 观察变量
obsInfo = rlNumericSpec([4 1]);
obsInfo.Name = 'MultiAgentPendulumObservations';
% 动作变量
actInfo = rlNumericSpec([1 1]);
actInfo.Name = 'MultiAgentPendulumActions';
actInfo.LowerLimit = -2;
actInfo.UpperLimit = 2;

% 定义仿真环境
env = rlSimulinkEnv(mdl, 'MultiAgentPendulum', obsInfo, actInfo);

%% 定义多智能体
numAgents = 2;
for i = 1:numAgents
    % 定义 Actor 神经网络
    actor = ...
    % 定义 Critic 神经网络
    critic = ...
    % 定义数据采集器
    data = ...
    agents{i} = rlSACAgent(actor, critic, data);
end

%% 定义训练选项
% 定义选项
options = rlTrainingOptions;
% 训练
DoTraining = true;
if DoTraining
    % 训练智能体
    for i = 1:numAgents
        % 训练
        trainingStats{i} = train(agents{i}, env, options);
    end
end

在这个示例代码中,我们首先定义了一个环境模型(multi_agent_pendulum),然后定义了观测变量和动作变量的信息。接下来,我们用rlSimulinkEnv函数创建了一个自定义的环境(env)。然后,我们用一个for循环创建多个智能体,并且对于每个智能体,我们都定义了一个Actor神经网络、一个Critic神经网络和一个数据采集器(data)。最后,我们定义了训练选项(rlTrainingOptions),并且在一个for循环中训练了所有智能体。

当然,以上代码只是一个简单的示例代码,需要你根据实际情况进行修改才能满足你的需求。
如果我的回答解决了您的问题,请采纳!