跳转到主要内容

SUMO中交通信号控制的学习代码和RL环境。

项目描述

DOI tests PyPI version pre-commit Code style: black License

SUMO-RL

SUMO-RL提供了一个简单的接口,用于使用SUMO为交通信号控制实例化强化学习(RL)环境。

此仓库的目标

  • 为使用SUMO进行交通信号控制的强化学习提供简单的接口
  • 支持多智能体RL
  • 与gymnasium.Env和stable-baselines3以及RLlib等流行RL库兼容
  • 易于定制:状态和奖励定义易于修改

主要类是SumoEnvironment。如果使用参数'single-agent=True'进行实例化,则它表现得像一个常规的Gymnasium Env。对于多智能体环境,使用envparallel_env分别使用AEC或并行API实例化一个PettingZoo环境。TrafficSignal负责使用TraCI API检索信息和作用于交通信号灯。

有关更多详细信息,请查看在线文档

安装

安装SUMO最新版本

sudo add-apt-repository ppa:sumo/stable
sudo apt-get update
sudo apt-get install sumo sumo-tools sumo-doc

不要忘记设置SUMO_HOME变量(默认SUMO安装路径为/usr/share/sumo)

echo 'export SUMO_HOME="/usr/share/sumo"' >> ~/.bashrc
source ~/.bashrc

重要:对于使用Libsumo的巨大性能提升(约8倍),您可以声明变量

export LIBSUMO_AS_TRACI=1

请注意,如果此变量处于活动状态,则无法使用sumo-gui或并行运行多个模拟(更多详细信息)。

安装SUMO-RL

稳定版本可以通过pip获取

pip install sumo-rl

或者,您可以使用最新的(未发布)版本进行安装

git clone https://github.com/LucasAlegre/sumo-rl
cd sumo-rl
pip install -e .

MDP - 观察、动作和奖励

观察

每个交通信号代理的默认观察值是一个向量

    obs = [phase_one_hot, min_green, lane_1_density,...,lane_n_density, lane_1_queue,...,lane_n_queue]
  • phase_one_hot是一个表示当前活动绿灯阶段的one-hot编码向量
  • min_green是一个二进制变量,指示当前阶段是否已经过去了min_green秒
  • lane_i_density是车辆数除以车道i的总容量
  • lane_i_queue是排队(速度低于0.1 m/s)的车辆数除以车道i的总容量

您可以通过实现一个从ObservationFunction继承的类,并将其传递给环境构造函数来自定义观察

动作

动作空间是离散的。每个交通信号代理每'delta_time'秒可以选择下一个绿灯阶段的配置。

例如:在2-way single intersection中,有|A| = 4个离散动作,对应以下绿灯阶段配置

重要:每次阶段变化时,下一个阶段之前都会有持续yellow_time秒的黄灯阶段。

奖励

默认奖励函数是累积车辆延迟的变化

也就是说,奖励是相对于前一个时间步的总延迟(所有接近车辆的等待时间之和)的变化量。

您可以选择不同的奖励函数(请参阅在TrafficSignal中实现的函数),并在SumoEnvironment构造函数中使用reward_fn参数。

也可以实现自己的奖励函数

def my_reward_fn(traffic_signal):
    return traffic_signal.get_average_speed()

env = SumoEnvironment(..., reward_fn=my_reward_fn)

API(Gymnasium和PettingZoo)

Gymnasium单代理API

如果您的网络只有一个交通信号灯,则可以实例化标准的Gymnasium env(请参阅Gymnasium API

import gymnasium as gym
import sumo_rl
env = gym.make('sumo-rl-v0',
                net_file='path_to_your_network.net.xml',
                route_file='path_to_your_routefile.rou.xml',
                out_csv_name='path_to_output.csv',
                use_gui=True,
                num_seconds=100000)
obs, info = env.reset()
done = False
while not done:
    next_obs, reward, terminated, truncated, info = env.step(env.action_space.sample())
    done = terminated or truncated

PettingZoo多代理API

对于多代理环境,您可以使用PettingZoo API(请参阅Petting Zoo API

import sumo_rl
env = sumo_rl.parallel_env(net_file='nets/RESCO/grid4x4/grid4x4.net.xml',
                  route_file='nets/RESCO/grid4x4/grid4x4_1.rou.xml',
                  use_gui=True,
                  num_seconds=3600)
observations = env.reset()
while env.agents:
    actions = {agent: env.action_space(agent).sample() for agent in env.agents}  # this is where you would insert your policy
    observations, rewards, terminations, truncations, infos = env.step(actions)

RESCO基准

nets/RESCO文件夹中,您可以找到RESCO(交通信号控制强化学习基准)的网络和路由文件,它建立在SUMO-RL之上。请参阅他们的论文以获取结果。

实验

请检查experiments以获取实例化环境和训练您的RL代理的示例。

单向单交叉口中的Q-learning

python experiments/ql_single-intersection.py

4x4网格中的RLlib PPO多代理

python experiments/ppo_4x4grid.py

2-way单交叉口中的stable-baselines3 DQN

注意:您需要使用以下命令安装稳定版 stable-baselines3 以实现 Gymnasium 兼容性:pip install "stable_baselines3[extra]>=2.0.0a9",请参阅安装指南

python experiments/dqn_2way-single-intersection.py

绘图结果

python outputs/plot.py -f outputs/4x4grid/ppo_conn0_ep2

引用

如果您在研究中使用了此存储库,请引用以下内容:

@misc{sumorl,
    author = {Lucas N. Alegre},
    title = {{SUMO-RL}},
    year = {2019},
    publisher = {GitHub},
    journal = {GitHub repository},
    howpublished = {\url{https://github.com/LucasAlegre/sumo-rl}},
}

使用 SUMO-RL 的出版物列表(请提交拉取请求以添加缺失条目)

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

sumo_rl-1.4.5.tar.gz (1.1 MB 查看散列值)

上传时间:

构建分布

sumo_rl-1.4.5-py3-none-any.whl (1.1 MB 查看散列值)

上传时间: Python 3

支持者:

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面