python实现多智能体一致性_多智能体深度学习算法MADDPG的PARL实践
多智能体系统(MAS)中每个智能体的策略不只取决于自身的策略和环境的反馈, 同时还受到其它智能体行为和合作关系的影响。 本文简单介绍MADDPG(Multi-Agent Deep Deterministic Policy Gradient)算法,并采用百度飞桨(paddlepaddle)的开源强化学习平台PARL来探索MADDPG算法实践。
一、算法介绍
MADDPG 算法是将 DDPG 算法扩展到多智能体环境中,MADDPG 算法定义每一个智能体拥有自己独立的 critic network 以及 actor network, 并且定义每个智能体拥有自己独立的回报函数,这样 MADDPG 算法就可以同时解决协作环境、竞争环境以及混合环境下的多智能体问题。 每个智能体在训练时都能够获取其余所有智能体的局部观察以及动作,即采用中心化方式训练,分布式执行方式。
1.算法架构
算法模型由多个DDPG网络组成,每个网络学习policy π (Actor) 和 action value Q (Critic);同时具有target network,用于Q-learning的off-policy学习。算法架构图如下:

- 训练统一进行,执行分布进行。
- 各个Actor收集数据(s, a=μ(s), r, s_next, a'=μ'(s)),并存入Replay Buffer,当缓存池数量大于预热阈值时,开始学习。
- 每个Actor分别更新policy π参数,与DDPG一样,只需要当前(s, a=μ(s))。
- 每个Critic分别更新action value Q参数,每个Critic都能看到所有的Actor收集的数据,更新参数时会考虑所有Actor生成的数据,即优化的是每个Critic对全局的贡献最大。
- 重复2,3,4,直至收敛。 每个智能体的 critic 网络是基于全局信息的,因而可以处理环境非平稳问题。
2.算法伪代码

每个Agent的训练同单个DDPG算法的训练过程类似,不同的地方主要体现在Critic的输入上:
- 在单个Agent的DDPG算法中,Critic的输入是一个state-action对信息,在MADDPG中,每个Agent的Critic输入除自身的state-action信息外,还可以有额外的信息,比如其他Agent的动作。
- 不同的Agent之间的关系大体可以分为三种,合作型,对抗性,半合作半对抗型。可以根据不同的合作关系来设计我们的奖励函数。
3.算法特点
- 通过基于Actor-Critic的DDPG作为基本结构,解决多智能体问题。
- 独立地采样,统一地学习。
- 通过所有Actor的数据更新Q的值,让系统比较平稳地优化。
- 框架没有对环境做限制,每个Agent可以有自己的Reward机制,并决定着整体是协作或是竞争。
- 对于每个Agent,测试时只需要当前Actor的数据进行预测;训练和测试输入数据不一致,这是个创新点。
二、算法的PARL实践
实践选用了百度的AI Studio平台,有关代码共享地址:https://aistudio.baidu.com/aistudio/projectdetail/643657
- 配置PARL
PARL 是百度飞浆的一个高性能、灵活的强化学习框架
# 说明:AIStudio预装的parl版本太老,容易跟其他库产生兼容性冲突,建议先卸载
!pip uninstall -y pandas scikit-learn 2.配置multiagent-particle-envs
“multiagent-particle-envs”里面有论文中多组实验环境,有合作型的,有对抗型的也有半合作半对抗型。
!git clone https://github.com/openai/multiagent-particle-envs
!pip install -e /home/aistudio/multiagent-particle-envs
#一定要安装gym==0.10.5版本的gym,否则报错
!pip install gym==0.10.5 -i https://mirror.baidu.com/pypi/simple3.代码说明
PARL的一般代码结构分为三部分
- Model 用来定义前向(Forward)网络,这通常是一个策略网络(Policy Network)或者一个值函数网络(Value Function),输入是当前环境状态(State)。
- Agent 负责算法与环境的交互,在交互过程中把生成的数据提供给Algorithm来更新模型(Model),数据的预处理流程也一般定义在这里。
- Algorithm 定义了具体的算法来更新前向网络(Model),也就是通过定义损失函数来更新Model。
PARL有关MADDPG算法实验的代码分为三个文件
1.simple_mode.py 定义了MAModel,包含ActorModel和CriticModel。
2.simple_agent.py 定义了MAAgent,包含数据和算法交互过程
3.train.py 主要是训练过程,核心代码注释如下:
agents = []
for i in range(env.n):
# 初始化模型
model = MAModel(env.act_shape_n[i])
#MADDPG算法内置在PARL,定义好模型即可调用
algorithm = parl.algorithms.MADDPG(
model,
agent_index=i,
act_space=env.action_space,
gamma=args.gamma,
tau=args.tau,
lr=args.lr)
#初始化Agent
agent = MAAgent(
algorithm,
agent_index=i,
obs_dim_n=env.obs_shape_n,
act_dim_n=env.act_shape_n,
batch_size=args.batch_size,
speedup=(not args.restore))
agents.append(agent)
实验用的"simple_tag" 场景,有3粉1绿总共4个智能体,红绿智能体相互对抗。
- 绿色的agent尽可能避免与3个红色智能体碰撞;
- 粉色的agent协同运动与绿色agent发生碰撞;
- 黑色为阻碍道路的地标。

python train.py --env [ENV_NAME] 测试或者训练模型
训练后使用 python train.py --env [ENV_NAME] --show --restore 展示效果
!python train.py --env simple_tag参考资料
1.Multi-Agent Actor-Critic for Mixed Cooperative-Competitive Environments https://arxiv.org/abs/1706.02275
2.PARL MADDPG 实现 https://github.com/PaddlePaddle/PARL/tree/develop/examples/MADDPG
更多推荐
所有评论(0)