元胞自动机基于二维元胞自动机规则模拟交通流matlab 源码

Posted Matlab咨询QQ1575304183

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了元胞自动机基于二维元胞自动机规则模拟交通流matlab 源码相关的知识,希望对你有一定的参考价值。

一、简介

元胞自动机(CA)是一种用来仿真局部规则和局部联系的方法。典型的元胞自动机是定义在网格上的,每一个点上的网格代表一个元胞与一种有限的状态。变化规则适用于每一个元胞并且同时进行。典型的变化规则,决定于元胞的状态,以及其( 4 或 8 )邻居的状态。
1 对元胞自动机的初步认识
元胞自动机(CA)是一种用来仿真局部规则和局部联系的方法。典型的元
胞自动机是定义在网格上的,每一个点上的网格代表一个元胞与一种有限的状
态。变化规则适用于每一个元胞并且同时进行。
2 元胞的变化规则&元胞状态
典型的变化规则,决定于元胞的状态,以及其( 4 或 8 )邻居的状态。
3 元胞自动机的应用
元胞自动机已被应用于物理模拟,生物模拟等领域。
4 元胞自动机的matlab编程
结合以上,我们可以理解元胞自动机仿真需要理解三点。一是元胞,在matlab中可以理解为矩阵中的一点或多点组成的方形块,一般我们用矩阵中的一点代表一个元胞。二是变化规则,元胞的变化规则决定元胞下一刻的状态。三是元胞的状态,元胞的状态是自定义的,通常是对立的状态,比如生物的存活状态或死亡状态,红灯或绿灯,该点有障碍物或者没有障碍物等等。

二、源代码

%% lzu
close all ; clear all ;clc
 
a=rand(200,50);                                  %生成元胞自动机的大小(200,50)200行50列
m=find(a<0.1); n=find(a>0.9);                  %向上,向下的各占10%
aa=zeros(size(a));aa(m)=1;up=aa;
bb=zeros(size(a));bb(n)=3;down=bb;               %初始化元胞  up,down
clear a* m n bb
% 生成 up down
N=nnz(up)+nnz(down);
 
 
%%  循环开始的地方
for t=1:10000
 
up1=[up(2:end,:);up(1,:)];                       %向上走的向上一步,探探前面有没有路  %向下走的不动
c=up+down;
jud=up1+down;
%% 找出相碰处的两种表示
w_z1=find(jud==4);w_z1=w_z1';                                      % 一维位置(都是先下的所在)
[w_zx1,w_zy1]=find(jud==4);a=[w_zx1,w_zy1]';w_zx=w_zx1';w_zy=w_zy1';
%w_z2=[w_zx;w_zy];
clear w_zx1 w_zy1 a                                                % 二维位置
%% 找出相碰的人后面的粒子数
down_z_g=zeros(size(down));
for i=1:length(w_z1)
    d_b(i)=0;
    x=cutx(w_zx(i));y=w_zy(i);
    down_z_g(andx(x),y)=3;
    while down(x,y)==3
        down_z_g(x,y)=3;
        d_b(i)=d_b(i)+1;
        x=cutx(x);
    end
end
clear x y i
up_z_g=zeros(size(up));
for i=1:length(w_z1)
    u_b(i)=0;
    x=andx(andx(w_zx(i)));y=w_zy(i);
    up_z_g(cutx(x),y)=1;
    while up(x,y)==1
        up_z_g(x,y)=1;
        u_b(i)=u_b(i)+1;
        x=andx(x);
    end
end
clear x y i
% u_b  向下走的后面跟的个数
% d_b  向上走的后面跟的个数
%[w_z1;w_zx; w_zy ;u_b ;d_b]
%% 找出拐的那串粒子
%% 找出直走的(不包含相碰的后面跟的)
down_d=down;
for i=1:length(w_z1)
    x=w_zx(i);y=w_zy(i);
    for j=0:d_b(i)
        down_d(x,y)=0;
        x=cutx(x);
    end
end                                                 % down_d (down_directly)直接向下走的粒子
clear x y i j
up_d=up;
for i=1:length(w_z1)
    x=andx(w_zx(i));y=w_zy(i);
    for j=0:u_b(i)
        up_d(x,y)=0;
        x=andx(x);
    end
end                                                  % up_d (up_directly)直接向上走的粒子
clear x y i j
%f=nnz(up_d)+length(w_zx)+sum(u_b)-nnz(up)
%g=nnz(down_d)+length(w_zy)+sum(d_b)-nnz(down)
%end
a_down_d=[down_d(end,:);down_d(1:end-1,:)];               % alread_down_directly
a_up_d=[up_d(2:end,:);up_d(1,:)];                           % alread_down_directly(是假的还要考虑碰头的中间隔一个得情况)
%% 两个粒子对头时中间空一个(定义往下走的占了这个空格)
judge=a_down_d+a_up_d;
[ww_zx,ww_zy]=find(judge==4);
for i=1:length(ww_zx)
    x=ww_zx(i);y=ww_zy(i);
    judge(x,y)=3;
    x=andx(x);
    while judge(x,y)==1
        x=andx(x);
    end
    judge(x,y)=1;
end
clear i
% judge 里面存放的是 alread 走了的粒子(上下粒子都走了一步)
r_down_d=zeros(size(down)); r_down_d(find(judge==3))=3;      % r_down_d 里面放的是真的直走|了|的
r_up_d=zeros(size(up)); r_up_d(find(judge==1))=1;
%pp=nnz(find(judge==3))+nnz(find(judge==1))-nnz(judge);
%% 找出拐弯的(也包含它后面跟的)(把拐的写进去)
%% 先做向下
n=0;      %拐的串中直走的
down_g=zeros(size(down));
for i=1:length(w_z1)
    x=w_zx(i);y=w_zy(i);
    up_z_gg=up_z_g; up_z_gg(:,y)=0;
    down_z_gg=down_z_g; down_z_gg(:,y)=0;
    for j=0:d_b(i)
        cc=judge+down_g+up_z_gg+down_z_gg;
        if j==0             
            if y>=2&&y<=49&&cc(x,y+1)==0&&cc(x,y-1)==0&&cc(cutx(x),y-1)==0&&cc(cutx(x),y+1)==0                 
                down_g(x,y+randint*2-1)=3;
            elseif y>=2&&y<=49&&cc(x,y+1)==0&&cc(cutx(x),y+1)==0
                down_g(x,y+1)=3;
            elseif y>=2&&y<=49&&cc(x,y-1)==0&&cc(cutx(x),y-1)==0
                down_g(x,y-1)=3;
            elseif y==1&&cc(x,y+1)==0&&cc(cutx(x),y+1)==0
                down_g(x,y+1)=3;      
            elseif y==50&&cc(x,y-1)==0&&cc(cutx(x),y-1)==0 
                down_g(x,y-1)=3;             
            else
                down_g(x,y)=3;
            end
        end
        

三、运行结果

在这里插入图片描述

四、备注

完整代码或者仿真咨询添加QQ1575304183

以上是关于元胞自动机基于二维元胞自动机规则模拟交通流matlab 源码的主要内容,如果未能解决你的问题,请参考以下文章

元胞自动机基于元胞自动机模拟双车道交通流模型含靠右行驶matlab源码

元胞自动机基于元胞自动机模拟交通事故道路通行量matlab源码

元胞自动机基于matlab元胞自动机交通流模拟仿真含Matlab源码 1252期

元胞自动机基于matlab元胞自动机模拟交通事故道路通行量含Matlab源码 356期

元胞自动机基于matlab元胞自动机模拟交通路况(含超车)含Matlab源码 2389期

元胞自动机基于matlab元胞自动机单车道交通流(时空图)含Matlab源码 1681期