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 포함]