当前位置: 首页 > news >正文

MAPPO动作类型改进(二)——MAPPO+连续环境

MAPPO动作类型改进(二)——MAPPO+连续环境

    • 第一步:设置连续环境模式
    • 第二步:接入连续环境
    • 第三步:改下config.py中episode_length
    • 注意事项
    • 结语

在上一篇博客中,作者给各位学者说明如何实现基于最新版代码+离散环境,这篇文章帮大家实现基于最新版代码+连续环境,示例环境仍然是用MPE类,
环境说明及地址: https://pettingzoo.farama.org/environments/mpe/simple_spread/

第一步:设置连续环境模式

由于最新版light_mappo的代码默认就是使用连续环境,因此确认下是使用ContinuousActionEnv就行,原始代码是这样的话就不用动。

defmake_train_env(all_args):defget_env_fn(rank):definit_env():# TODO 注意注意,这里选择连续还是离散可以选择注释上面两行,或者下面两行。# TODO Important, here you can choose continuous or discrete action space by uncommenting the above two lines or the below two lines.fromenvs.env_continuousimportContinuousActionEnv env=ContinuousActionEnv()# from envs.env_discrete import DiscreteActionEnv# env = DiscreteActionEnv()env.seed(all_args.seed+rank*1000)returnenvreturninit_envreturnDummyVecEnv([get_env_fn(i)foriinrange(all_args.n_rollout_threads)])

第二步:接入连续环境

importnumpyasnpfrompettingzoo.mpeimportsimple_spread_v3classEnvCore(object):""" # 环境中的智能体 """def__init__(self):self.env=simple_spread_v3.parallel_env(render_mode="human",N=3,local_ratio=0.5,max_cycles=30,continuous_actions=True)#智能体个数N=3,# local_ratio:适用于本地奖励和全球奖励的权重。全局奖励权重将始终为 1 - 本地奖励权重。# max_cycles:游戏终止前的帧数(每个代理一个步骤)# continuous_actions:代理操作空间是离散的(默认)还是连续的self.agent_num=3#环境simple_spread_v3中Agents = 3 = Nself.obs_dim=18#环境simple_spread_v3中Observation Shape = 18self.action_dim=5#环境simple_spread_v3中Action Shape = 5defreset(self):""" # 重置环境,simple_spread_v3环境自带了reset函数,可直接使用 """sub_agent_obs=[]observations,infos=self.env.reset()foragentinself.env.agents:sub_agent_obs.append(observations[agent])returnsub_agent_obsdefstep(self,actions):sub_agent_obs=[]sub_agent_reward=[]sub_agent_done=[]sub_agent_info=[]i=0# 初始化计数器actions_step={}# 创建一个空字典来存储动作# 假设env.agents是一个包含所有智能体的列表# 并且actions是一个包含所有动作的列表foragentinself.env.agents:ifi<len(actions):# 确保不会超出actions列表的索引范围actions_step[agent]=actions[i]# 将智能体映射到对应的动作i+=1# 递增计数器observations,rewards,terminations,truncations,infos=self.env.step(actions_step)foragentinself.env.agents:# 添加观察值sub_agent_obs.append(observations[agent])# 添加奖励sub_agent_reward.append([rewards[agent]])# 注意:确保rewards[agent]是单个值或一维数组# 添加终止标志sub_agent_done.append(terminations[agent])# 添加附加信息sub_agent_info.append(infos[agent])# return [observations, rewards, terminations, infos]return[sub_agent_obs,sub_agent_reward,sub_agent_done,sub_agent_info]

第三步:改下config.py中episode_length

由于环境中max_cycles=30,因此必须满足episode_length<30才不会报错,如果设置为30,则会报错:ValueError: need at least one array to stack

parser.add_argument("--episode_length",type=int,default=25,help="Max length for any episode")

注意事项

self.warmup():env_runner中的self.warmup()函数放在episode循环里面还是外面,这个自定吧(由于这个环境运行了max_cycles后,不reset的话再传入动作会报错,所以这里要放到episode里面,接入自己环境时自定)这里不放的话可能会报错:ValueError: need at least one array to stack
关于生成的动作越限的问题:许多学者在env_continuous文件中定义了动作值的上下限,但生成的动作仍存在超过low和high的情况,这是由于网络输出并未基于环境的限制做缩放。

u_action_space=spaces.Box(low=-np.inf,high=+np.inf,shape=(self.signal_action_dim,),dtype=np.float32,)

解决办法:
在act.py的初始化添加self.sigmoid = nn.Sigmoid()
注:环境的标准动作是在(0,1)之间,所以用的sigmoid,如果想要动作在(-1,1)之间,额可以用self.tanh = nn.Tanh()

def__init__(self,action_space,inputs_dim,use_orthogonal,gain):super(ACTLayer,self).__init__()self.mixed_action=Falseself.multi_discrete=Falseself.continuous_action=Falseself.sigmoid=nn.Sigmoid()
elifself.continuous_action:action_logit=self.action_out(x)actions=action_logit.mode()ifdeterministicelseaction_logit.sample()action_log_probs=action_logit.log_probs(actions)actions=self.sigmoid(actions)

结语

以上改进都来自个人经验,正确性还有需要结合具体环境验证,如有错误,欢迎指正
同时大家有疑问可评论留言,如想要已经改好的代码可联系2360278536@qq.com
对MAPPO算法代码总体流程不太了解,可以参考多智能体强化学习MAPPO源代码解读
对MAPPO算法理论知识不太了解,可以参考多智能体强化学习之MAPPO理论解读和多智能体强化学习(二) MAPPO算法详解
MAPPO+离散环境讲解

http://www.jsqmd.com/news/472670/

相关文章:

  • 2026年南京名酒回收市场选择参考:茅台、老酒、虫草及礼品回收服务指南 - 海棠依旧大
  • 多模态跟踪怎么搞?清华西电TPAMI 2025新方法深度解析,从小白到大神,吃透这一篇就够了!
  • 【Mutilism用传输门搭建D触发器/与非门/或非门】2022-3-11
  • C#毕业设计——基于C#+asp.net+SQL Server的课程指导平台设计与实现(毕业论文+程序源码)——课程指导平台
  • 2026年3月南京名酒回收机构选择指南:茅台回收、老酒回收、洋酒回收、红酒回收、虫草回收机构 - 海棠依旧大
  • 笔试题-_-
  • Simpleperf 性能工具介绍app_profiler.py -i perf.data
  • C#毕业设计——基于C#+asp.net+SQL server的通用作业批改系统设计与实现(毕业论文+程序源码)——作业批改系统
  • 2026年江苏名酒回收机构推荐榜:名酒 / 老酒 / 虫草回收、上门服务、商家选择指南,盛鑫回收用专业鉴定守护靠谱交易 - 海棠依旧大
  • anaconda常用指令
  • “水莲花数”
  • 2026年成都/自贡/内江/泸州/宜宾/乐山/四川/云南云梯车、高空车、吊车、挖掘机、压路机、铲车租赁市场盘点:如何甄选可靠服务伙伴? - 2026年企业推荐榜
  • Ubuntu 22.04 搭建onlyoffice私服
  • 欧洲智慧零售及无人店铺展代理:好评度高选择策略解析
  • Logstash 项目教程:从零开始构建数据管道
  • ubantu环境初始化
  • 零基础Java第二期:数据类型与变量
  • 2026年3月江苏名酒回收公司选择指南:茅台回收、名酒老酒回收、洋酒红酒回收、虫草回收机构 - 海棠依旧大
  • 英国伯明翰电子烟展门票办理:靠谱合作公司选择的5大核心策略
  • 2026年3月杭州租车公司选择指南:商务、婚车、大巴、考斯特、豪车、旅游包车租车公司推荐 - 海棠依旧大
  • STM32开发入门(一):在 Keil 上新建 Project 工程
  • 数据的存储(原反补码/大小端存储/截断溢出/隐式类型转换/浮点数存储)
  • 老三网址读取
  • 前端反接保护:实用方案解析与探讨
  • 2026年杭州租车服务指南:商务出行、旅游包车、婚车车队及汽车租赁公司选择建议,卓强汽车用十年沉淀护航每一次安心旅程 - 海棠依旧大
  • 【Java实战】Java集成AD域账号登录
  • ES 处理索引数据变动的原理剖析
  • 【OS】进程等待-就绪态分析及原语-事务对比
  • 减速电机 手指气缸 直线导轨规格尺寸图
  • 基于QT对UR3进行开发