美文网首页机器学习·Python·算法
模拟环行公路堵车问题

模拟环行公路堵车问题

作者: Albert_Sun | 来源:发表于2017-05-02 23:18 被阅读13次

    公路堵车概率模型 | Nagel-Schreckenberg 交通流模型。
    路面上有N辆车,以不同的速度向前行驶,模拟堵车问题有以下假设:

    • 假设某辆车的当前车速是V;
    • 若前方可见范围内没车,则它在下一秒的车速提高到V+1,直到达到规定最高限速;
    • 若前方有车,前车距离为d,且d<v, 则它下一秒的车速降低到d-1;
    • 每辆车会以概率p随机减速v-1
    # -*- encoding: utf-8
    import math
    import numpy as np
    import matplotlib.pyplot as plt
    path = 5000
    n = 100
    v0 = 5
    p = 0.3
    Times = 3000
    np.random.seed(0)
    
    x = np.random.rand(n) * path  # N辆车的起始位置
    x.sort()
    v = np.tile([v0], n).astype(np.float) # N辆车的初始车速
    
    plt.figure(figsize=(10, 8),facecolor='white')
    
    for t in range(Times):
        plt.scatter(x, [t]*n, s=1, c='k', alpha=0.1)
        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: # 安全距离
                if np.random.rand() > p: 
                    v[i] += 1 # 正常加速
                else:
                    v[i] -= 1 # 随机减速
            else:
                v[i] = d-1 # 非安全距离,减速
                
        v = v.clip(0, 150) # 限速为0-150
        x += v # 更新位置
        x %= path # 环行公路位置修正
    plt.xlim(0, path)
    plt.ylim(0, Times)
    plt.tight_layout(pad=2)
    plt.show()
    
    模拟环行公路堵车.png

    【参考资料】

    1. 邹博课件

    相关文章

      网友评论

        本文标题:模拟环行公路堵车问题

        本文链接:https://www.haomeiwen.com/subject/cxghtxtx.html