对元胞自动机的初步认识
元胞自动机(CA)是一种用来仿真局部规则和局部联系的方法。典型的元
胞自动机是定义在网格上的,每一个点上的网格代表一个元胞与一种有限的状
态。变化规则适用于每一个元胞并且同时进行。
元胞的变化规则&元胞状态
典型的变化规则,决定于元胞的状态,以及其( 4 或 8 )邻居的状态。
元胞自动机的应用
元胞自动机已被应用于物理模拟,生物模拟等领域。
元胞自动机的matlab编程
结合以上,我们可以理解元胞自动机仿真需要理解三点。一是元胞,在matlab中可以理解为矩阵中的一点或多点组成的方形块,一般我们用矩阵中的一点代表一个元胞。二是变化规则,元胞的变化规则决定元胞下一刻的状态。三是元胞的状态,元胞的状态是自定义的,通常是对立的状态,比如生物的存活状态或死亡状态,红灯或绿灯,该点有障碍物或者没有障碍物等等。
案例一
生命游戏是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞。一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数量。通常情况,游戏的规则就是:当一个方格周围有2或3个活细胞时,方格中的活细胞在下一个时刻继续存活;即使这个时刻方格中没有活细胞,在下一个时刻也会“诞生”活细胞。
听说许多程序猿都喜欢玩这个
规则是:
? 对周围的 8 个近邻的元胞状态求和
? 如果总和为 2 的话,则下一时刻的状态不改变
? 如果总和为 3 ,则下一时刻的状态为 1
? 否则状态= 0
元胞的邻居定义通常有以下三种范式,这里采用第二种,认为其周围八个点为邻居。
代码:
%% 设置GUI按键
plotbutton=uicontrol('style','pushbutton','string','运行', 'fontsize',12, 'position',[150,400,50,20], 'callback', 'run=1;');
erasebutton=uicontrol('style','pushbutton','string','停止','fontsize',12,'position',[250,400,50,20],'callback','freeze=1;');
quitbutton=uicontrol('style','pushbutton','string','退出','fontsize',12,'position',[350,400,50,20],'callback','stop=1;close;');
number = uicontrol('style','text','string','1','fontsize',12, 'position',[20,400,50,20]);
%% 元胞自动机设置
n=200;
%初始化各元胞状态
z = zeros(n,n);
sum = z;
cells = (rand(n,n))<.6;
% 建立图像句柄
imh = image(cat(3,cells,z,z));
set(imh, 'erasemode', 'none')
% 元胞更新的行列数设置
x = 2:n-1;
y = 2:n-1;
% 主事件循环
stop= 0; run = 0;freeze = 0;
while stop==0
if run==1
% 计算邻居存活的总数
sum(x,y) = cells(x,y-1) + cells(x,y+1) + cells(x-1, y) + cells(x+1,y)...
+ cells(x-1,y-1) + cells(x-1,y+1) + cells(x+1,y-1) + cells(x+1,y+1);
% 按照规则更新
cells = (sum==3) | (sum==2 & cells);
set(imh, 'cdata', cat(3,cells,z,z) )
stepnumber = 1 + str2double(get(number,'string'));
set(number,'string',num2str(stepnumber))
end
if freeze==1
run = 0;
freeze = 0;
end
drawnow
end
案例二
规则,先把中间点置为1,每一时间步对每一点,如果周围
八个点和为偶数,则变为0,为奇数则变为 1
% 颜色控制
Map = [1 1 1; 0 0 0];
colormap(Map);
% 设置网格大小
S = 121;
L = zeros(S);
% 把中间一个数设置为 1 作为元胞种子
M = (S+1)/2;
L(M, M) = 1;
Temp = L;
imagesc(L);
% 计算层数
Layer = (S-1)/2 + 1;
for t=2:Layer
for x=M-t+1:M+t-1
if x==M-t+1 || x==M+t-1
for y=M-t+1:M+t-1
SUM = 0;
for m=-1:1
for n=-1:1
if x+m>0 && x+m<=S && y+n>0 && y+n<=S
SUM = SUM + L(x+m, y+n);
end
end
end
SUM = SUM - L(x, y);
Temp(x, y) = mod(SUM, 2);
end
else
y = M-t+1;
SUM = 0;
for m=-1:1
for n=-1:1
if x+m>0 && x+m<=S && y+n>0 && y+n<=S
SUM = SUM + L(x+m, y+n);
end
end
end
SUM = SUM - L(x, y);
Temp(x, y) = mod(SUM, 2);
y = M+t-1;
SUM = 0;
for m=-1:1
for n=-1:1
if x+m>0 && x+m<=S && y+n>0 && y+n<=S
SUM = SUM + L(x+m, y+n);
end
end
end
SUM = SUM - L(x, y);
Temp(x, y) = mod(SUM, 2);
end
end
L = Temp;
imagesc(L);
% 速度控制
pause(0.2);
end
案例三 元胞自动机在交通流领域的模拟
第一步,先将这个函数放到matlab函数库种
function [ v, d, p ] = multi_driveway_with_crossroad_exit( nl,...
nc,dt,fp,nt,chance,chance1)
% fp:车道入口处新进入车辆的概率向量(2,3,5 车道)——输入参数
% chance:交叉口处车辆行为的概率向量(5 车道右转,3车道右转)——输入参数
%构造元胞矩阵
B=ones(nc+1+nl/2,nl+3);
%不可行车道
B(nc/2+1,[1:nl/2 nl/2+4:nl+3])=1.2;
B(nc+2:nc+1+nl/2,[1:nl/2 nl/2+4:nl+3])=1.2;
%初始化仿真元胞状态(1 为无车,0 为有车)
bb1=B([1:nc/2 nc/2+2:nc+1],:);bb2=B(:,nl/2+3);bb3=B(:,nl/2+1);
bb1(bb1~=0)=1;
bb2(bb2~=0)=1;
bb3(bb3~=0)=1;
B([1:nc/2 nc/2+2:nc+1],:)=bb1;B(:,nl/2+3)=bb2;B(:,nl/2+1)=...
bb3;B(1:nc+1,nl/2+1:nl/2+3)=1;
B(1:nc/2,end)=0;B(nc/2+2:nc+1,1)=0;B(end,nl/2+3)=0;
%显示初始交通流图
figure();
H=imshow(B,[]);
set(gcf,'position',[241 132 560 420]) ;%241 132 560 420
set(gcf,'doublebuffer','on'); %241
title('cellular-automation to traffic modeling','color','b');
%初始化化存储元胞上车辆状态的矩阵
S(1:nc*2+2,nl/2-2) = 0;
Q(1:nc*2+2,1:2) = 0;
C=zeros(nc+1,3);
%初始化换道频率、平均速度、车流密度相关变量
ad = 0;
av(1:nt) = 0;
ap(1:nt) = 0;
s = 1;flag= 0;flag1=0;%flag、flag1 用于标示小区出口的车是否为左转车辆
flag2=0;
for n = 1:nt
%六个路段的长度。
A=[
B(1:nc/2,nl/2 :-1:1);
B(nc/2+2:nc+1,1:nl/2);
B(1:nc/2,nl+3:-1:nl/2+4);
B(nc/2+2:nc+1,nl/2+4:nl+3);
B(nc+1+nl/2:-1:nc+2,nl/2+3)';
B(nc+2:1:nc+1+nl/2,nl/2+1)'
];
c=B(1:nc+1,nl/2+1:nl/2+3);
%确定前 n-2 个车辆的状态
S(:,:) = 0;
S(A(:,1:end-2)==0&A(:,2:end-1)==1&A(:,3:end)==1)=2;%快速行驶的车
S(A(:,1:end-2)==0&A(:,2:end-1)==0)=3;%停车的车
S(A(:,1:end-2)==0&A(:,2:end-1)==1&A(:,3:end)==0)=1;%慢速行驶的车
%确定最后两个元胞的状态
Q(:,:)= 0;
Q(A(:,end-1)==0&A(:,end)==0) = 3;
Q(A(:,end-1)==0&A(:,end)==1) = 1;
if c(3,1)==0
if rand<chance1
flag2=1;
c(3,1)=1;
end
end
if A(1,end)==0
Q(1,end)=1;
end
if A(4,end)==0
Q(4,end)=1;
end
if A(6,end)==0
Q(6,end)=1;
end
if rem(floor(n/50),2)==0 %此时左右向为绿灯
if A(2,end)==0
if c(nc/2+2:nc+1,1)==0
Q(2,end)=3;
else
Q(2,end)=1;
end
end
if A(3,end)==0
if c(1,3)==0
Q(3,end)=3;
else
Q(3,end)=1;
end
end
%按照既定规则行驶(5 车道右转)
if A(5,end)==0
if flag==0
if rand<chance %路口车右转
if c(nc/2+2:nc+1,:)==1
Q(5,end)=1;
else
Q(5,end)=3;
end
end
else %第一辆车为左转车,需要等待
end
end
if c(1,2)==0
if c(1,1)==1%3道口左转的思路:规避。
C(1,2)=1;
else
C(1,2)=3;
end
if c(2,1)==0
C(1,2)=3;
end
end
if c(1,3)==0
if c(1,2)==1
C(1,3)=1;
else
C(1,3)=3;
end
end
if c(3,1)==0
if c(3,2)==1
C(3,1)=1;
else
C(3,1)=3;
end
end
if c(3,2)==0
if c(3,3)==1
C(3,2)=1;
else
C(3,2)=3;
end
end
if rem(n,20)==0&&c(3,2)==0%小区出来的车还遗留在路口,特殊处理先行
if c(2,1)==1
C(3,2)=5; %特殊的等待状态(小区出来的车)
else
C(3,2)=3;
end
end
if c(2,1)==0
if A(1:nc/2,1)==0
C(2,1)=3;
else
C(2,1)=1;
end
end
if c(1,1)==0
if A(1,1)==0
C(1,1) = 3;
else
C(1,1) = 1;
end
end
if c(3,3)==0
if A(nc*3/2+1:2*nc,1)==0
C(3,3) = 3;
else
C(3,3) = 1;
end
end
else %此时小区出入向为绿灯
Q(2,end)=3;Q(3,end)=3;
if c(3,2)==0
if flag1==1
if c(2,1)==1
C(3,2)=5;flag1=0;
else
C(3,2)=3;
end
else
if c(3,3)==1
C(3,2)=1;
else
C(3,2)=3;
end
end
end
if c(2,1)==0
if A(1:nc/2,1)==1&&c(1,1)==1
C(2,1)=1;
else
C(2,1)=3;
end
end
if A(5,end)==0
if flag==0
if rand<chance
if c(nc/2+2:nc+1,:)==1
Q(5,end)=1;
else
Q(5,end)=3;
end
else
if c(nc/2+2:nc+1,1)==1&&c(nc/2+2:nc+1,2)==1
Q(5,end)=5;flag=0;flag1=1; %小区的左转前进,用以区分右转车辆
没有合适的资源?快使用搜索试试~ 我知道了~
数学建模matlab常用算法代码整理集合.rar
共64个文件
txt:28个
jpg:14个
m:8个
5星 · 超过95%的资源 需积分: 48 216 下载量 142 浏览量
2021-11-01
18:10:26
上传
评论 56
收藏 18.05MB RAR 举报
温馨提示
数学建模matlab常用算法代码整理的集合,包含神经网络图像分类代码,图论算法软件,小波神经网络预测代码,元胞自动机代码,Dijkstra算法找最短路径代码,Floyd算法求最小距离代码,GRNN的数据预测-基于广义回归神经网络货运量预测,K-means算法代码,RBF神经网络做回归预测代码,SVM分类器代码,Topsis算法综合评价代码,层次分析法代码,插值与拟合代码,多目标规划matlab程序实现,二次指数平滑及其时间序列预测代码,规划模型代码,灰色关联分析代码,灰色预测算法代码,回归预测分析MATLAB代码,聚类分析代码,蒙特卡洛算法模拟随机数代码,排队论算法代码,三次指数平滑及其时间序列预测,时间序列-滑动平均代码,数字图像处理matlab代码,图论算法代码,小波神经网络预测代码,小波特征提取算法代码,小波异常值提取代码,隐马尔可夫预测代码,元胞自动机代码演示案例,智能算法之粒子群优化算法代码,智能算法之模拟退火算法代码,智能算法之遗传算法代码,主成分分析代码,主成分分析降维代码,最小生成树MATLAB程序。
资源详情
资源评论
资源推荐
收起资源包目录
数学建模matlab常用算法代码整理集合.rar (64个子文件)
程序包
神经网络图像分类代码(可直接运行)
2.jpg 741B
8.jpg 969B
6.jpg 723B
1.jpg 765B
LiChen.m 8KB
0.jpg 686B
tm2000mask.jpg 609KB
tm2003mask.jpg 94KB
4.jpg 782B
5.jpg 726B
9.jpg 641B
Thumbs.db 25KB
10.jpg 643B
7.jpg 755B
tm2005mask.jpg 680KB
3.jpg 644B
三次指数平滑及其时间序列预测.txt 780B
小波异常值提取代码.txt 802B
主成分分析降维代码(直接调用版).doc 30KB
时间序列-滑动平均代码.txt 392B
GRNN的数据预测-基于广义回归神经网络货运量预测.rar 2.62MB
神经网络图像分类代码.txt 8KB
智能算法之粒子群优化算法代码.txt 2KB
RBF神经网络做回归预测代码.zip 1KB
插值与拟合代码.txt 1KB
《MATLAB+神经网络43个案例分析》源代码&数据.rar 11.78MB
K-means算法代码.txt 2KB
小波神经网络预测代码.zip 6KB
图论算法代码.txt 3KB
二次指数平滑及其时间序列预测代码.txt 543B
Topsis算法综合评价代码.txt 1KB
灰色关联分析代码.txt 1001B
元胞自动机代码演示案例.txt 11KB
灰色预测算法代码.txt 756B
Dijkstra算法找最短路径代码.txt 2KB
元胞自动机代码可直接运行(建议学会基本原理再用)
ts.m 340B
NaSchr.m 4KB
规划模型代码.txt 602B
多目标规划matlab程序实现.doc 254KB
时间序列-移动平均法代码.txt 419B
智能算法之模拟退火算法代码.txt 2KB
神经网络算法代码(可直接运行).txt 678B
排队论算法代码.txt 6KB
主成分分析代码.txt 3KB
SVM分类器代码.txt 7KB
小波特征提取算法代码.txt 4KB
数字图像处理matlab代码.rar 309KB
时间序列模型ARIMA的讲解与matlab代码实现(含多个实例).rar 490KB
回归预测分析MATLAB代码.txt 1KB
聚类分析代码.txt 3KB
图论算法软件
Graph.exe 1.15MB
help.chm 46KB
最小生成树MATLAB程序(直接调用版).doc 93KB
蒙特卡洛算法模拟随机数代码.txt 531B
层次分析法代码.txt 817B
Floyd算法求最小距离代码.txt 692B
隐马尔可夫预测代码(含有大量案例).zip 1.34MB
小波神经网络预测代码
cengcifenxi.m 519B
d_mymorlet.m 97B
wavenn.m 5KB
mymorlet.m 90B
traffic_flux.mat 2KB
shenjingwangluo.m 277B
智能算法之遗传算法代码.txt 6KB
共 64 条
- 1
幻梦之蝶
- 粉丝: 5
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论5