交通流理论
NASCH模型
单车道CA模型
(本括号中内容编写于2021/12/24,交报告截止了,想要参考报告格式的可以去我的资源下载,已经上传)
PYTHON编程实现
模型参数取值:Lroad=1000;p=0.3;Vmax=5
边界:周期性边界条件
数据:扔掉前2000个时间步,对后2000个进行统计
给出了基本图
流量密度关系
时空图
分别对应NASCH_yys_1,2,3;(ps:2021/12/28之前使用下述代码交实验报告请注明代码出处)
下面对于1部分代码分享给大家,2,3有需要自取。(1运行几秒钟出结果、2、3分别要运行五六分钟左右)
先上图
解释:
1.1 代码函数详解
1.1.1 draw_time_space( )函数
此函数为自编函数,主要用于绘画时空图。
调用matplotlib库,plt.style.use( )用于设置绘图样式,axes.set_ylim( )用于设置绘图时间步区间,plt.scatter用于绘出时空图的散点,散点的颜色、大小与样式。
1.1.2 draw_volume_density(x_list, y_list,q,p )函数
此函数为自编函数,主要用于流量密度图。
具体的调用与时空图调用类似,相同的不过多赘述。plt.plot( )用于绘出折线图。
1.1.3 Speed_acceleration(a)函数
此函数为自编函数,主要用于CA模型的加速阶段。
调用系统max函数,将速度加1和速度上限的较小值赋给a并且返回这个值。
1.1.4 Speed_slowdown(a)函数
此函数为自编函数,主要用于CA模型的减速阶段。
调用系统min函数,将速度减1和车辆前方空挡数(调用d_empty(a)函数)较小值赋给a并且返回这个值。
1.1.5 Speed_random_slow(a)函数
此函数为自编函数,主要用于CA模型的随机慢化阶段。
调用系统random函数,生成0-1之间的随机浮点数,使用if语句:对于随机数小于p_slow的,进行慢化处理,取0和速度减1的较大值并返回;对于随机数大于p_slow的,保留原值并返回。
1.1.6 d_empty(a)函数
此函数为自编函数,主要用于CA模型中元胞寻找前方最大的空格数(使用周期性边界)。
使用sum_empty进行计数,进行两个循环,从位置a开始寻找,如果前方位置为None,说明前方有空格,sum_empty加1,直到前方不是None,则返回sum_empty的值。
1.1.7 initial_veh( )函数
此函数为自编函数,根据num_veh车辆数初始化元胞车道的车辆位置以及速度。
调用系统random函数,生成随机速度处于0-5,随机位置0-999,对于位置处速度为None,说明无车,则插入这辆车,直到插入的车辆数达到num_veh。
1.1.8 initial_numbers( )函数
此函数为自编函数,根据要求生成50-950辆车的数据进列表numbers_veh。
1.1.9 get_mean_speed_density(a,b)函数
此函数为自编函数,设置虚拟检测器,计算a-b段的某个密度下的车辆的平均速度,并且返回平均速度的值。(此函数亦可同时检测某段的密度)
上部分截取自我的实验报告。
下部分为代码1(如不通可能是被我删了某些函数,资源里面是完整的,供下载)
#-*-coding:GBK -*-
import matplotlib.pyplot as plt
import random
import numpy as np
import matplotlib
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
#找空档 周期性边界
def d_empty(a):
sum_empty=0
for j in range(a+1,Length_road):
if cell_list[j]==None:
sum_empty=sum_empty+1
else:
return sum_empty
for j in range(0,a):
if cell_list[j]==None:
sum_empty=sum_empty+1
else:
return sum_empty
#加速
def Speed_acceleration(a):
return min(a+1,Vmax)
#减速
def Speed_slowdown(a,b):
return min(a,d_empty(b))
#随机慢化
def Speed_random_slow(a):
b=random.random()
if b<=p_slow:
return max(0,a-1)
else :
return a
#位置更新
#初始化
def initial_veh():
sum1=0
while True:
a=random.randint(0,Vmax)
b=random.randint(0,999)
if cell_list[b]==None:
sum1=sum1+1
cell_list[b]=a
if sum1==num_veh:
break
#参数设置
Length_road = 1000
running_time = 4000
# ~ V_max=[2,3,5]
Vmax=5
p_slow=0.3
num_veh=700
cell_list=[None]*Length_road
initial_veh()
cell_list1=cell_list.copy()
time=[]
space=[]
s=[]
Volume_list1=[]
for i in range(0,running_time):
for cell in range(0,Length_road):
if cell_list1[cell]!=None:
#调用浪费时间
#cell_list[cell]=Speed_acceleration(cell_list[cell])
#cell_list[cell]=Speed_slowdown(cell_list[cell],cell)
cell_list[cell]=min(cell_list[cell]+1,Vmax)
cell_list[cell]=min(cell_list[cell],d_empty(cell))
cell_list[cell]=Speed_random_slow(cell_list[cell])
#位置更新
h=cell_list[cell]
cell_list[cell]=None
cell_list[(cell+h)%Length_road]=h
if i >=2000:
mean_speed=get_mean_speed_density(0,Length_road)
volume=num_veh/Length_road*mean_speed
Volume_list1.append(volume)
#print(volume,density)
for j in range(0,Length_road):
if cell_list1[j]!=None:
s.append(j+1)
space.append(s.copy())
time.append([i]*num_veh)
s=[]
cell_list1=cell_list.copy()
draw_time_space()
plt.show()