建网站申请,wordpress菜单横排,谷歌优化招聘,动态手机网站1.引言——生命游戏1970年#xff0c;英国数学家约翰何顿康威提出了生命游戏#xff08;Life Game#xff09;。生命游戏本质是一个元胞自动机模型#xff0c;每个元胞可以看作是一个细胞#xff0c;细胞的产生、繁衍和死亡拥有3条演化规则。1#xff0e; 如果一个细胞周…1.引言——生命游戏 1970年英国数学家约翰·何顿·康威提出了生命游戏Life Game。生命游戏本质是一个元胞自动机模型每个元胞可以看作是一个细胞细胞的产生、繁衍和死亡拥有3条演化规则。1 如果一个细胞周围有3个细胞为生一个细胞周围共有8个细胞则该细胞为生即该细胞若原先为死则转为生若原先为生则保持不变 。2 如果一个细胞周围有2个细胞为生则该细胞的生死状态保持不变3 在其它情况下该细胞为死即该细胞若原先为生则转为死若原先为死则保持不变 元胞空间在给定的初始状态下根据以上3条规则可以演化出千奇百怪的二维生命形式。在游戏的进行中杂乱无序的细胞会逐渐演化出各种精致、有形的结构这些结构往往有很好的对称性而且每一代都在变化形状。一些形状已经锁定不会逐代变化。有时一些已经成形的结构会因为一些无序细胞的“入侵”而被破坏。但是形状和秩序经常能从杂乱中产生出来。 Matlab上的生命游戏代码如下。%名称生命游戏
%作者Lu Jiancheng
clear%清除变量
clc%清屏
%创建GUI界面
hfigure(1);
set(h,Name,Life Game,Position,[500,100,600, 600]);%[左侧位置,下侧位置,宽度,高度]
axeaxes(Parent, h);
%set(axe,Box,on,Position,[50,50,300,300]);%
txtuicontrol(parent, h,Style,text, string,Life Game, fontsize,12, position,[100,750,300,25]);
runbuttonuicontrol(parent,h,Style,pushbutton,string,run,callback,runflag1;,position,[100,650,50,25]);
stopbuttonuicontrol(parent,h,Style,pushbutton,string,stop,callback,runflag0;,position,[200,650,50,25]);
stepbuttonuicontrol(parent,h,Style,pushbutton,string,step,callback,runflag0;step1;,position,[300,650,50,25]);
stepwin uicontrol(parent, h,Style,text, string,0, fontsize,12, position,[400,800,100,20]);
%生命游戏代码
%参数
Random1;%选择初始化方式
maxtime300;
p0.3;
n128;
%cellszeros(n,n);%建立一个平面矩阵
%几种特定的初始状态
%
% initial_cells[ 0 0 1;
% 1 0 1;
% 0 1 1];
% initial_cells[ 0 1 0;
% 1 1 1;
% 0 1 0];
initial_cells[0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0;0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0;1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0;0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0;0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0;0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1;0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0;0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0;0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0;1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];
if Random
%初始化部分for i1:nfor j1:nif rand()pcells(i,j)1;endendend
else %装载特殊图形%cells(10:25,10:25)initial_cells;cellsinitial_cells;%cells(49:51,49:51)initial_cells;[n,~] size(initial_cells);
end
%演化部分
picimshow(initial_cells,Parent, axe,XData,[0,100],YData,[0,100]);%绘图
t0;
runflag1;
upside0;
downside0;
leftside0;
rightside0;
step0;
while(tmaxtime)while(tmaxtime(runflag1||step1))%演化规则nextcellscells;for i1:nfor j1:n%周期性边界处理if(in)downside1;upsidei-1;elseif(i1)downsidei1;upsidei-1n;elsedownsidei1;upsidei-1;endif(jn)rightside1;leftsidej-1;elseif(j1)rightsidej1;leftsidej-1n;elserightsidej1;leftsidej-1;end%边界处理结束Sumcells(upside,leftside)cells(upside,j)cells(upside,rightside)cells(i,leftside)cells(i,rightside)cells(downside,leftside)cells(downside,j)cells(downside,rightside); if(Sum3)nextcells(i,j)1;elseif Sum~2nextcells(i,j)0;end endendcellsnextcells;%演化规则结束picimshow(cells,Parent, axe,XData,[0,100],YData,[0,100]);%绘图tt1;%时间前进1sset(stepwin,string,t)step0;pause(0.1);endpause(0.1);
end
运行这段代码随机初始化元胞空间可以看到演化过程中逐渐出现有规律的形状。当演化时间为300步时的图像2.时间反演 时间反演的原始思路是这样。假设演化时间为100 step每一步时都对元胞空间的状态进行一次快照保存下来。然后从时间步100开始一直到第1步。每次载入那一步的元胞空间如同倒放胶片一样。这样从观察者看来生命游戏中的时间就好像在倒流。 原始思路有需要保存每一时间步的演化状态才能实现时间的反转。这样将会消耗大量的内存空间。这样我们自然会想到能不能在不利用额外内存空间而只利用元胞自动机本身的元胞空间就可以实现时间反演 思路可以是这样的可以提出基于生命游戏现有的元胞演化规则的逆规则然后只要将时间步反过来进行演化就可以实现时间反演的现象。 那么存不存在逆规则呢生命游戏的逆规则可能比较难以推导甚至某些情况下是不存在的。 假设在时刻t元胞空间内只有一个细胞按照生命游戏的三条规则时刻t1元胞空间内将空无一物没有一个细胞。这样即使存在逆规则也无法实现时间反演因为任何一个空元胞都可能在上一个时刻是活细胞。3.物理系统那么存不存在逆规则呢生命游戏的逆规则可能比较难以推导甚至某些情况下是不存在的。但下面这个假设的物理系统的逆规则还是比较好推导的。该假设的物理系统是这样。1. 元胞可以看作是一个有质量的点空白表示质量为0否则质量为1。2. 质点之间存在吸引力FF的大小和质点之间的距离成反比。3. 质点存在速度决定质点的移动方向和每一时间步的移动距离。4. 作用力F会产生加速度加速度决定速度的变化方向和每一时间步的变化大小。这样一个元胞自动机系统的演化情况如下图所示。该系统内有两个质点有沿x方向的初始速度其Matlab仿真代码如下。p1[1,100]; %位置x,y)
v1[1,0]; %速度x,y)
p2[1,1]; %位置x,y)
v2[1,0]; %速度x,y)
x [1];
y1 [100] ;
y2 [1] ;
dt 1;
T [1];
V1L[0];
V2L[0];
A1L[0];
A2L[0];
for t 2:1:100F 100/(max(p1(2) - p2(2),3.0))^2;a1 F*sign(p2(2) - p1(2));a2 F*sign(p1(2) - p2(2));A1L [A1L,a1];A2L [A2L,a2];v1(2) v1(2) a1*dt;v2(2) v2(2) a2*dt;V1L [V1L,v1(2)];V2L [V2L,v2(2)];p1 p1 v1*dt;p2 p2 v2*dt;x [x,p1(1)];y1 [y1,p1(2)];y2 [y2,p2(2)];T [T,t];
end
plot(x,[y1;y2]);运行这段代码可以看到两个质点的位置随着时间的变化。在这样的一个系统里只要将时间步改为-1就可以实现时间的反演而不用采用逆规则。反演的图像如下在前100时间步正向演化在101时间步到200时间步逆向演化。 可以用以下的代码实现。dt -1;
for t 101:1:200F 100/(max(p1(2) - p2(2),3.0))^2;a1 F*sign(p2(2) - p1(2));a2 F*sign(p1(2) - p2(2));v1(2) v1(2) a1*dt;v2(2) v2(2) a2*dt;p1 p1 v1*dt;p2 p2 v2*dt;x [x,p1(1)];y1 [y1,p1(2)];y2 [y2,p2(2)];T [T,t];
End基于规则反演的图像4.结论 在元胞自动机可以实现一些物理系统实现基于逆规则的时间反演。这种逆规则甚至可以和原来的规则相同只需要改变时间步长为负值即可。而生命游戏这种系统则无法实现基于逆规则的时间反演。 基于逆规则的反演是不需要快照方式不用记录每一时间步的状态更符合真实物理实际的情形。如果这种逆规则等同于原规则我们可以认为该系统的物理规则具有时间对称性。