[Cellular Automata] Matlab Cellular Automata 결정 성장 기반 [Matlab 소스 코드 232 기간 포함]

1. 소개

1. 셀
셀은 단위라고도합니다. 또는 원시는 세포 자동 장치의 가장 기본적인 부분입니다. 셀은 개별적인 1 차원, 2 차원 또는 다차원 유클리드 격자 점에 분포되어 있습니다.
각 셀에는 상태가 있습니다. 예를 들어, 아래 중간에있는 셀의 상태는 작은 버그이고 다른 셀은 작은 버그가없는 상태입니다. 그러나 버그가 움직이면 시간이 지남에 따라 상태가 변경된 결과입니다.

여기에 사진 설명 삽입
여기에 사진 설명 삽입
육각형, 삼각형 등 많은 종류의 셀이 있습니다. 우리는 특정 문제를 구체적으로 다룰 수 있습니다
여기에 사진 설명 삽입
2. 셀 공간
셀이 분포 된 공간 메쉬 포인트 집합이 여기 셀 공간입니다.
여기에 사진 설명 삽입
3. Neighbors
1 차원 셀룰러 오토 마톤에서 반경은 일반적으로 이웃을 결정하는 데 사용되며, 셀로부터의 거리, 내부의 모든 셀은 셀의 인접 셀로 간주됩니다. 2 차원 셀룰러 오토 마톤의 인접 정의는 더 복잡하지만 일반적으로 다음과 같은 형태를 갖습니다 (가장 일반적으로 사용되는 정사각형 격자 분할을 예로 사용합니다). 아래 그림에서 검은 색 셀은 중앙 셀이고 회색 셀은 인접 셀로 다음 순간에 중앙 셀의 상태를 계산하는 데 사용됩니다.
여기에 사진 설명 삽입
즉, 다음 순간의 셀 상태는 자체 상태와 인접 셀의 상태에 의해 결정됩니다.

4. 규칙
규칙은 셀룰러 알고리즘의 품질을 결정하는 가장 중요한 포인트 중 하나입니다.
여기에 사진 설명 삽입
Cellular automata는 규칙에 따라 지역 세포 사이의 상호 작용으로 글로벌 변화를 유발합니다.

둘째, 소스 코드

% DLA
clc;clear;close all;
S=zeros(400,500); % 生成状态矩阵
S(end,:)=1; % 设置状态矩阵中最下面一行元素等于1
A=1;B=1;X=0.8;
rand('state',0); % 设置随机数的状态数
subplot(121);Ii=imshow(1-S,[]); % 显示状态矩阵
T1=title(['times = 1',', total particle=',num2str(sum(S(:)))],...
    'Fontname','times new roman','fontsize',14); % 显示时间与粒子总数
r=rand(1,500);
subplot(122);P1=plot(sum(S,2)/size(S,2),1:size(S,1),'r');% 绘制各行的密度值曲线
set(gca,'Position',[0.57,0.35,0.33,0.36],'YDir','reverse'); % 设置坐标轴属性
xlim([0,max(sum(S,2)/size(S,2))]); % 设置x轴的范围
ylabel('\ith','fontname','times new roman','fontsize',14); % y轴标注
xlabel('\it\rho','fontname','times new roman','fontsize',14); % x轴标注
title('{\it\rho} ({\ith})','fontname','times new roman','fontsize',14); % 加注图题
set(gcf,'DoubleBuffer','on'); % 设置图形窗口的渲染效果
[L1,L2]=size(S); % 返回状态矩阵的行数L1和列数L2
N=500;H=1; % 初始化参数:粒子总数N和时间参数H
h=150; % 设置截顶高度
scale=0.5; % 设置剪切系数
while N<20000;
    R1=2+round([L1-3]*rand); % 随机产生粒子的坐标
    R2=2+round([L2-4]*rand); % 随机产生粒子的坐标
    flag=0; % 控制循环停止的参数
    while R1<L1&R1>1&R2<L2&R2>1&flag==0; % 验证粒子在状态矩阵内部且粒子未被吸附
        he=S(R1,R2-1)+S(R1,R2+1)+S(R1+1,R2); % 计算左、下和右方位的近邻
        if he>0.5; % 判断近邻中有固定粒子
            S(R1,R2)=1; % 运动粒子被吸附
            flag=1; % 标记粒子已经被吸附
        else
            ra=rand; % 粒子进行随机移动的分量
            rb=rand; % 粒子进行随机移动的分量
            R1=R1+(ra>=0.5)-(ra<0.5); % 计算下一时刻粒子的位置坐标
            R2=R2+(rb>=0.5)-(rb<0.5); % 计算下一时刻粒子的位置坐标
        end
    end
    sS=sum(S,2); % 对行所有元素求和
    Se=find(sS);Se=min(Se); % 找出有粒子的最高一行   
    if Se==[size(S,1)-h]; % 判断高度是否达到截顶高度
        Sx=find(S(Se,:)); % 找出最高点粒子的横坐标
        S=cuth(S,h,Se,Sx,scale); % 切去最高点粒子所在的分支
    end
    set(Ii,'CData',1-S); % 显示状态矩阵
    N=sum(S(:)); % 计算粒子总数
    H=H+1; % 累计时间值
    set(P1,'XData',sum(S,2)/size(S,2)); % 更新密度曲线数据
    set(T1,'string',['times = ',num2str(H),', total particle=',num2str(sum(S(:)))]);% 更新时间和粒子总数
    pause(0.02); % 暂停一下,显示动画效果
end

세, 실행 결과

여기에 사진 설명 삽입

네, 비고

전체 코드 또는 QQ2449341593을 추가하기위한 글 작성 과거 리뷰
>>>>>>
[셀룰러 오토마타] 오른쪽 운전이 가능한 Matlab 셀룰러 오토마타를 기반으로 한 2 차선 트래픽 흐름 모델 [Matlab 소스 코드 231 포함]

추천

출처blog.csdn.net/TIQCmatlab/article/details/113710264