元胞自动机的道路交通模拟
- 1.直行单行道--概率P进入研究区域道路交通模拟
- 元胞自动机原理:
- 直行单行道代码模拟:
- 2.直行交叉口(含红绿灯)--概率P进入研究区域道路交通模拟
- 交叉口原理:
- 交叉口代码模拟:
- 3.小区道路开放前的三角形道路模拟:
- 解释:
- 4.小区道路开放后的三角形道路模拟:
- 解释:
- 5.其它类型小区示意图(可根据上面描述及自己的创新拓展)
1.直行单行道–概率P进入研究区域道路交通模拟
元胞自动机原理:
元胞自动机(cellular automata,CA) 是一种时间、空间、状态都离散,空间相互作用和时间因果关系为局部的网格动力学模型,具有模拟复杂系统时空演化过程的能力。
直行单行道代码模拟:
车辆以一定的概率进入车道内,当车辆前后距离较近时,车速为V1。当车辆前后距离较远时,车辆为V2,V2>V1;
参考示意图:
下面展示一些 内联代码片
。
%直行进入研究区域
%function []=in_yuanbao(p,long)
%p 车辆驶入的概率
%long 道路长度 m
%n执行的步长 为1000次
p=20;
long=500;
n=1000;
L=zeros(1,long/5+1);
V=zeros(1,long/5+1);
flag=0;%flag 用于判断是否有车在等待区即将离开该区域
a=0;
figure();
H=imshow(L,[]);
set(gcf,'position',[241 132 560 420]) ;%241 132 560 420(设定plot输出图片的尺寸)
set(gcf,'doublebuffer','on'); %设定为双缓冲模式
title('元胞自动机交通模拟','color','b');
for i=1:n
flag=L(1,long/5+1);
if p>=rand(1)*100
L(1,1)=1;
end
%速度设定
V(1,L(1,1:end-2)==1&L(1,2:end-1)==0&L(1,3:end)==0)=2;
V(1,L(1,1:end-2)==1&L(1,2:end-1)==0&L(1,3:end)==1)=1;
V(1,L(1,1:end-2)==1&L(1,2:end-1)==1)=0;
if flag==1
a=a+1;
flag=0;
L(1,long/5+1)=0;
V(1,long/5)=0;
elseif L(1,long/5)==1;
V(1,long/5)=1;
end
L([zeros(1,1) V(1,1:end-1)]==1)=1;
L([zeros(1,2) V(1,1:end-2)]==2)=1;
L(V(1,1:end)==2|V(1,1:end)==1)=0;
%L(1,(V(1,1:end)==2)+2)=1;
%L(1,(V(1,1:end)==2)+1)=0;
%L(1,V(1,1:end)==1+1)=1;
V=zeros(1,long/5+1);
set(H,'CData',L);
pause(0.1)
end
%end
2.直行交叉口(含红绿灯)–概率P进入研究区域道路交通模拟
交叉口原理:
我们可以分为四条道路,对其编号为 1、2、3、4号。
1号道路即为十字交叉口之前的直行道路。
2号道路为左转道路。
3号道路为十字交叉口后的直行道路。
4号道路为右转道路。
通过对if语句的调控来设置道路口的红绿灯。也可以通过随机概率来设定汽车直行左转右转的概率。若概率为0及为关闭该方向。例如若设置右转概率为0,则汽车将只会直行和左转,不会发生右转。
交叉口代码模拟:
参考示意图:
参考代码
%有交叉口的车辆模拟情况
%直行进入研究区域
%function []=in_yuanbao(p,long)
%p 车辆驶入的概率
%long 道路长度 m
%width 小区宽度 m
%n执行的步长 为1000次
%主道路均为4条
%小区道路为两条
p=20;
long=500;
width=500;
n=1000;
L_car=ones(width/5,long/5).*1.2;
V_car=ones(width/5,long/5).*1.2;
L_car(width/10,:)=0;
L_car(:,long/10)=0;
flag=0;%flag 用于判断是否有车在等待区即将离开该区域
a=0;
figure();
H=imshow(L_car,[]);
set(gcf,'position',[241 132 560 420]) ;%241 132 560 420(设定plot输出图片的尺寸)
set(gcf,'doublebuffer','on'); %设定为双缓冲模式
title('元胞自动机交通模拟','color','b');
Tred=10;
Tgreen=10;%红绿灯时间
L=L_car(width/10,1:long/10-1);
V=V_car(width/10,1:long/10-1);
L_1=L_car(width/10,long/10+1:end);%直行路段统计
V_1=V_car(width/10,long/10+1:end);
bL_2=L_car(width/10+1:end,long/10);%右转路段统计
bV_2=V_car(width/10+1:end,long/10);
bL_3=L_car(width/10-1:-1:1,long/10);%左转路段统计
bV_3=V_car(width/10-1:-1:1,long/10);
L_2=bL_2';
L_3=bL_3';
V_2=bV_2';
V_3=bV_3';
gs1=zeros(1,n);
for i=1:n
a=a+1;%用于计时,当作红绿灯计算
V(:,:)=0;
V_1(:,:)=0;
V_2(:,:)=0;
V_3(:,:)=0;
if p>=rand(1)*100
L(1,1)=1;
end
%速度设定
V(L(:,1:end-2)==1&L(:,2:end-1)==0&L(:,3:end)==0)=2;
V(L(:,1:end-2)==1&L(:,2:end-1)==0&L(:,3:end)==1)=1;
V(L(:,1:end-2)==1&L(:,2:end-1)==1)=0;
% a=a+1;
% V(:,long/5-1)=0
%end
if L(1,end)==0&&L(1,end-1)==1
L(1,end)=1;
L(1,end-1)=0;
end
L([zeros(1,1) V(:,1:end-1)]==1)=1;
L([zeros(1,2) V(:,1:end-2)]==2)=1;
L(V(:,1:end)==2|V(:,1:end)==1)=0;
%以上为之前的直行路段。
if a>Tred
if a<Tred+Tgreen
if L(1,end)==1 %如果有车等待
L_car(width/10,1:long/10)=1;
L_car(width/10,1:long/10)=0;
L(1,end)=0;
turn=randperm(3,1);
if turn==1
%判断为直线
L_1(1,1)=1;
end
if turn==2
%判断为右转
L_2(1,1)=1;
end
if turn==3
%判断为左转
L_3(1,1)=1;
end
end
else
a=0;
end
end
%--------------------------------------------------------
V_1(L_1(:,1:end-2)==1&L_1(:,2:end-1)==0&L_1(:,3:end)==0)=2;
V_1(L_1(:,1:end-2)==1&L_1(:,2:end-1)==0&L_1(:,3:end)==1)=1;
V_1(L_1(:,1:end-2)==1&L_1(:,2:end-1)==1)=0;
L_1([zeros(1,1) V_1(:,1:end-1)]==1)=1;
L_1([zeros(1,2) V_1(:,1:end-2)]==2)=1;
L_1(V_1(:,1:end)==2|V_1(:,1:end)==1)=0;
L_1(1,end)=0;
L_1(1,end-1)=0;
%--------------------------------------------------------
V_2(L_2(:,1:end-2)==1&L_2(:,2:end-1)==0&L_2(:,3:end)==0)=2;
V_2(L_2(:,1:end-2)==1&L_2(:,2:end-1)==0&L_2(:,3:end)==1)=1;
V_2(L_2(:,1:end-2)==1&L_2(:,2:end-1)==1)=0;
L_2([zeros(1,1) V_2(:,1:end-1)]==1)=1;
L_2([zeros(1,2) V_2(:,1:end-2)]==2)=1;
L_2(V_2(:,1:end)==2|V_2(:,1:end)==1)=0;
L_2(1,end)=0;
L_2(1,end-1)=0;
%--------------------------------------------------------
V_3(L_3(:,1:end-2)==1&L_3(:,2:end-1)==0&L_3(:,3:end)==0)=2;
V_3(L_3(:,1:end-2)==1&L_3(:,2:end-1)==0&L_3(:,3:end)==1)=1;
V_3(L_3(:,1:end-2)==1&L_3(:,2:end-1)==1)=0;
L_3([zeros(1,1) V_3(:,1:end-1)]==1)=1;
L_3([zeros(1,2) V_3(:,1:end-2)]==2)=1;
L_3(V_3(:,1:end)==2|V_3(:,1:end)==1)=0;
L_3(1,end)=0;
L_3(1,end-1)=0;
L_car(width/10,1:long/10-1)=L;
L_car(width/10,long/10+1:end)=L_1;
L_car(width/10+1:end,long/10)=L_2';%右转路段统计
L_car(width/10-1:-1:1,long/10)=L_3';
set(H,'CData',L_car);
n1=find(L>=1);
gs1(1,i)=length(n1);
pause(0.1);
end
%end
3.小区道路开放前的三角形道路模拟:
解释:
小区开放前,及斜着的那条路不会通车,可得到其道路通车情况。
参考示意图:
4.小区道路开放后的三角形道路模拟:
解释:
小区开放后,及斜着的那条路会通车,可得到其道路通车情况。
参考示意图:
5.其它类型小区示意图(可根据上面描述及自己的创新拓展)
举例示意:
备注:最后一张图的代码非作者原创,由于时间过久,忘记代码来源。故不在贴出。
后面的三角形小区及展示图的代码均会上传到CSDN下载专区供大家下载查阅。若该贴未展示下载链接,可评论取提醒作者。