在这里我并不想说多少和美国数学建模(MCM)相关的东西,但是以2014美赛美赛A题的背景谈谈元胞自动机(Cellular automata,后面简称CA)以及其在数学建模中交通流模型中的作用和实现方法。CA的基本知识,在这里不用多说,其他地方可以搜到很多相关的简介。但是,CA之所以让人着迷,在于她的规则,元胞之间相互作用的演化规则,这些规则就是构成CA的基石,让CA可以做很多意想不到的事情,比如模拟物理现象(沙堆,气体分子运动,光的传播等等),做图像处理(边缘检测等),计算机网络建模......
在这里,我们就讨论一下元胞在交通流模型中的应用。众所周知,最简单的元胞交通流模型是wolfram提出的初等CA的第184号规则,其演化规则如下:
figure 1:wolfram的184号规则
这个规则可以让元胞模拟出交通流的感觉,为什么说是感觉呢,因为大家好像看到了一个方块或者说叫一个小车,在向前行进,但是并没有模拟出交通流中的很多现象。随后就有NaSch规则被提出来了,这个规则可以说是所有元胞交通流模型的鼻祖,后面很多规则都是从这个规则中进化而来的。而我们今天讨论的靠右行驶的双车道模型也是根据NaSch模型改进而来的,简单讨论一下NaSch模型,然后进一步引出本文要讲解的靠右行驶模型。
NaSch规则:
(1)加速,
(2)减速,
(3)以概率p随机慢化速度,
(4)行进,
可以看到,NaSch规则就仅仅只有简单的四条,但是却模拟出了交通流的最基本的东西,从其时空图就可以看出来:
figure 2:Density=0.15,Vmax=5
figure 2是元胞长度为1000,时间步为500时候得出的时空图。这里还有相应的包括流量密度图和速度密度图等基本图也可以得出来。
接下来离我们的靠右行驶模型又进了一步,在这之前,我们再介绍一下基于NaSch的双车道模型STNS,有了双车道模型,靠右行驶模型便不再是难事。
STNS规则:
(1)加速,
(2)减速,
(3)换道满足以下条件:
1.换道动机:
2.安全条件:
(4)以概率p随机慢化速度,
(5)行进,
可以从STNS的规则中看到,为了实现双车道的CA交通流模型,我们实质对NaSch模型的改动仅仅是添加了一条换道规则,而换道规则看起来又是那么容易理解和合乎现实条件。这就是CA的魅力,通过稍微改动规则,就可以实现一些我们想要的结果,后面我们将用靠右行驶模型来诠释这个。当然规则也是CA的噩梦,我们通常情况下并不知道什么时候该用CA的什么规则。
现在我将再引进一条规则,在此规则下CA就可以实现2014MCM比赛中靠右行驶规则,同时可以预料到,再修改一些规则,仍然可以完整实现2014MCM比赛A题中的任何一个问题,但是这里对此不予以讨论。
Keep-Right Rule:
1)加速,
(2)减速,
(3)向左道满足以下条件:
1.换道动机:
2.安全条件:
(4)向右换道满足小车正右边和右边上下两格之内无小车即可换道(这也和实际靠右规则想吻合,在保证安全的情况下,可以回右车道就会回去)。用图像演示规则如下:
figure 3
可以看到只有最右边一幅图可以实现向右换道。
(5)以概率p随机慢化速度,
(6)行进,
至此,靠右行驶规则用元胞自动机实现完毕。下面是用Matlab实现的仿真模拟图:
元胞自动机实现2014MCMA题的靠右行驶规则的介绍就是如上的博文了。对于元胞自动机的可视化仿真也是元胞的一个有趣的地方,如果需要Matlab仿真代码,请留下的邮箱,我会在看到的时候发给你。
for t=1:iterations;
PLAZA=rot90(plaza,2);
h=show_plaza(PLAZA,h,0.01);
[v,gap,LUP,LDOWN]=para_count(plaza,v,vmax);
[plaza,v,vmax]=switch_lane(plaza,v,vmax,gap,LUP,LDOWN);
[plaza,v,vmax]=random_slow(plaza,v,vmax,probslow);
[plaza,v,vmax]=move_forward(plaza,v,vmax);
end
这是主循环的函数代码。