1 内容介绍
元胞自动机,也叫细胞自动机,是一种离散模型。散布在规则格网 (Lattice Grid)中的每一元胞(Cell)取有限的离散状态,遵循同样的作用规则,依据确定的局部规则作同步更新。大量元胞通过简单的相互作用而构成动态系统的演化。不同于一般的动力学模型,元胞自动机不是由严格定义的物理方程或函数确定,而是用一系列模型构造的规则构成。凡是满足这些规则的模型都可以算作是元胞自动机模型。因此,元胞自动机是一类模型的总称,或者说是一个方法框架。其特点是时间、空间、状态都离散,每个变量只取有限多个状态,且其状态改变的规则在时间和空间上都是局部的。
将所有元胞自动机的动力学行为归纳为四大类(Wolfram. S.,1986):
⑴ 平稳型:自任何初始状态开始,经过一定时间运行后,元胞空间趋于一个空间平稳的构形,这里空间平稳即指每一个元胞处于固定状态。不随时间变化而变化。
⑵ 周期型:经过一定时间运行后,元胞空间趋于一系列简单的固定结构(Stable Patterns)或周期结构(Perlodical Patterns)。由于这些结构可看作是一种滤波器(Filter),故可应用到图像处理的研究中。
⑶ 混沌型:自任何初始状态开始,经过一定时间运行后,元胞自动机表现出混沌的非周期行为,所生成的结构的统计特征不再变止,通常表现为分形分维特征。
⑷ 复杂型:出现复杂的局部结构,或者说是局部的混沌,其中有些会不断地传播。
2 仿真代码
function [] = generateGOLSettings(visible)
if ~(strcmp(visible,'on') || strcmp(visible,'off'))
disp('WRONG INPUT! SettingUIControls not generated! Check: generateGOLSettings-function');
return;
end
% get global variables
global panelSettings_h;
% set global variables
global GOLtext1_h; % text: N
global GOLtext2_h; % text: ALIVE
global GOLtext3_h; % text: PROB_MUTATION
global GOLtext4_h; % text: RANDOM_GLODERS
global GOLtext5_h; % text: PAUSE
global GOLeditbox1_h; % value: N
global GOLeditbox2_h; % value: ALIVE
global GOLeditbox3_h; % value: PROB_MUTATION
global GOLcheckbox4_h; % value: RANDOM_GLIDERS (checkbox)
global GOLeditbox5_h; % value: PAUSE
%% STATIC TEXT
% static: N
GOLtext1_h = uicontrol('Style', 'text',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'HorizontalAlignment', 'left', ...
'String', 'N. . . . . . . . . . . . . . . . . . . .', ...
'Units', 'normalized', ...
'Position', [0.05 0.75 0.9 0.16]);
% static: ALIVE
GOLtext2_h = uicontrol('Style', 'text',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'HorizontalAlignment', 'left', ...
'String', 'ALIVE. . . . . . . . . . . . . . . .', ...
'Units', 'normalized', ...
'Position', [0.05 0.65 0.9 0.16]);
% static: PROB_MUTATION
GOLtext3_h = uicontrol('Style', 'text',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'HorizontalAlignment', 'left', ...
'String', 'PROB_MUTATION. . . . . . .', ...
'Units', 'normalized', ...
'Position', [0.05 0.55 0.9 0.16]);
% static: RANDOM_GLIDERS
GOLtext4_h = uicontrol('Style', 'text',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'HorizontalAlignment', 'left', ...
'String', 'RANDOM_GLIDERS. . . . . .', ...
'Units', 'normalized', ...
'Position', [0.05 0.45 0.9 0.16]);
% static: PAUSE
GOLtext5_h = uicontrol('Style', 'text',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'HorizontalAlignment', 'left', ...
'String', 'PAUSE . . . . . . . . . . . . . . .', ...
'Units', 'normalized', ...
'Position', [0.05 0.35 0.9 0.16]);
%% INSERT VALUES (editboxes/checkbox)
% insert: N
GOLeditbox1_h = uicontrol('Style', 'edit',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'Units', 'normalized', ...
'Position', [0.70 0.85 0.25 0.08]);
% insert: ALIVE
GOLeditbox2_h = uicontrol('Style', 'edit', ...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'Units', 'normalized', ...
'Position', [0.70 0.75 0.25 0.08]);
% insert: PROB_MUTATION
GOLeditbox3_h = uicontrol('Style', 'edit',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'Units', 'normalized', ...
'Position', [0.70 0.65 0.25 0.08]);
% insert: RANDOM GLIDERS
GOLcheckbox4_h = uicontrol('Style', 'checkbox', ...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'Units', 'normalized', ...
'Position', [0.79 0.55 0.25 0.08]);
% insert: PAUSE
GOLeditbox5_h = uicontrol('Style', 'edit',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'Units', 'normalized', ...
'Position', [0.70 0.45 0.25 0.08]);
%% ADD TAGS AND CALLBACKS
GOLeditbox1_h.Tag = 'GOL.N';
GOLeditbox2_h.Tag = 'GOL.ALIVE';
GOLeditbox3_h.Tag = 'GOL.PROB_MUTATION';
GOLcheckbox4_h.Tag = 'GOL.RANDOM_GLIDERS';
GOLeditbox5_h.Tag = 'GOL.PAUSE';
GOLeditbox1_h.Callback = @edit_fun;
GOLeditbox2_h.Callback = @edit_fun;
GOLeditbox3_h.Callback = @edit_fun;
GOLcheckbox4_h.Callback = @edit_fun;
GOLeditbox5_h.Callback = @edit_fun;
end
function [] = generateMGSettings(visible)
if ~(strcmp(visible,'on') || strcmp(visible,'off'))
disp('WRONG INPUT! SettingUIControls not generated! Check: generateMGSettings-function');
return;
end
% get global variables
global panelSettings_h;
% set global variables
global MGtext1_h; % text: N
global MGtext2_h; % text: ALIVE
global MGtext3_h; % text: PROB_MUTATION
global MGtext4_h; % text: VISIBILITY
global MGtext5_h; % text: MAJ_REQUIRED
global MGtext6_h; % text: PROB_UPDATE
global MGeditbox1_h; % value: N
global MGeditbox2_h; % value: ALIVE
global MGeditbox3_h; % value: PROB_MUTATION
global MGeditbox4_h; % value: VISIBILITY
global MGeditbox5_h; % value: MAJ_REQUIRED
global MGeditbox6_h; % value: PROB_UPDATE
%% STATIC TEXT
% static: N
MGtext1_h = uicontrol('Style', 'text',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'HorizontalAlignment', 'left', ...
'String', 'N. . . . . . . . . . . . . . . . . . . .', ...
'Units', 'normalized', ...
'Position', [0.05 0.75 0.9 0.16]);
% static: ALIVE
MGtext2_h = uicontrol('Style', 'text',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'HorizontalAlignment', 'left', ...
'String', 'ALIVE . . . . . . . . . . . . . . . .', ...
'Units', 'normalized', ...
'Position', [0.05 0.65 0.9 0.16]);
% static: PROB_MUTATION
MGtext3_h = uicontrol('Style', 'text',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'HorizontalAlignment', 'left', ...
'String', 'PROB_MUTATION. . . . . . .', ...
'Units', 'normalized', ...
'Position', [0.05 0.55 0.9 0.16]);
% static: VISIBILITY
MGtext4_h = uicontrol('Style', 'text',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'HorizontalAlignment', 'left', ...
'String', 'VISIBILITY. . . . . . . . . . . . .', ...
'Units', 'normalized', ...
'Position', [0.05 0.45 0.9 0.16]);
% static: MAJ_REQUIRED
MGtext5_h = uicontrol('Style', 'text',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'HorizontalAlignment', 'left', ...
'String', 'MAJ_REQUIRED . . . . . . .', ...
'Units', 'normalized', ...
'Position', [0.05 0.35 0.9 0.16]);
% static: PROB_UPDATE
MGtext6_h = uicontrol('Style', 'text',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'HorizontalAlignment', 'left', ...
'String', 'PROB_UPDATE . . . . . . . .', ...
'Units', 'normalized', ...
'Position', [0.05 0.25 0.9 0.16]);
%% INSERT VALUES (editboxes/checkbox)
% insert: N
MGeditbox1_h = uicontrol('Style', 'edit',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'Units', 'normalized', ...
'Position', [0.70 0.85 0.25 0.08]);
% insert: ALIVE
MGeditbox2_h = uicontrol('Style', 'edit', ...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'Units', 'normalized', ...
'Position', [0.70 0.75 0.25 0.08]);
% insert: PROB_MUTATION
MGeditbox3_h = uicontrol('Style', 'edit',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'Units', 'normalized', ...
'Position', [0.70 0.65 0.25 0.08]);
% insert: VISIBILITY
MGeditbox4_h = uicontrol('Style', 'edit', ...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'Units', 'normalized', ...
'Position', [0.70 0.55 0.25 0.08]);
% insert: MAJ_REQUIRED
MGeditbox5_h = uicontrol('Style', 'edit',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'Units', 'normalized', ...
'Position', [0.7 0.45 0.25 0.08]);
% insert: PROB_UPDATE
MGeditbox6_h = uicontrol('Style', 'edit',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'Units', 'normalized', ...
'Position', [0.7 0.35 0.25 0.08]);
%% ADD TAGS AND CALLBACKS
MGeditbox1_h.Tag = 'MG.N';
MGeditbox2_h.Tag = 'MG.ALIVE';
MGeditbox3_h.Tag = 'MG.PROB_MUTATION';
MGeditbox4_h.Tag = 'MG.VISIBILITY';
MGeditbox5_h.Tag = 'MG.MAJ_REQUIRED';
MGeditbox6_h.Tag = 'MG.PROB_UPDATE';
MGeditbox1_h.Callback = @edit_fun;
MGeditbox2_h.Callback = @edit_fun;
MGeditbox3_h.Callback = @edit_fun;
MGeditbox4_h.Callback = @edit_fun;
MGeditbox5_h.Callback = @edit_fun;
MGeditbox6_h.Callback = @edit_fun;
end
function [] = generateGOLSettings(visible)
if ~(strcmp(visible,'on') || strcmp(visible,'off'))
disp('WRONG INPUT! SettingUIControls not generated! Check: generateGOLSettings-function');
return;
end
% get global variables
global panelSettings_h;
% set global variables
global GOLtext1_h; % text: N
global GOLtext2_h; % text: ALIVE
global GOLtext3_h; % text: PROB_MUTATION
global GOLtext4_h; % text: RANDOM_GLODERS
global GOLtext5_h; % text: PAUSE
global GOLeditbox1_h; % value: N
global GOLeditbox2_h; % value: ALIVE
global GOLeditbox3_h; % value: PROB_MUTATION
global GOLcheckbox4_h; % value: RANDOM_GLIDERS (checkbox)
global GOLeditbox5_h; % value: PAUSE
%% STATIC TEXT
% static: N
GOLtext1_h = uicontrol('Style', 'text',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'HorizontalAlignment', 'left', ...
'String', 'N. . . . . . . . . . . . . . . . . . . .', ...
'Units', 'normalized', ...
'Position', [0.05 0.75 0.9 0.16]);
% static: ALIVE
GOLtext2_h = uicontrol('Style', 'text',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'HorizontalAlignment', 'left', ...
'String', 'ALIVE. . . . . . . . . . . . . . . .', ...
'Units', 'normalized', ...
'Position', [0.05 0.65 0.9 0.16]);
% static: PROB_MUTATION
GOLtext3_h = uicontrol('Style', 'text',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'HorizontalAlignment', 'left', ...
'String', 'PROB_MUTATION. . . . . . .', ...
'Units', 'normalized', ...
'Position', [0.05 0.55 0.9 0.16]);
% static: RANDOM_GLIDERS
GOLtext4_h = uicontrol('Style', 'text',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'HorizontalAlignment', 'left', ...
'String', 'RANDOM_GLIDERS. . . . . .', ...
'Units', 'normalized', ...
'Position', [0.05 0.45 0.9 0.16]);
% static: PAUSE
GOLtext5_h = uicontrol('Style', 'text',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'HorizontalAlignment', 'left', ...
'String', 'PAUSE . . . . . . . . . . . . . . .', ...
'Units', 'normalized', ...
'Position', [0.05 0.35 0.9 0.16]);
%% INSERT VALUES (editboxes/checkbox)
% insert: N
GOLeditbox1_h = uicontrol('Style', 'edit',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'Units', 'normalized', ...
'Position', [0.70 0.85 0.25 0.08]);
% insert: ALIVE
GOLeditbox2_h = uicontrol('Style', 'edit', ...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'Units', 'normalized', ...
'Position', [0.70 0.75 0.25 0.08]);
% insert: PROB_MUTATION
GOLeditbox3_h = uicontrol('Style', 'edit',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'Units', 'normalized', ...
'Position', [0.70 0.65 0.25 0.08]);
% insert: RANDOM GLIDERS
GOLcheckbox4_h = uicontrol('Style', 'checkbox', ...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'Units', 'normalized', ...
'Position', [0.79 0.55 0.25 0.08]);
% insert: PAUSE
GOLeditbox5_h = uicontrol('Style', 'edit',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'Units', 'normalized', ...
'Position', [0.70 0.45 0.25 0.08]);
%% ADD TAGS AND CALLBACKS
GOLeditbox1_h.Tag = 'GOL.N';
GOLeditbox2_h.Tag = 'GOL.ALIVE';
GOLeditbox3_h.Tag = 'GOL.PROB_MUTATION';
GOLcheckbox4_h.Tag = 'GOL.RANDOM_GLIDERS';
GOLeditbox5_h.Tag = 'GOL.PAUSE';
GOLeditbox1_h.Callback = @edit_fun;
GOLeditbox2_h.Callback = @edit_fun;
GOLeditbox3_h.Callback = @edit_fun;
GOLcheckbox4_h.Callback = @edit_fun;
GOLeditbox5_h.Callback = @edit_fun;
end
function [] = generateMGSettings(visible)
if ~(strcmp(visible,'on') || strcmp(visible,'off'))
disp('WRONG INPUT! SettingUIControls not generated! Check: generateMGSettings-function');
return;
end
% get global variables
global panelSettings_h;
% set global variables
global MGtext1_h; % text: N
global MGtext2_h; % text: ALIVE
global MGtext3_h; % text: PROB_MUTATION
global MGtext4_h; % text: VISIBILITY
global MGtext5_h; % text: MAJ_REQUIRED
global MGtext6_h; % text: PROB_UPDATE
global MGeditbox1_h; % value: N
global MGeditbox2_h; % value: ALIVE
global MGeditbox3_h; % value: PROB_MUTATION
global MGeditbox4_h; % value: VISIBILITY
global MGeditbox5_h; % value: MAJ_REQUIRED
global MGeditbox6_h; % value: PROB_UPDATE
%% STATIC TEXT
% static: N
MGtext1_h = uicontrol('Style', 'text',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'HorizontalAlignment', 'left', ...
'String', 'N. . . . . . . . . . . . . . . . . . . .', ...
'Units', 'normalized', ...
'Position', [0.05 0.75 0.9 0.16]);
% static: ALIVE
MGtext2_h = uicontrol('Style', 'text',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'HorizontalAlignment', 'left', ...
'String', 'ALIVE . . . . . . . . . . . . . . . .', ...
'Units', 'normalized', ...
'Position', [0.05 0.65 0.9 0.16]);
% static: PROB_MUTATION
MGtext3_h = uicontrol('Style', 'text',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'HorizontalAlignment', 'left', ...
'String', 'PROB_MUTATION. . . . . . .', ...
'Units', 'normalized', ...
'Position', [0.05 0.55 0.9 0.16]);
% static: VISIBILITY
MGtext4_h = uicontrol('Style', 'text',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'HorizontalAlignment', 'left', ...
'String', 'VISIBILITY. . . . . . . . . . . . .', ...
'Units', 'normalized', ...
'Position', [0.05 0.45 0.9 0.16]);
% static: MAJ_REQUIRED
MGtext5_h = uicontrol('Style', 'text',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'HorizontalAlignment', 'left', ...
'String', 'MAJ_REQUIRED . . . . . . .', ...
'Units', 'normalized', ...
'Position', [0.05 0.35 0.9 0.16]);
% static: PROB_UPDATE
MGtext6_h = uicontrol('Style', 'text',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'HorizontalAlignment', 'left', ...
'String', 'PROB_UPDATE . . . . . . . .', ...
'Units', 'normalized', ...
'Position', [0.05 0.25 0.9 0.16]);
%% INSERT VALUES (editboxes/checkbox)
% insert: N
MGeditbox1_h = uicontrol('Style', 'edit',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'Units', 'normalized', ...
'Position', [0.70 0.85 0.25 0.08]);
% insert: ALIVE
MGeditbox2_h = uicontrol('Style', 'edit', ...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'Units', 'normalized', ...
'Position', [0.70 0.75 0.25 0.08]);
% insert: PROB_MUTATION
MGeditbox3_h = uicontrol('Style', 'edit',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'Units', 'normalized', ...
'Position', [0.70 0.65 0.25 0.08]);
% insert: VISIBILITY
MGeditbox4_h = uicontrol('Style', 'edit', ...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'Units', 'normalized', ...
'Position', [0.70 0.55 0.25 0.08]);
% insert: MAJ_REQUIRED
MGeditbox5_h = uicontrol('Style', 'edit',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'Units', 'normalized', ...
'Position', [0.7 0.45 0.25 0.08]);
% insert: PROB_UPDATE
MGeditbox6_h = uicontrol('Style', 'edit',...
'Parent', panelSettings_h, ...
'Visible', visible, ...
'Units', 'normalized', ...
'Position', [0.7 0.35 0.25 0.08]);
%% ADD TAGS AND CALLBACKS
MGeditbox1_h.Tag = 'MG.N';
MGeditbox2_h.Tag = 'MG.ALIVE';
MGeditbox3_h.Tag = 'MG.PROB_MUTATION';
MGeditbox4_h.Tag = 'MG.VISIBILITY';
MGeditbox5_h.Tag = 'MG.MAJ_REQUIRED';
MGeditbox6_h.Tag = 'MG.PROB_UPDATE';
MGeditbox1_h.Callback = @edit_fun;
MGeditbox2_h.Callback = @edit_fun;
MGeditbox3_h.Callback = @edit_fun;
MGeditbox4_h.Callback = @edit_fun;
MGeditbox5_h.Callback = @edit_fun;
MGeditbox6_h.Callback = @edit_fun;
end
3 运行结果
4 参考文献
[1]张晓玲, 王文平, 陈森发,等. 基于元胞自动机的知识型企业生命体健康演化模拟[J]. 系统管理学报, 2007, 16(1):6.
[2]郭良杰, and 赵云胜. "基于元胞自动机模型的人员疏散行为模拟." 安全与环境工程 21.4(2014):6.
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。