ray.rllib-入门实践-12:自定义多智能体强化学习

        我在博客 ray.rllib-入门实践-10:自定义环境 中介绍了自定义 rllib 强化学习环境的方法与使用示例,但是那个示例是针对单智能体强化学习环境的。自定义多智能体强化学习环境及使用, 与单智能体方法步骤类似,单细节上有许多不同, 相对更复杂一些 。

        大概的三个步骤是: 

        1. 定义多智能体强化学习环境

        2. 向ray注册环境

        3. 配置并使用环境执行训练与评估。

环境配置:

        torch==2.5.1

        ray==2.10.0

        ray[rllib]==2.10.0

        ray[tune]==2.10.0

        ray[serve]==2.10.0

        numpy==1.23.0

        python==3.9.18

一、 自定义多智能体强化学习环境 

需要继承自 “ray.rllib.env.multi_agent_env.MultiAgentEnv”. reset 函数和step函数接口需要与下面保持严格一致。每一个输出都变成了 key:value 字典。

import ray 
from ray import tune 
from ray.rllib.algorithms.ppo import PPO, PPOConfig 
from ray.tune.registry import register_env
from ray.rllib.env.multi_agent_env import MultiAgentEnv 
from gymnasium import spaces
import numpy as np
from sympy import pretty_print ## 1. 定义多智能体环境
class My_Multi_Agent_Env(MultiAgentEnv):def __init__(self,env_config):## 初始化智能体ID列表self.agents = env_config["agents"]## 定义每个智能体的动作空间, 这里默认多个智能体的动作空间一样self.action_space = spaces.Box(low=-1,high=1,shape=(3,))## 定义每个智能体的观测空间, 这里默认多个智能体的观测空间一样self.observation_space = spaces.Box(low=-1,high=1,shape=(5,))self.step_count = 0def reset(self, *, seed=None, options=None):self.step_count = 0obs,info = {}, {}for agent_name in self.agents:obs[agent_name] = self.observation_space.sample()info[agent_name] = {}return obs,infodef step(self,action):self.step_count += 1obs,reward,terminated,truncated, info = {},{},{},{},{}for agent_name in self.agents:obs[agent_name] = self.observation_space.sample()reward[agent_name] = 0terminated[agent_name] = Falsetruncated[agent_name] = Falseinfo[agent_name] = {}terminated["__all__"] = Falsetruncated["__all__"] = Falseif self.step_count > 10:terminated["__all__"] = Truetruncated["__all__"] = Truereturn obs,reward,terminated,truncated,infodef render(self):# 简单打印环境状态print(f"rensering..........")def close(self):pass 

多智能体环境的测试:

import gymnasium as gym 
from gymnasium import spaces 
import numpy as np
from ray.rllib.env.multi_agent_env import MultiAgentEnv 
from ray.rllib.algorithms.ppo import PPO, PPOConfig
from ray.tune.registry import register_envclass My_Multi_Agent_Env(MultiAgentEnv):def __init__(self,num_agents = 3):## 初始化智能体数量self.num_agents = num_agents## 初始化智能体ID列表self.agents = [f"agent_{i}" for i in range(self.num_agents)]## 定义每个智能体的动作空间, 这里默认多个智能体的动作空间一样action_dim = 3self.action_space = spaces.Box(low=-1,high=1,shape=(action_dim,))## 定义每个智能体的观测空间, 这里默认多个智能体的观测空间一样obs_dim = 5self.observation_space = spaces.Box(low=-1,high=1,shape=(obs_dim,))## 定义整个环境的stateself.state = np.random.rand(self.num_agents, obs_dim)self.step_count = 0def reset(self, *, seed=None, options=None):self.step_count = 0obs,info = {}, {}for agent_name in self.agents:obs[agent_name] = self.observation_space.sample()info[agent_name] = {}return obs,infodef step(self,action):self.step_count += 1obs,reward,terminated,truncated, info = {},{},{},{},{}for agent_name in self.agents:obs[agent_name] = self.observation_space.sample()reward[agent_name] = 0terminated[agent_name] = Falsetruncated[agent_name] = Falseinfo[agent_name] = {}terminated["__all__"] = Falsetruncated["__all__"] = Falseif self.step_count > 10:terminated["__all__"] = Truetruncated["__all__"] = Truereturn obs,reward,terminated,truncated,infodef render(self):# 简单打印环境状态print(f"Current state: {self.state}")def close(self):pass ## 使用示例
env = My_Multi_Agent_Env(num_agents=3)
for i in range(3):## 重置环境obs,info = env.reset()print(f"reset, episode_{i}")while True:## 动作采样,后面改为神经网络生成actions = {}for agent_name in env.agents:actions[agent_name] = env.action_space.sample()## 动作执行obs,rewards,dones,truncates,infos = env.step(actions)print(f"\t step = {env.step_count}")if dones["__all__"]:break

二、注册多智能体环境

与单智能体环境方法一致。

from ray.tune.registry import register_envdef env_creator(env_config):return My_Multi_Agent_Env(env_config)
register_env("My_Multi_Agent_Env",env_creator)

三、 配置并使用多智能体环境

        在config中配置多智能体强化学习训练, 主要需要配置两个模块:

1. 配置使用多智能体环境

通过以下代码实现:

agents = ["red","blue"]
config = PPOConfig()
config = config.environment(env="My_Multi_Agent_Env",env_config = {"agents":agents})

2. 给每个智能体配置一个policy 

主要包含三个元素:

(1)policies: policy字典, 里面存储了多个policy, 每个policy有有一个名字。

(2)policy_mapping_fn 函数, 根据agent的名字或ID, 从policy中选择智能体。 

(3)policies_to_train列表, 记录哪个智能体的policy需要进行训练。

这三个元素共同组成一个model子模块 config.multi_agent。

具体配置方式如下:

## 4. 配置多智能体策略
agents = ["red","blue"]
env_config = {"agents":agents}
env = My_Multi_Agent_Env(env_config)
obs_space = env.observation_space
action_space = env.action_space## case-1: 同构的智能体设置
# policies = {}
# policies["default_policy"] = (None, obs_space, action_space,{})  ## None 表示默认的智能体策略, 比如PPOConfig对应的就是PPOTorchPolicy
# def policy_mapping_fn(agent_name):
#     return "default_policy" ## case-2: 异构的智能体设置, 异构效果更好。
policies = {}
for agent_name in agents:policies[agent_name] = (None, obs_space, action_space,{})  ## None 表示默认的智能体策略, 比如PPOConfig对应的就是PPOTorchPolicydef policy_mapping_fn(agent_name,*args, **kwargs):return agent_name multi_agent_config = {"policies":policies,"policy_mapping_fn":policy_mapping_fn
}policies_to_train = ["red","blue"]
## 5. 配置算法: 
agents = ["red","blue"]
config = PPOConfig()
config = config.environment(env="My_Multi_Agent_Env",env_config = {"agents":agents})"""在下面这行命令,对多智能体的模型进行配置"""
config.multi_agent(policies=policies,policy_mapping_fn = policy_mapping_fn,policies_to_train = ["red","blue"])
# config.multi_agent = multi_agent_config ## 这种方式不能使用, 虽然能跑通训练,但是无法加载保存的模型。
## 因为新版本的PPOConfig把config.multi_agent定义为一个函数, 加载模型时也是把 config.multi_agent 作为一个函数使用,
## 这种赋值操作,会改变 config.multi_agent 的属性, 导致配置失败。 虽然运行能跑通,但是不是预期的结果。 
config.evaluation(evaluation_num_workers=1,) ## 必须要有。evaluation的配置,后面才能使用algo.evaluation()操作。
algo = config.build()

四、训练并保存多智能体

## 6. 执行训练
for i in range(2):iter_result = algo.train()print(f"iter_{i}")## 7. 保存模型
import os 
checkpoint_dir = "F:/codes/RLlib_study/outputs"
os.makedirs(checkpoint_dir, exist_ok=True)
algo.save(checkpoint_dir)
print(f"save checkpoints to {checkpoint_dir}")

五、评估模型

评估方式1:

## 8. 评估模型
evaluation_result = algo.evaluate()
print("evaluated")
print(pretty_print(evaluation_result["evaluation"]))

评估方式2:可以实现与其他算法的智能体pk评估。

env_config = {"agents":["red","blue"]}
env = My_Multi_Agent_Env(env_config)
obs,info = env.reset()
step,done = 0,False
print("evaluate")
while not done:actions = {}for agent_id in agents:actions[agent_id] = algo.compute_single_action(obs[agent_id],policy_id=agent_id)## 如果想与其他来源的智能体对抗,可以在这里添加其他智能体的计算action的函数。## 这里可以添加任意智能体的模型。 obs, reward, terminated, truncated, info = env.step(actions)done = terminated["__all__"]step += 1print(f"step = {step}, \n\treward = {reward}, \n\taction = {actions}, \n\tobs = {obs}")

六、 汇总代码

import ray 
from ray import tune 
from ray.rllib.algorithms.ppo import PPO, PPOConfig 
from ray.tune.registry import register_env
from ray.rllib.env.multi_agent_env import MultiAgentEnv 
from gymnasium import spaces
import numpy as np
from sympy import pretty_print ## 1. 定义多智能体环境
class My_Multi_Agent_Env(MultiAgentEnv):def __init__(self,env_config):## 初始化智能体ID列表self.agents = env_config["agents"]## 定义每个智能体的动作空间, 这里默认多个智能体的动作空间一样self.action_space = spaces.Box(low=-1,high=1,shape=(3,))## 定义每个智能体的观测空间, 这里默认多个智能体的观测空间一样self.observation_space = spaces.Box(low=-1,high=1,shape=(5,))self.step_count = 0def reset(self, *, seed=None, options=None):self.step_count = 0obs,info = {}, {}for agent_name in self.agents:obs[agent_name] = self.observation_space.sample()info[agent_name] = {}return obs,infodef step(self,action):self.step_count += 1obs,reward,terminated,truncated, info = {},{},{},{},{}for agent_name in self.agents:obs[agent_name] = self.observation_space.sample()reward[agent_name] = 0terminated[agent_name] = Falsetruncated[agent_name] = Falseinfo[agent_name] = {}terminated["__all__"] = Falsetruncated["__all__"] = Falseif self.step_count > 10:terminated["__all__"] = Truetruncated["__all__"] = Truereturn obs,reward,terminated,truncated,infodef render(self):# 简单打印环境状态print(f"rensering..........")def close(self):pass ## 2. 注册多智能体环境
def env_creator(env_config):return My_Multi_Agent_Env(env_config)
register_env("My_Multi_Agent_Env",env_creator)## 3. 初始化 ray 
ray.init()## 4. 配置多智能体策略
agents = ["red","blue"]
env_config = {"agents":agents}
env = My_Multi_Agent_Env(env_config)
obs_space = env.observation_space
action_space = env.action_space## case-1: 同构的智能体设置
# policies = {}
# policies["default_policy"] = (None, obs_space, action_space,{})  ## None 表示默认的智能体策略, 比如PPOConfig对应的就是PPOTorchPolicy
# def policy_mapping_fn(agent_name):
#     return "default_policy" ## case-2: 异构的智能体设置, 异构效果更好。
policies = {}
for agent_name in agents:policies[agent_name] = (None, obs_space, action_space,{})  ## None 表示默认的智能体策略, 比如PPOConfig对应的就是PPOTorchPolicydef policy_mapping_fn(agent_name,*args, **kwargs):return agent_name multi_agent_config = {"policies":policies,"policy_mapping_fn":policy_mapping_fn
}policies_to_train = ["red","blue"]
## 5. 配置算法: 
agents = ["red","blue"]
config = PPOConfig()
config = config.environment(env="My_Multi_Agent_Env",env_config = {"agents":agents})
# config.multi_agent = multi_agent_config ## 这种方式不能使用, 虽然能跑通训练,但是无法加载保存的模型。
## 因为新版本的PPOConfig把config.multi_agent定义为一个函数, 加载模型时也是把 config.multi_agent 作为一个函数使用,
## 这种赋值操作,会改变 config.multi_agent 的属性, 导致配置失败。 虽然运行能跑通,但是不是预期的结果。 
config.multi_agent(policies=policies,policy_mapping_fn = policy_mapping_fn,policies_to_train = ["red","blue"])
config.evaluation(evaluation_num_workers=1,) ## 必须要有。evaluation的配置,后面才能使用algo.evaluation()操作。
algo = config.build()## 6. 执行训练
for i in range(2):iter_result = algo.train()print(f"iter_{i}")## 7. 保存模型
import os 
checkpoint_dir = "F:/codes/RLlib_study/outputs"
os.makedirs(checkpoint_dir, exist_ok=True)
algo.save(checkpoint_dir)
print(f"save checkpoints to {checkpoint_dir}")## 8. 评估模型
## 方法1:
evaluation_result = algo.evaluate()
print("evaluated")
print(evaluation_result["evaluation"])## 方法2
env_config = {"agents":["red","blue"]}
env = My_Multi_Agent_Env(env_config)
obs,info = env.reset()
step,done = 0,False
print("evaluate")
while not done:actions = {}for agent_id in agents:actions[agent_id] = algo.compute_single_action(obs[agent_id],policy_id=agent_id)## 如果想与其他来源的智能体对抗,可以在这里添加其他智能体的计算action的函数。## 这里可以添加任意智能体的模型。 obs, reward, terminated, truncated, info = env.step(actions)done = terminated["__all__"]step += 1print(f"step = {step}, \n\treward = {reward}, \n\taction = {actions}, \n\tobs = {obs}")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/7281.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云-银行核心系统转型之业务建模与技术建模

业务领域建模包括业务建模和技术建模,整体建模流程图如下: 业务建模包括业务流程建模和业务对象建模 业务流程建模:通过对业务流程现状分析,结合目标核心系统建设能力要求,参考行业建 模成果,形成结构化的…

接口(完)

大家好,今天我们着重来总结一下接口的知识,并且将接口和抽象类的区别罗列一下,帮助我们更好的认识抽象类和接口。 2.7 抽象类和接口的区别. 抽类和接口都是Java中多态的常见使用方式,都需要重点掌握,同时又要认清两者的区别(重要!!&#xf…

windows11关闭系统更新详细操作步骤

文章目录 1.打开注册表2.修改注册表内容2.1 新建文件2.2 修改值 3.修改设置 1.打开注册表 winR输入regedit(如下图所示) 2.修改注册表内容 进HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings 2.1 新建文件 右侧界面右键即可 2.2 修改值 重命名为如下…

改进候鸟优化算法之二:基于混沌映射的候鸟优化算法(MBO-CM)

基于混沌映射的候鸟优化算法(Migrating Birds Optimization based on Chaotic Mapping,MBO-CM)是一种结合了混沌映射与候鸟优化算法(Migrating Birds Optimization,MBO)的优化方法。 一、候鸟优化算法(MBO)简介 候鸟优化算法是一种自然启发的元启发式算法,由Duman等人…

Linux学习笔记——网络管理命令

一、网络基础知识 TCP/IP四层模型 以太网地址(MAC地址): 段16进制数据 IP地址: 子网掩码: 二、接口管命令 ip命令:字符终端,立即生效,重启配置会丢失 nmcli命令:字符…

力扣hot100-->滑动窗口、贪心

你好呀,欢迎来到 Dong雨 的技术小栈 🌱 在这里,我们一同探索代码的奥秘,感受技术的魅力 ✨。 👉 我的小世界:Dong雨 📌 分享我的学习旅程 🛠️ 提供贴心的实用工具 💡 记…

Linux_线程控制

线程控制的相关接口 进程创建相关 之前我们已经认识到了pthread_create函数用来创建线程&#xff0c;这里不再赘述。 pthread_self函数 void* routine(void* args) {std::cout << "我是新线程..." << pthread_self() << std::endl;return null…

[java] 面向对象进阶篇1--黑马程序员

目录 static 静态变量及其访问 实例变量及其访问 静态方法及其访问 实例方法及其访问 总结 继承 作用 定义格式 示例 总结 子类不能继承的内容 继承后的特点 成员变量 成员变量不重名 成员变量重名 super访问父类成员变量 成员方法 成员方法不重名 成员方法…

TCP 三次握手四次挥手

目录 TCP 三次握手 1. SYN (Synchronize&#xff1a;同步) 2. SYN-ACK (Synchronize Acknowledge&#xff1a;同步确认) 3. ACK (Acknowledge&#xff1a;确认) 为什么是三次而不是两次或四次&#xff1f; 三次握手的作用 TCP 四次挥手 第一次挥手&#xff1a;客户端发送 FIN …

Vue2下篇

插槽&#xff1a; 基本插槽&#xff1a; 普通插槽&#xff1a;父组件向子组件传递静态内容。基本插槽只能有一个slot标签&#xff0c;因为这个是默认的位置&#xff0c;所以只能有一个 <!-- ParentComponent.vue --> <template> <ChildComponent> <p>…

第38周:猫狗识别 (Tensorflow实战第八周)

目录 前言 一、前期工作 1.1 设置GPU 1.2 导入数据 输出 二、数据预处理 2.1 加载数据 2.2 再次检查数据 2.3 配置数据集 2.4 可视化数据 三、构建VGG-16网络 3.1 VGG-16网络介绍 3.2 搭建VGG-16模型 四、编译 五、训练模型 六、模型评估 七、预测 总结 前言…

具身智能与大模型融合创新技术实训研讨会成功举办

2025年1月16日-19日武汉&#xff0c;TsingtaoAI联合北京博创鑫鑫教育科技&#xff0c;举行“具身智能与大模型融合创新技术”实训研讨会&#xff0c;本次会议面向高校AI教师和企业AI工程师群体&#xff0c;通过3天的技术研修和实操教学&#xff0c;通过将 AI 大模型与具备3D视觉…

OpenAI的工具革命: 当Operator撕开中国AI「内卷式创新」的遮羞布

OpenAI最新发布的智能体Operator&#xff0c;并非简单的任务执行工具&#xff0c;而是一场针对「工具的工具」的底层革命。它用通用性智能体架构重构人机协作范式&#xff0c;而中国AI产业仍在「卷场景」「卷补贴」的泥潭中打转。这场降维打击背后&#xff0c;暴露的是中美AI竞…

MySQL(1)

数据库 基础篇 MYSQL概述 SQL 函数 约束 多表查询 事务 进阶篇 存储索引 索引 SQL优化 试图/存储过程/触发器 锁 InnoDB核心 MySQL管理 运维篇 日志 主从复制 分库本表 读写分离 基础篇 MySQL 数据库概念&#xff1a;存储数据的仓库&#xff0c;数据是有…

SpringBoot+Vue使用Echarts

前言 在vue项目中使用echarts&#xff0c;本次演示是使用vue2 1 前端准备 echarts官网&#xff1a; https://echarts.apache.org/zh/index.html 官网提供了基本的使用说明和大量的图表 1.1 下载echarts 执行命令 npm install echarts 直接这样执行很可能会失败&#xff0c;…

PyQt6医疗多模态大语言模型(MLLM)实用系统框架构建初探(下.代码部分)

医疗 MLLM 框架编程实现 本医疗 MLLM 框架结合 Python 与 PyQt6 构建,旨在实现多模态医疗数据融合分析并提供可视化界面。下面从数据预处理、模型构建与训练、可视化界面开发、模型 - 界面通信与部署这几个关键部分详细介绍编程实现。 6.1 数据预处理 在医疗 MLLM 框架中,多…

Linux-day10

第21章 Linux高级篇-日志管理 日志介绍和实例 基本介绍 系统常用的日志 日志服务 日志服务原理图 在这个配置文件里面记录了日志服务程序 日志管理服务rsyslogd -v是反向匹配 invert 日志服务配置文件 时间、主机、是由哪个程序或者服务发生的、事件信息 自定义日志服务 日…

Linux第一讲--基本的命令操作

从今天开始&#xff0c;我将在csdn这个平台上和大家分享Linux的相关知识&#xff0c;欢迎大家一起讨论&#xff01; 零、基本操作 1.进入全屏&#xff1a; ALTENTER,退出也是这个 2.复制&#xff1a;ctrlinsert 3.粘贴&#xff1a;shiftinsert Linux中&#xff0c;cv是不好…

WinRAR.exe命令行的使用

工具 命令行打包命令 rem 默认压缩根目录&#xff0c;递归处理子文件夹使用 -r WinRAR.exe a -r test.rar C:/web/Views/

### 2.5.3 二叉树的基本操作

2.5.3 二叉树的基本操作 // 获取树中节点的个数 int size(Node root);// 获取叶子节点的个数 int getLeafNodeCount(Node root);// 子问题思路-求叶子结点个数// 获取第K层节点的个数 int getKLevelNodeCount(Node root,int k);// 获取二叉树的高度 int getHeight(Node root);…