基础理论
路面上有n辆车,以不同的速度向前行驶, 模拟堵车问题。
有以下假设:
- 假设某辆车的当前速度是v。
- 若前方可见范围内没车,则它在下一秒的车速提高到v+1,直到达到规定的最高限速。
- 若前方有车,前车的距离为d,且d < v,则它下 一秒的车速降低到d-1 。
- 每辆车会以概率p随机减速v-1。、
代码实现
// An highlighted block
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
#对车辆的位移进行限制,当大于水平的公路长度时,则认为是拐外后的位移
def clip(x, path):
for i in range(len(x)):
if x[i] >= path:
x[i] %= path
if __name__ == "__main__":
#文字转化
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False
'''初始化定义'''
path = 5000 # 环形公路的长度
n = 100 # 公路中的车辆数目
v0 = 50 # 车辆的初始速度
p = 0.3 # 随机减速概率
Times = 1000 #模拟时间
'''模拟车辆的位移和速度'''
np.random.seed(0)
#模拟100辆车辆的位置
x = np.random.rand(n) * path
#车辆位移进行排序
x.sort()
#将100个车辆的速度定义为50,并设为float类型数据
v = np.tile([v0], n).astype(np.float)
#
'''画布大小'''
plt.figure(figsize=(10, 8), facecolor='w')
'''模拟在时间范围内的堵车情况'''
for t in range(Times):
#绘图 x:车辆位置 [t]*n:时间
plt.scatter(x, [t]*n, s=1, c='b', alpha=0.05)
'''依次判断100辆车的速度和位移情况'''
for i in range(n):
#计算前后车辆的距离
if x[(i+1)%n] > x[i]:
d = x[(i+1) % n] - x[i]
else:
d = path - x[i] + x[(i+1) % n]
'''判断此刻的速度和与前车的距离大小'''
if v[i] < d:
#若前方可见范围内没车,则它在下一秒的车速提高到v+1,直到达到规定的最高限速。同时,每辆车会以概率p随机减速v-1。
if np.random.rand() > p:
v[i] += 1
else:
v[i] -= 1
else:
#若前方有车,前车的距离为d,且d < v,则它下 一秒的车速降低到d-1 。
v[i] = d - 1
#限制速度,v<0,则将v定义为0;v>150,则将v定义为150
v = v.clip(0, 150)
#车辆的位移在增加,车在往前开
x += v
#调用clip
clip(x, path)
'''限制坐标轴'''
#对x轴的坐标进行限制
plt.xlim(0, path)
#对y轴坐标进行限制
plt.ylim(0, Times)
'''标签'''
plt.xlabel(u'车辆位置', fontsize=16)
plt.ylabel(u'模拟时间', fontsize=16)
plt.title(u'环形公路车辆堵车模拟', fontsize=20)
'''自动调整子图参数,使之填充整个图像区域'''
plt.tight_layout(pad=2)
'''画图'''
plt.show()
图形分析
图形中颜色越重的地方,说明很多车的位移相同,则说明发生了堵车的情况。如果颜色重的地方多,说明堵车严重。
随机减速概率越大,堵车越严重。
随机减速概率=0.3
随机减速概率=0.5