使用 SUMO 进行仿真(8)-使用 SUMO 做信控库介绍

王 茂南 2024年11月16日07:06:39
评论
2393字阅读7分58秒

简介

本文会介绍,记录一些使用 SUMO 做「信号灯控制」的库。主要是看一下别人是如何从仿真过程中提取特征,提取的特征有哪些,如何下发动作,动作有哪些(我会结合我的使用来说明)。

 

 

SUMO-RL

项目链接SUMO-RL,SUMO-RL provides a simple interface to instantiate Reinforcement Learning environments with SUMO for Traffic Signal Control.

该项目提供了一个与 SUMO 交互的简单接口,且该项目比较好理解。在安装完毕之后,可以进入 ./sumo-rl/experiments 目录下了解如何使用 sumo_rl 来与 SUMO 进行交互。

我们用 ./sumo-rl/nets/3x3grid做一下简单的解释,该环境如下所示。我们使用 sumo_rl 在下面环境下分别提取 obs,计算 reward,看一下他是如何执行 action 的:

使用 SUMO 进行仿真(8)-使用 SUMO 做信控库介绍

下面代码是一段最简单的使用 sumo_rl 来与环境进行交互:

  1. import os
  2. def getAbsPath(file_relpath):
  3.     """将相对路径转换为绝对路径
  4.     """
  5.     file_abspath = os.path.abspath(__file__) # 获得当前文件的绝对路径
  6.     folder_abspath = os.path.dirname(file_abspath) # 获得所在文件夹
  7.     return os.path.join(folder_abspath, file_relpath)
  8. import sumo_rl
  9. env = sumo_rl.SumoEnvironment(net_file=getAbsPath('../nets/3x3grid/3x3Grid2lanes.net.xml'),
  10.                               route_file=getAbsPath('../nets/3x3grid/routes14000.rou.xml'),
  11.                               delta_time=10,
  12.                               use_gui=True,
  13.                               num_seconds=3600)
  14. obs = env.reset()
  15. for run in range(1, 10000):
  16.     actions = {ts: env.action_spaces(ts).sample() for ts in env.ts_ids}
  17.     observation, reward, done, info = env.step(actions)
  18. env.close()

 

特征的提取

在 sumo-rl 中是按照「信号灯」来提取特征的,每个信号灯提取的特征如下所示(这部分的计算在代码 ./sumo_rl/environment/traffic_signal:computer_observation 来定义):

  1. obs = [phase_one_hot, min_green, lane_1_density,...,lane_n_density, lane_1_queue,...,lane_n_queue]

上面特征值每一个值得含义如下所示:

  • phase_one_hot is a one-hot encoded vector indicating the current active green phase(表示当前的绿灯在哪一个相位。例如某个信号灯有四个相位,当前这个时刻第三个相位的信号灯是绿灯,那么此时就是 [0,0,1,0]
  • min_green is a binary variable indicating whether min_green seconds have already passed in the current phase(最小绿灯时间是否过,没有到 min_green 设定的时间,信号灯是不会改变的,这个的长度就是 1)
  • lane_i_density is the number of vehicles in incoming lane i dividided by the total capacity of the lane(每个车道的车道密度)
  • lane_i_queueis the number of queued (speed below 0.1 m/s) vehicles in incoming lane i divided by the total capacity of the lane(每个车道的排队长度)

最终的 obs 如下所示,分别返回每个交叉路口的数据:

使用 SUMO 进行仿真(8)-使用 SUMO 做信控库介绍

我们看一下交叉口 0,他一共有 8 个车道,如下图所示,所以他的特征大小是 21(也就是 4+1+8+8):

使用 SUMO 进行仿真(8)-使用 SUMO 做信控库介绍

 

动作的设计

SUMO-RL 中,动作就是改变信号灯下一个时刻的相位。在 SUMO-RL 中,每隔 delta_time 可以修改 next phase 的值。例如对于 2-way single intersection 环境来说,他的相位情况如下,其中共有四个绿灯相位:

使用 SUMO 进行仿真(8)-使用 SUMO 做信控库介绍

其中的四个绿灯相位如下所示,相当于是有 4 个动作,从下面的绿灯相位中选择一个:

使用 SUMO 进行仿真(8)-使用 SUMO 做信控库介绍

 

奖励的计算

默认的奖励是当前车辆的「waiting time」与上一次车辆的「waiting time」的差,最后每一个信号灯都会有一个奖励。(这部分的计算在代码 ./sumo_rl/environment/traffic_signal:computer_reward 来定义)

下面是在环境 ./sumo-rl/nets/3x3grid 中每一个信号灯返回的奖励:

使用 SUMO 进行仿真(8)-使用 SUMO 做信控库介绍

 

 

CityFlow

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南
  • 本文由 发表于 2024年11月16日07:06:39
  • 转载请务必保留本文链接:https://mathpretty.com/14256.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: