元胞自动机的初步理解
对元胞自动机的初步认识\ 元胞自动机(CA)是一种用来仿真局部规则和局部联系的方法。典型的元\ 胞自动机是定义在网格上的,每一个点上的网格代表一个元胞与一种有限的状\ 态。变化规则适用于每一个元胞并且同时进行。
元胞的变化规则&元胞状态\ 典型的变化规则,决定于元胞的状态,以及其( 4 或 8 )邻居的状态。
元胞自动机的应用\ 元胞自动机已被应用于物理模拟,生物模拟等领域。
元胞自动机的matlab编程\ 结合以上,我们可以理解元胞自动机仿真需要理解三点。一是元胞,在matlab中可以理解为矩阵中的一点或多点组成的方形块,一般我们用矩阵中的一点代表一个元胞。二是变化规则,元胞的变化规则决定元胞下一刻的状态。三是元胞的状态,元胞的状态是自定义的,通常是对立的状态,比如生物的存活状态或死亡状态,红灯或绿灯,该点有障碍物或者没有障碍物等等。
在这里,我们就讨论一下元胞在交通流模型中的应用。众所周知,最简单的元胞交通流模型是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实现的仿真模拟图:
``` %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % A Two-Lane Cellular Automaton Traffic Flow Model with the Keep-Right Rule %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clc; clear all; close all;
B=3; % The number of the lanes plazalength=100; % The length of the simulation highways h=NaN; % The handle of the image
[plaza,v]=createplaza(B,plazalength); h=showplaza(plaza,h,0.1);
iterations=1000; % Number of iterations probc=0.1; % Density of the cars probv=[0.1 1]; % Density of two kinds of cars probslow=0.3; % The probability of random slow Dsafe=1; % The safe gap distance for the car to change the lane VTypes=[1,2]; % Maximum speed of two different cars [plaza,v,vmax]=new_cars(plaza,v,probc,probv,VTypes);% Generate cars on the lane
size(find(plaza==1)) PLAZA=rot90(plaza,2); h=showplaza(PLAZA,h,0.1); for t=1:iterations; size(find(plaza==1)) PLAZA=rot90(plaza,2); h=showplaza(PLAZA,h,0.1); [v,gap,LUP,LDOWN]=paracount(plaza,v,vmax); [plaza,v,vmax]=switchlane(plaza,v,vmax,gap,LUP,LDOWN); [plaza,v,vmax]=randomslow(plaza,v,vmax,probslow); [plaza,v,vmax]=moveforward(plaza,v,vmax); end ```