添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
买醉的牛肉面  ·  Amazon.com: Cell ...·  1 周前    · 
开心的斑马  ·  chrome 报错 ...·  4 月前    · 
俊逸的匕首  ·  Multipart request ...·  1 年前    · 
高兴的显示器  ·  VS2019 preview ...·  1 年前    · 


简单几步实现NaSch模型的Python仿真

NaSch模型是对184号模型的推广,1992年Nagle和Schreckenberg提出了著名的NaSch模型,在这一模型中,时间、空间以及速度都被离散化,道路被划分为离散的格子(即元胞),每个元胞都是空的,或者被一辆车占据,每辆车的速度可以取1,2,…,Vmax ,Vmax 为最大速度。在时间步增加的过程中,模型按照如下规则进行演化。

1 加速

Vn —> min(Vn+1, Vmax),直观上的解释是若能加速则速度加一,反应了司机倾向于以尽可能大的速度行驶的特点。

2 减速

Vn —> min(Vn, Dn),以确保车辆不会与前车发生碰撞。

3 随机慢化

以随机概率p令Vn —> max(Vn-1,0),该规则用来体现驾驶人的行为差异,这样既可以反映随机加速行为,又可以反映减速过程中的过度反应行为。这一规则也是堵塞自发产生的至关重要因素。

4 位置更新

Xn —> Xn+Vn,车辆按照更新后的速度继续向前移动。

NaSch模型的Python实现

用python编写一个NaSch模型代码,并用Matplotlib可视化地绘制成图,并让图像随时间步的推移动态变化。

  • 老规矩,先调包,并创建一个图像
import matplotlib as mpl
import matplotlib.pyplot as plt
import random
# 创建图像
fig = plt.figure(figsize=(10,1))
  • 设置模型的参数,相当于一个遥控器,哪里不对点哪里~
# 模型参数设置
numofcell = 20     # 道路长度
numofcar = 12      # 空间中的车辆数
max_time = 100     # 设置最大时间步
max_speed = 5      # 允许的车辆最大速度
p_slowdown = 0.3   # 随机慢化概率
pause_time = 0.1   # 刷新时间(每一帧持续的时间)
cell_size = 15     # 元胞的大小
  • 定义一个函数来构建一维空间,空间的长度就是道路长度,相当于用一系列和X轴或Y轴平行的直线,绘制一排小网格,每个小网格的中心,相当于(i,0),其中,i=1,2,…,numofcell
# 函数:构建一维空间
def Plot_Space():
    for i in range(1, numofcell): plt.plot([i-0.5, i-0.5], [-0.5, 0.5], '-k', linewidth = 0.5)       
    plt.axis([-0.5, numofcell-0.5, -0.5, 0.5])
plt.xticks([]);plt.yticks([])

Python交通流仿真含源码 交通建模仿真python_Python交通流仿真含源码

  • 定义一个函数来获取和前车的距离,从而避免两车相撞。在这里采用了周期性边界,即从道路末端驶出的小车会重新回到起点,相当于一个环路。
# 函数:获取和前车的距离
def get_empty_front(link, numofcell, indexofcell):
    link2 = link * 2   # 周期性边界
    num = 0; i = 1
    while (link2[indexofcell + i]) == None:
        num += 1; i += 1
    return num
  • 在道路空间中随机生成numofcar个初始元胞,并赋予随机的初始速度(不大于已经设置好的最大速度)。道路被车辆占有的状态储存在列表link中,若元胞中没有车辆,则link对应的位置为“None”;若元胞中有车,link对应的位置储存车辆的速度。(可以开开脑洞,大胆地尝试不同初始状态噢)
# 随机生成初始元胞
Plot_Space()
link = [None] * numofcell
num = 0
while num != numofcar:
    sj = random.randint(0, numofcell - 1)
    if link[sj] == None:
        link[sj] = random.randint(0, 5)
        num += 1
  • 在0~max_time的时间步内,分四个步骤进行NaSch模型的演化。
# NaSch模型
for t in range(0, max_time):
    for cell in range(0, numofcell):
        if link[cell] != None:
            link[cell] = min(link[cell] + 1, max_speed)
            link[cell] = min(link[cell], get_empty_front(link, numofcell, cell))
            # 随机慢化
            if random.random() <= p_slowdown:
                link[cell] = max(link[cell] - 1, 0)
    # 位置更新
    nlink = [None] * numofcell
    for cell in range(0, numofcell):
        if link[cell] != None:
            new_index = cell + link[cell]
            if new_index >= numofcell:
                new_index -= numofcell
            nlink[new_index] = link[cell]
    link = nlink
  • 绘制当前时间步车辆位置的图像,注意这里有缩进,说明上一段NaSch模型演化代码中的for循环还没有结束呦~
x1 = []
    for i in range(0,len(link)):
        if link[i] != None:
            x1.append(i)
    Plot_Space()
    plt.plot(x1, [0] * numofcar, 'sk', markersize=cell_size)
    plt.xlabel('timestep:' + str(t))
  • 让图片动起来( 同样注意缩进 ),plt.pause()函数让当前的图像维持pause_time长的时间,随后plt.cla()函数将整个图像擦除。下一个时间步,继续绘制图像,保留一段时间,并擦除,再绘制图像……就能源源不断地产生动画啦!
plt.pause(pause_time)
	plt.cla()

跑一下看看结果!

仔细看,拥堵带是逐渐向后传播的。

Python交通流仿真含源码 交通建模仿真python_NaSch模型_02


操控我的“遥控器”,并给它一个恰当初始状态,元胞就可以开启“阅兵模式”。

Python交通流仿真含源码 交通建模仿真python_交通流理论_03


给我开“瞬移”挂,只要动的足够快,你就分不清元胞到底是往左跑还是往右跑。

Python交通流仿真含源码 交通建模仿真python_Python交通流仿真含源码_04



android几种layout android layout_weight

那我现在对这句话重新概括一下:“因为设置了button1的权重最小,所以它占用的布局优先级就越高”,也许在Android里面布局并没有优先级之说,我这里只是为了说明问题,自己定义的,所以朋友们不要拍砖。 占据1/3.你也可以把button2设置为一個非常大的数,比如2000,此時在Graphical Layout模式下可以看到button1填充滿了整個寬度,而看不到button2的影子,事实

python在终端输出 python输出到终端的函数

Python termcolor module可以吗?对于某些用途来说,这是一个粗略的等价物。from termcolor import colored print colored('hello', 'red'), colored('world', 'green')这个例子来自this post,它有很多。下面是docs的一部分示例import sysfrom termcolor import c