当前位置: 首页 > 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.cnnetsun.cn/news/1260720.html

相关文章:

  • IPED元数据可视化案例:创建取证报告中的元数据图表
  • Apache Airflow 项目教程
  • Carbon 开源项目指南
  • YTKNetwork批量请求终极指南:YTKBatchRequest高效应用实战
  • OpenCart 开源电商系统推荐
  • 新手到大卖都在用!亚马逊运营全流程工具盘点
  • 开源项目推荐:ccv
  • YTKNetwork性能优化终极指南:10个提升iOS网络请求效率的实用方法
  • 深入理解粤语编程编译器:从Python转换到LLVM执行
  • LCD屏幕调光方式全解析:DC调光 vs PWM调光,哪种更适合你的眼睛?
  • DS1302实时时钟模块从入门到精通:手把手教你搭建可调时钟系统
  • 用Multisim仿真8种经典运放电路:手把手教你搭建比例/微分/积分放大器
  • Android11音频架构剖析:RK3568平台如何通过RK809实现智能功放切换
  • 告别DHCP!CentOS服务器静态IP设置避坑指南(附常见问题解决方案)
  • 2026年广东省职业院校技能大赛(高职组)移动应用设计与开发赛项样题(一)
  • 从土壤质地到农作物适配:HWSD数据库在精准农业中的5个典型应用场景
  • PostgreSQL17 Windows版安装包下载全攻略:官网直链+镜像加速
  • FastAPI实战:5分钟搞定即梦AI文生视频API逆向(附完整代码)
  • 2023最新版:用夜神模拟器安卓7抓包微信小程序的3个关键配置
  • CCS8.1迁移CCS3.3工程全攻略:从环境配置到编译排错
  • 数学期望与条件期望:从概率论到实际应用的5个关键点
  • MFC文件对话框实战:CFileDialog类从入门到精通(含多文件选择避坑指南)
  • GNSS数据预处理技巧:如何用crx2rnx批量转换压缩观测文件(Windows/Mac双平台)
  • Cesium入门实战:5分钟搞定3D地球展示与坐标转换(附完整代码)
  • MATLAB实战:5步搞定MSK调制解调完整流程(附信号对比图生成技巧)
  • STM32开发环境搭建全攻略:从支持包安装到STLINK/JLINK驱动配置(避坑指南)
  • Qt绘图坐标系转换实战:用QTransform实现自定义坐标系(附完整代码)
  • 5分钟搞定CPEditor刷题环境:从安装到调试全流程(支持LeetCode/牛客)
  • 3d-force-graph隐藏技巧:这样配置让关联节点自动高亮+聚焦(含Neo4j数据适配方案)
  • ESP32-C3-Super-Mini开发板外部供电全攻略:从3.3V到6V的实战避坑指南