动态再结晶CA法模拟基础之生命游戏入门
引言:元胞自动机法在非线性问题和复杂动态系统的模拟上日趋成熟,已经成功应用于许多科学领域,在材料科学领域,元胞自动机法(CA法,下文同)在显微组织形态及演变规律的模拟上体现出了特有的优势,但是在使用CA法编写动态再结晶程序时往往会出现入门很难、周期很长的问题,由于基于CA法的动态再结晶程序的编程思想与简单的生命游戏相通,本文以生命游戏为基础手把手讲解CA法的入门基础。(对应视频讲解可在B站同名查询)
游戏规则定义
给定单元的邻居是与它在垂直,水平或对角上的8个单元。
-
如果1个单元为活的,但没有邻居单元是活的,或者仅有一个邻居单元是活的,则在下一代,此单元
会因为孤独而死亡。 -
如果1个单元周围有2个或者3个邻居单元为生,则该单元在下一代也是活的。
-
如果1个单元是死的,则在下一代,如果它刚好有3个邻居单元是活的,则此单元变成活的。
所有其它死的单元在下一代仍然是死的。 -
如果1个单元为活的,且有4个或者4个以上邻居单元是活的,则在下一代,此单元会因为拥塞而死亡。
-
所有出生和死亡都刚好在同一时间发生,则此单元的死亡有助于另一个单元的出生,但它不能通过减少拥塞而阻止其他单元的死亡;正在出生的单元也不能保护或者杀死上一代中活的单元。
规则简述为: -
当该元胞为存活状态时,周围有2-3个存活元胞,其状态为活;否则为死。
-
当该元胞为死亡状态时,周围有3个存活元胞,该元胞则复活。
1 | 2 | 3 |
---|---|---|
4 | 5 | 6 |
7 | 8 | 9 |
5表示中心元胞,1—9为其邻居。在编程时为使用矩阵表示其状态,以i表示行,j表示列,可写成如下形式。
i-1,j-1 | i-1,j | i-1,j+1 |
---|---|---|
i,j-1 | i,j | i,j+1 |
i+1,j-1 | i+1,j | i+1,j+1 |
i,j 表示中心元胞,其余为其邻居。
依此规则进行迭代变化,使单元生生死死,会得到一些有趣的结果。该游戏之所以被称为“生命游戏”,是因为其简单的游戏规则,反映了自然界中的生存规律:如果一个生命,其周围的同类生命太少的话,会因为得不到帮助而死亡;如果太多,则会因为得不到足够的资源而死亡。
MATLAB代码如下:
s=50; % 棋盘宽,棋盘是方的,即每行每列可以有100个元包自动机
w=8; % 每一个元包的像素宽度
board=zeros(w*s,s*w); %棋盘图片
state=zeros(s,s); %元包自动机的状态
newState=zeros(s,s);
%% 初始化
for i=1:s
for j=1:s
if rand<0.4 % 随机在棋盘上以0.4的生存概率设置自动机状态
state(i,j)=1; % 其实分的随机设置状态会导致非常离散的点,最后收敛时棋盘上剩下些孤立的点
end
end
end
figure;
%% 更新状态
for k=1:1000
for i=1:s
for j=1:s
% 计算邻居着活着的个数
cnt=0;
%边界上的元胞无法取其8邻居
if i-1>0&&j-1>0%左上邻居
cnt=cnt+state(i-1,j-1);
end
if i-1>0&&j+1<=s%右上邻居
cnt=cnt+state(i-1,j+1);
end
if i+1<=s&&j+1<=s%右下邻居
cnt=cnt+state(i+1,j+1);
end
if i+1<=s&&j-1>0%左下邻居
cnt=cnt+state(i+1,j-1);
end
if j-1>0%左邻居
cnt=cnt+state(i,j-1);
end
if j+1<=s%右邻居
cnt=cnt+state(i,j+1);
end
if i-1>0%上邻居
cnt=cnt+state(i-1,j);
end
if i+1<=s%下邻居
cnt=cnt+state(i+1,j);
end
% 更新状态、着色
newState(i,j)=state(i,j);
if state(i,j)==0
if cnt==3
newState(i,j)=1;
end
elseif state(i,j)==1
if cnt<2||cnt>3%0,1,4,5,6,7,8
newState(i,j)=0;
end
end
if newState(i,j)==0
board(((i-1)*w+1):i*w,((j-1)*w+1):j*w)=0;
else
board(((i-1)*w+1):i*w,((j-1)*w+1):j*w)=255;
end
end
end
state=newState;
imshow(board);
pause(0.3);
end
规则参考
https://www.cnblogs.com/cfantaisie/archive/2011/04/11/2012937.html