概述
在著名作家刘慈欣的科幻小说《镜子》中,人类拥有的无限运算能力的计算机。于是,人类将宇宙大爆炸的初始条件输入程序,并按照一定的规则在夸克数量级推演,最终得到了精确的镜像宇宙。
下面给大家介绍一个模拟生命演化的游戏,即1970年由英国数学家约翰提出著名的“Game of Life”。
它的演化规则较为简单,即在一个二维方格平面上,由1或者0代表一个细胞的状态,其中1代表活着,0代表嗝屁了。以一个方格为中心的九宫格内,对应着八个方格邻居,如果一个细胞周围活着的邻居的个数小于2,它就会因为孤独而死(想象一下你一个人在深山老林,肯定得被狼叼走啊);当活着的邻居数是2或者3时,这个细胞可以正常活着;如果大于3,就会因为生存空间不足而死。另外,假如一个死去的细胞周围有3个细胞,它就可以活过来。规则看似简单,却蕴含着整个生命演化的历程。接下来,将在matlab实现这个游戏,下图是截取的生命演化过程中的某个时间点的生命状态。
经过足够的时间后,整个生命系统会稳定下来。而且,在初始条件不变的情况下,生命系统的状态在每个时间都是固定的,最终达到一个相对稳定的动态平衡,就像《镜子》里面的宇宙镜像一样。
width=80;
cell=5;
screen=zeros(cell*width,width*cell);
state=zeros(width,width);
%初始状态假设都为死的now_state=zeros(width,width);%初始化细胞状态,假设由40%的细胞活着for i=1:width
for j=1:width
if rand<0.4
state(i,j)=1;
end
endend
以上代码是初始化细胞的状态,一个零矩阵代表所有的细胞都是死的。后面两个for循环让一定比例的细胞活过来,这些活过来的细胞就是初始条件。其他迭代产生的细胞都是这些细胞的后代。
在后面的计算中,用到了一个While语句。让生命系统无限次循环,每循环一次,代表生命系统更新一代。
s1=0;
if i-1>0&&j-1>0
s1=s1+state(i-1,j-1);
end
if i-1>0&&j+1<=width
s1=s1+state(i-1,j+1);
end
if i+1<=width&&j+1<=width
s1=s1+state(i+1,j+1);
end
if i+1<=width&&j-1>0
s1=s1+state(i+1,j-1);
end
if j-1>0
s1=s1+state(i,j-1);
end
if j+1<=width
s1=s1+state(i,j+1);
end
if i-1>0
s1=s1+state(i-1,j);
end
if i+1<=width
s1=s1+state(i+1,j); end
这些语句作用是统计一个方格周围有多少活着的细胞,两个for循环可以统计所有的方格周围情况。这样,所有的方格周围的活细胞数量都表示出来了。在整个while运算中我们会根据规则更新各个方格状态,并且在图像中表示出来,然后更新图像。
以下是完整代码:
width=80;
cell=5;
screen=zeros(cell*width,width*cell);
state=zeros(width,width);
%初始状态假设都为死的now_state=zeros(width,width);%初始化细胞状态,假设由40%的细胞活着for i=1:width
for j=1:width
if rand<0.4
state(i,j)=1;
end
endendfigure;while true
for i=1:width
for j=1:width
%
计算这个细胞还有几个活着的邻居
s1=0;
if i-1>0&&j-1>0
s1=s1+state(i-1,j-1);
end
if i-1>0&&j+1<=width
s1=s1+state(i-1,j+1);
end
if i+1<=width&&j+1<=width
s1=s1+state(i+1,j+1);
end
if i+1<=width&&j-1>0
s1=s1+state(i+1,j-1);
end
if j-1>0
s1=s1+state(i,j-1);
end
if j+1<=width
s1=s1+state(i,j+1);
end
if i-1>0
s1=s1+state(i-1,j);
end
if i+1<=width
s1=s1+state(i+1,j); end
now_state(i,j)=state(i,j);
if state(i,j)==0
if s1==3
now_state(i,j)=1;
end
elseif state(i,j)==1
if s1<2||s1>3
now_state(i,j)=0;
end end
if now_state(i,j)==0
screen(((i-1)*cell+1):i*cell,((j-1)*cell+1):j*cell)=0;
else
screen(((i-1)*cell+1):i*cell,((j-1)*cell+1):j*cell)=150;
end
end end
state=now_state;
imshow(screen);
title('生命游戏');end
本文作者:南海一号
赞赏 是一种鼓励 分享 是一种支持 留言 是一种习惯最后
以上就是无私心锁为你收集整理的matlab while两个条件_matlab实现“生命游戏”的全部内容,希望文章能够帮你解决matlab while两个条件_matlab实现“生命游戏”所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复