【元胞自动机】基于元胞自动机实现多车道信号交叉口仿真matlab源码
作者:互联网
一、简介
元胞自动机(CA)是一种用来仿真局部规则和局部联系的方法。典型的元胞自动机是定义在网格上的,每一个点上的网格代表一个元胞与一种有限的状态。变化规则适用于每一个元胞并且同时进行。典型的变化规则,决定于元胞的状态,以及其( 4 或 8 )邻居的状态。 1 对元胞自动机的初步认识 元胞自动机(CA)是一种用来仿真局部规则和局部联系的方法。典型的元 胞自动机是定义在网格上的,每一个点上的网格代表一个元胞与一种有限的状 态。变化规则适用于每一个元胞并且同时进行。 2 元胞的变化规则&元胞状态 典型的变化规则,决定于元胞的状态,以及其( 4 或 8 )邻居的状态。 3 元胞自动机的应用 元胞自动机已被应用于物理模拟,生物模拟等领域。 4 元胞自动机的matlab编程 结合以上,我们可以理解元胞自动机仿真需要理解三点。一是元胞,在matlab中可以理解为矩阵中的一点或多点组成的方形块,一般我们用矩阵中的一点代表一个元胞。二是变化规则,元胞的变化规则决定元胞下一刻的状态。三是元胞的状态,元胞的状态是自定义的,通常是对立的状态,比如生物的存活状态或死亡状态,红灯或绿灯,该点有障碍物或者没有障碍物等等。
二、源代码
clear all clf nx=130; %must be divisible by 4 ny=122; Pbridge = .05; z=zeros(nx,ny); o=ones(nx,ny); traf = z ; trafNew = z; trafB=z; gnd = z ; gn=z; gnd(50, 1:ny) = 1 ; gnd(79, 1:ny) = 1 ; gnd(1:nx, 50) = 1 ; gnd(1:nx,71) = 1 ; gnd(nx/2, 1: 50) = 1 ; gnd(nx/2, 71:ny) = 1 ; gnd(1: 50, ny/2) = 1 ; gnd(79:nx,ny/2)=1; imh = image(cat(3,z',traf',gnd')); set(imh, 'erasemode', 'none'); %第一相位 0到38秒 %进口 for i=1:100 %绿灯 %东进口 %直行 右转 traf(129,55) =round(rand(1,1)/1.8); %add a grain at the top xind = [80:129]; yind=55; trafNew(xind-1,yind)=traf(xind,yind); traf(129,53) =round(rand(1,1)/1.76); %add a grain at the top xind = [79:129]; yind=53; trafNew(xind-1,yind)=traf(xind,yind); %西进口 %直行 右转 traf(1,66) =round(rand(1,1)/1.76); %add a grain at the top xind = [1:49]; yind=66; trafNew(xind+1,yind)=traf(xind,yind); trafNew(xind+1,yind)=traf(xind,yind); traf(1,68) =round(rand(1,1)/1.76); %add a grain at the top xind = [1:49]; yind=68; trafNew(xind+1,yind)=traf(xind,yind); %南进口 %右转 traf(77,122) =round(rand(1,1)/1.76); %add a grain at the top yind = [71:122]; xind=77; trafNew(xind,yind-1)=traf(xind,yind); %北进口 %右转 traf(53,1) =round(rand(1,1)/1.76); %add a grain at the top yind = [1:50]; xind=53; trafNew(xind,yind+1)=traf(xind,yind); %交叉口内部 %东进口直行 xind = [50:80]; yind=55; trafNew(xind-1,yind)=traf(xind,yind); %西进口直行; xind = [50:80]; yind=66; trafNew(xind+1,yind)=traf(xind,yind); %出口 %东出口 xind = [79:122]; yind=[65:79]; trafNew(xind+1,yind)=traf(xind,yind); %西出口 xind = [2:50]; yind=[50:60]; trafNew(xind-1,yind)=traf(xind,yind); %南出口 yind = [71:120]; xind=[50:63]; trafNew(xind,yind+1)=traf(xind,yind); %北出口 yind = [2:50]; xind=[67:77]; trafNew(xind,yind-1)=traf(xind,yind); %针对右转车道的代码 %东进口右转 trafNew(77,50)=traf(79,53); %西进口右转 trafNew(53,71)=traf(50,68); %南进口右转 trafNew(79,68)=traf(77,71); %北进口右转 trafNew(50,53)=traf(53,50); %红灯 p=mod(i,2); %margolis neighborhood %西进口左转 正向 traf(1,64) =round(rand(1,1)/1.85); %add a grain at the top xind = [1+p:2:nx-2+p]; yind=64; trafNew(xind,yind) = gnd(xind,yind).*traf(xind,yind)+... (1-gnd(xind,yind)).*traf(xind,yind).*traf(xind+1,yind); trafNew(xind+1,yind)=traf(xind+1,yind)+... (1-traf(xind+1,yind)).*traf(xind,yind).*(1-gnd(xind,yind)); %北进口直行左转 正向 traf(55:2:63,1) =round(rand(5,1)/1.85); %add a grain at the top yind = [1+p:2:51-2+p]; xind=55:2:63; trafNew(xind,yind) = gnd(xind,yind).*traf(xind,yind)+... (1-gnd(xind,yind)).*traf(xind,yind).*traf(xind,yind+1); trafNew(xind,yind+1)=traf(xind,yind+1)+... (1-traf(xind,yind+1)).*traf(xind,yind).*(1-gnd(xind,yind)); %东进口左转 反向 traf=trafNew; traf(79,57) =round(rand(1,1)/1.85); xind = [79+p:2:129-2+p]; yind=57; gn(57,129)=1; trafNew(xind,yind) = gn(xind,yind).*traf(xind,yind)+... (1-gn(xind,yind)).*traf(xind,yind).*traf(xind+1,yind); trafNew(xind+1,yind)=traf(xind+1,yind)+... (1-traf(xind+1,yind)).*traf(xind,yind).*(1-gn(xind,yind)); for x=79:129 trafB(x,yind)=trafNew(208-x,yind); end traf=trafNew; traf(79:129,57)=trafB(79:129,57); %南进口直行左转 反向 gn(67:2:75,122)=1; traf(67:2:75,72) =round(rand(5,1)/1.85); %add a grain at the top yind = [72+p:2:122-2+p]; xind=67:2:75; trafNew(xind,yind) = gnd(xind,yind).*traf(xind,yind)+... (1-gnd(xind,yind)).*traf(xind,yind).*traf(xind,yind+1); trafNew(xind,yind+1)=traf(xind,yind+1)+... (1-traf(xind,yind+1)).*traf(xind,yind).*(1-gnd(xind,yind)); for y=72:122 trafB(xind,y)=trafNew(xind,194-y); end traf(67:2:75,72:122)=trafB(67:2:75,72:122); pause(0.1); set(imh, 'cdata', cat(3,z',traf',gnd') ) drawnow end for i=101:200 %交叉口内部 %东进口直行 xind = [53:75]; yind=55; trafNew(xind-1,yind)=traf(xind,yind); %西进口直行; xind = [52:79]; yind=66; trafNew(xind+1,yind)=traf(xind,yind); %出口 %东出口 xind = [79:122]; yind=[65:79]; trafNew(xind+1,yind)=traf(xind,yind); %西出口 xind = [2:50]; yind=[50:60]; trafNew(xind-1,yind)=traf(xind,yind); %南出口 yind = [71:120]; xind=[50:63]; trafNew(xind,yind+1)=traf(xind,yind); %北出口 yind = [2:50]; xind=[67:77]; trafNew(xind,yind-1)=traf(xind,yind); %红灯 p=mod(i,2); %margolis neighborhood %西进口左转直行 正向 traf(1,64:2:68) =round(rand(1,3)/1.85); %add a grain at the top xind = [1+p:2:50-2+p]; yind=64:2:68; trafNew(xind,yind) = gnd(xind,yind).*traf(xind,yind)+... (1-gnd(xind,yind)).*traf(xind,yind).*traf(xind+1,yind); trafNew(xind+1,yind)=traf(xind+1,yind)+... (1-traf(xind+1,yind)).*traf(xind,yind).*(1-gnd(xind,yind)); %北进口左转 正向 traf(53:2:63,1) =round(rand(6,1)/1.85); %add a grain at the top yind = [1+p:2:51-2+p]; xind=53:2:63; trafNew(xind,yind) = gnd(xind,yind).*traf(xind,yind)+... (1-gnd(xind,yind)).*traf(xind,yind).*traf(xind,yind+1); trafNew(xind,yind+1)=traf(xind,yind+1)+... (1-traf(xind,yind+1)).*traf(xind,yind).*(1-gnd(xind,yind)); %东进口左转直行 反向 traf=trafNew; traf(79,53:2:57) =round(rand(1,3)/1.85); xind = [79+p:2:129-2+p]; yind=53:2:57; gn(53:2:57,129)=1; trafNew(xind,yind) = gn(xind,yind).*traf(xind,yind)+... (1-gn(xind,yind)).*traf(xind,yind).*traf(xind+1,yind); trafNew(xind+1,yind)=traf(xind+1,yind)+... (1-traf(xind+1,yind)).*traf(xind,yind).*(1-gn(xind,yind)); for x=79:129 trafB(x,53)=trafNew(208-x,53); trafB(x,55)=trafNew(208-x,55); trafB(x,57)=trafNew(208-x,57); end traf(79:129, 53:2:57)=trafB(79:129, 53:2:57); %南进口左转 反向 gn(67:2:77,122)=1; traf(67:2:77,72) =round(rand(6,1)/1.85); %add a grain at the top yind = [72+p:2:122-2+p]; xind=67:2:77; trafNew(xind,yind) = gnd(xind,yind).*traf(xind,yind)+... (1-gnd(xind,yind)).*traf(xind,yind).*traf(xind,yind+1); trafNew(xind,yind+1)=traf(xind,yind+1)+... (1-traf(xind,yind+1)).*traf(xind,yind).*(1-gnd(xind,yind)); for y=72:122 trafB(xind,y)=trafNew(xind,194-y); end traf(67:2:77,72:122)=trafB(67:2:77,72:122); pause(0.1); set(imh, 'cdata', cat(3,z',traf',gnd') ) drawnow end
三、运行结果
4 参考文献
[1]葛红霞, 祝会兵, 戴世强. 智能交通系统的元胞自动机交通流模型[J]. 物理学报, 2005(10):159-164.
标签:traf,xind,trafNew,源码,元胞,gnd,yind,自动机 来源: https://blog.csdn.net/qq_59747472/article/details/120660818