NASCH模型、单车道CA模型编程实现

交通流理论

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()

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Circle-Y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值