多智能体强化学习算法整理

1. Policy-based:

1.1MADDPG(NIPS2017):

参考博客:多智能体强化学习算法【二】【MADDPG、QMIX、MAPPO】
超级经典,是基于DDPG算法改进的

DDPG:相当于DQN+Actor-Critic,target网络,eval网络,同时使用了经验回放机制

通过“集中式训练分布式执行”的思路,计算出每个智能体的最优策略。

  1. 每个agent都有一个中心化的critic,能够获取全局信息,给出值函数(Q value);每个智能体的actor根据局部观测信息做决策。该方法在完全合作、完全竞争和混合关系的问题中都能取得较好效果。
  2. 改进了experience replay, ( x , x ′ , a q , . . . , a n , r 1 , . . . , r n ) (x,x',a_q,...,a_n,r_1,...,r_n) (x,x,aq,...,an,r1,...,rn)
    在这里插入图片描述
    代码:多智能体连续行为空间问题求解——MADDPG
  • MADDPG 中的 Critic 是一个中心化网络,即传入的不只是当前 Agent 的(s,a)信息,还加入了其他 Agent 的(s,a)信息

1.2 COMA(AAAI2018):

Counterfactual Multi-Agent Policy Gradients:解决了合作式的MARL中,如何为各个agent分配奖励的问题。设置一个反事实基线(counterfactual baseline),将action与默认action的reward比较,若更高则说明做出了贡献。

  1. 使用一个集中式critic网络,在训练的过程中可以获取所有智能体的信息;
  2. 采用反事实基线(counterfactual baseline)来解决信用分配的问题(利用反事实的思维来推断每个智能体对整体任务的完成有多大的贡献);
  3. Critic网络要能够对反事实基线进行高效的计算。

对比:

a. COMA针对离散动作,学习的是 随机策略。而MADDPG针对连续动作,学习的是确定性策略。这在它们策略梯度函数的表达式上能够体现出区别。
b. COMA主要针对多智能体 协作任务,因此只有一个critic评价团队整体的回报。MADDPG既可以做协作任务,也可以做竞争任务,每个智能体都对应一个奖励函数,因此每个智能体对应一个critic。
c. 在原文中,COMA使用了 历史观测、动作序列作为网络的输入,而MADDPG没有使用历史序列。因此COMA的网络结构中包含了GRU层,而MADDPG的网络均为2-3个隐层的MLP。
d. COMA中所有智能体的actor网络 共享参数,输入端加上智能体ID以示区别。而MADDPG则没有共享参数;
d. COMA使用 反事实基线作为actor网络的优化目标,而MADDPG直接使用Q函数作为每个智能体actor网路的优化目标。

1.3MAPPO

多智能体强化学习(二) MAPPO算法详解
主要是提升效率,偏工业

2.Value-based

前面提到的 policy-based 方法中,中心化的值函数是直接使用全局信息进行建模,没有考虑个体的特点。在多智能体系统是由大规模的多个个体构成时,这样的值函数是难以学习或者是训练到收敛的,很难推导出理想的策略。
并且仅依靠局部观测值,无法判断当前奖励是由于自身的行为还是环境中其他队友的行为而获得的。如果给每个agent都配一个reward function,会把问题变复杂,并且通用性也不强。

2.1 VDN(AAMAS2018)

Value-Decomposition Networks For Cooperative Multi-Agent Learning:核心是将全局的 Q(s,a)值分解为各个局部 Qi(si,ai)的加权和,每个智能体拥有各自的局部值函数

2.2QMIX(ICML2018)

是对VDN算法的改善,作者改善了值函数分解的网络结构,考虑了系统全局状态 以及分布式策略的单调性约束,有效地增强了网络对整体Q函数的拟合能力。

QMIX 在 VDN 的基础上实现了两点改进:

  1. 在训练过程中加入全局信息进行辅助;
  2. 采用混合网络对单智能体的局部值函数进行合并(而不是简单的线性相加)。

模拟环境

常见多智能体强化学习仿真环境介绍

当涉及到多智能体强化学习时,常用的算法之一是多智能体深度确定性策略梯度 (Multi-Agent Deep Deterministic Policy Gradient, MADDPG)。以下是一个使用PyTorch和OpenAI Gym实现MADDPG算法的简单示例代码: ```python import torch import torch.nn as nn import torch.optim as optim import torch.nn.functional as F import numpy as np import gym # 定义MADDPG模型中的Actor网络 class Actor(nn.Module): def __init__(self, state_dim, action_dim): super(Actor, self).__init__() self.fc1 = nn.Linear(state_dim, 64) self.fc2 = nn.Linear(64, 32) self.fc3 = nn.Linear(32, action_dim) def forward(self, x): x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = torch.tanh(self.fc3(x)) return x # 定义MADDPG模型中的Critic网络 class Critic(nn.Module): def __init__(self, state_dim, action_dim): super(Critic, self).__init__() self.fc1 = nn.Linear(state_dim + action_dim, 64) self.fc2 = nn.Linear(64, 32) self.fc3 = nn.Linear(32, 1) def forward(self, state, action): x = torch.cat([state, action], dim=1) x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return x # 定义MADDPG算法 class MADDPG: def __init__(self, num_agents, state_dim, action_dim): self.num_agents = num_agents self.state_dim = state_dim self.action_dim = action_dim self.actors = [Actor(state_dim, action_dim) for _ in range(num_agents)] self.critics = [Critic(num_agents * state_dim, num_agents * action_dim) for _ in range(num_agents)] self.target_actors = [Actor(state_dim, action_dim) for _ in range(num_agents)] self.target_critics = [Critic(num_agents * state_dim, num_agents * action_dim) for _ in range(num_agents)] self.actor_optimizers = [optim.Adam(actor.parameters(), lr=0.001) for actor in self.actors] self.critic_optimizers = [optim.Adam(critic.parameters(), lr=0.001) for critic in self.critics] self.memory = [] def select_action(self, agent_id, state): state = torch.FloatTensor(state) actor = self.actors[agent_id] actor.eval() with torch.no_grad(): action = actor(state) actor.train() return action.numpy() def remember(self, state, action, reward, next_state): self.memory.append((state, action, reward, next_state)) def update(self, batch_size, gamma): if len(self.memory) < batch_size: return batch = np.random.choice(len(self.memory), batch_size, replace=False) states, actions, rewards, next_states = zip(*[self.memory[i] for i in batch]) states = torch.FloatTensor(states) actions = torch.FloatTensor(actions) rewards = torch.FloatTensor(rewards) next_states = torch.FloatTensor(next_states) for agent_id in range(self.num_agents): actor = self.actors[agent_id] critic = self.critics[agent_id] target_actor = self.target_actors[agent_id] target_critic = self.target_critics[agent_id] actor_optimizer = self.actor_optimizers[agent_id] critic_optimizer = self.critic_optimizers[agent_id] # 更新Critic网络 next_actions = torch.cat([actor(next_states[:, i, :]) for i in range(self.num_agents)], dim=1) target_next_actions = torch.cat([target_actor(next_states[:, i, :]) for i in range(self.num_agents)], dim=1) target_q_values = target_critic(next_states.view(batch_size, -1), target_next_actions) target_q_values = rewards[:, agent_id].view(-1, 1) + gamma * target_q_values q_values = critic(states.view(batch_size, -1), actions.view(batch_size, -1)) critic_loss = F.mse_loss(q_values, target_q_values) critic_optimizer.zero_grad() critic_loss.backward() critic_optimizer.step() # 更新Actor网络 actions_pred = torch.cat([actor(states[:, i, :]) if i == agent_id else actor(states[:, i, :]).detach() for i in range(self.num_agents)], dim=1) actor_loss = -critic(states.view(batch_size, -1), actions_pred).mean() actor_optimizer.zero_grad() actor_loss.backward() actor_optimizer.step() # 软更新目标网络 for target_param, param in zip(target_actor.parameters(), actor.parameters()): target_param.data.copy_(0.995 * target_param.data + 0.005 * param.data) for target_param, param in zip(target_critic.parameters(), critic.parameters()): target_param.data.copy_(0.995 * target_param.data + 0.005 * param.data) def save(self, path): torch.save({ 'actors': [actor.state_dict() for actor in self.actors], 'critics': [critic.state_dict() for critic in self.critics] }, path) def load(self, path): checkpoint = torch.load(path) for i, actor in enumerate(self.actors): actor.load_state_dict(checkpoint['actors'][i]) for i, critic in enumerate(self.critics): critic.load_state_dict(checkpoint['critics'][i]) # 定义训练过程 def train(env, num_agents, num_episodes, batch_size, gamma): state_dim = env.observation_space.shape[0] action_dim = env.action_space.shape[0] maddpg = MADDPG(num_agents, state_dim, action_dim) for episode in range(num_episodes): state = env.reset() done = False episode_reward = 0 while not done: actions = [maddpg.select_action(agent_id, state) for agent_id in range(num_agents)] next_state, rewards, done, _ = env.step(actions) episode_reward += sum(rewards) for agent_id in range(num_agents): maddpg.remember(state[agent_id], actions[agent_id], rewards[agent_id], next_state[agent_id]) maddpg.update(batch_size, gamma) state = next_state print("Episode: {}, Reward: {}".format(episode, episode_reward)) return maddpg # 使用CartPole环境进行训练 env = gym.make('CartPole-v0') maddpg = train(env, num_agents=2, num_episodes=1000, batch_size=64, gamma=0.99) # 保存训练好的模型 maddpg.save('maddpg_model.pth') ``` 请注意,这只是一个简单的示例代码,实际上,多智能体强化学习的实现可能更加复杂,并且需要根据具体的问题进行调整和优化。还有其他更复杂的算法和技术可用于多智能体强化学习,如Multi-Agent Proximal Policy Optimization (MADDPPO)和Multi-Agent Soft Actor-Critic (MASAC)等。希望这个示例代码能够帮助你入门多智能体强化学习的实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值