环形公路堵车概率模型(含详细解析)

基础理论

路面上有n辆车,以不同的速度向前行驶, 模拟堵车问题。
有以下假设:

  1. 假设某辆车的当前速度是v。
  2. 若前方可见范围内没车,则它在下一秒的车速提高到v+1,直到达到规定的最高限速。
  3. 若前方有车,前车的距离为d,且d < v,则它下 一秒的车速降低到d-1 。
  4. 每辆车会以概率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-1if 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
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42567027/article/details/107398651