元胞自动机的道路交通模拟

  • 1.直行单行道--概率P进入研究区域道路交通模拟
  • 元胞自动机原理:
  • 直行单行道代码模拟:
  • 2.直行交叉口(含红绿灯)--概率P进入研究区域道路交通模拟
  • 交叉口原理:
  • 交叉口代码模拟:
  • 3.小区道路开放前的三角形道路模拟:
  • 解释:
  • 4.小区道路开放后的三角形道路模拟:
  • 解释:
  • 5.其它类型小区示意图(可根据上面描述及自己的创新拓展)


1.直行单行道–概率P进入研究区域道路交通模拟

元胞自动机原理:

元胞自动机(cellular automata,CA) 是一种时间、空间、状态都离散,空间相互作用和时间因果关系为局部的网格动力学模型,具有模拟复杂系统时空演化过程的能力。

直行单行道代码模拟:

车辆以一定的概率进入车道内,当车辆前后距离较近时,车速为V1。当车辆前后距离较远时,车辆为V2,V2>V1;

参考示意图:

python 基于元胞自动机的澳洲森林火灾蔓延数学建模_数学建模


下面展示一些 内联代码片

%直行进入研究区域
%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,则汽车将只会直行和左转,不会发生右转。

交叉口代码模拟:

参考示意图:

python 基于元胞自动机的澳洲森林火灾蔓延数学建模_元胞自动机_02


参考代码

%有交叉口的车辆模拟情况
%直行进入研究区域
%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.小区道路开放前的三角形道路模拟:

解释:

小区开放前,及斜着的那条路不会通车,可得到其道路通车情况。

参考示意图:

python 基于元胞自动机的澳洲森林火灾蔓延数学建模_数学建模_03

4.小区道路开放后的三角形道路模拟:

解释:

小区开放后,及斜着的那条路会通车,可得到其道路通车情况。

参考示意图:

python 基于元胞自动机的澳洲森林火灾蔓延数学建模_双缓冲_04

5.其它类型小区示意图(可根据上面描述及自己的创新拓展)

举例示意:

python 基于元胞自动机的澳洲森林火灾蔓延数学建模_双缓冲_05


python 基于元胞自动机的澳洲森林火灾蔓延数学建模_道路交通模拟_06


备注:最后一张图的代码非作者原创,由于时间过久,忘记代码来源。故不在贴出。

后面的三角形小区及展示图的代码均会上传到CSDN下载专区供大家下载查阅。若该贴未展示下载链接,可评论取提醒作者。