我在博客 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 = 0
def reset(self, *, seed=None, options=None):
self.step_count = 0
obs,info = {}, {}
for agent_name in self.agents:
obs[agent_name] = self.observation_space.sample()
info[agent_name] = {}
return obs,info
def step(self,action):
self.step_count += 1
obs,reward,terminated,truncated, info = {},{},{},{},{}
for agent_name in self.agents:
obs[agent_name] = self.observation_space.sample()
reward[agent_name] = 0
terminated[agent_name] = False
truncated[agent_name] = False
info[agent_name] = {}
terminated["__all__"] = False
truncated["__all__"] = False
if self.step_count > 10:

最低0.47元/天 解锁文章
1168

被折叠的 条评论
为什么被折叠?



