我是靠谱客的博主 无私心锁,这篇文章主要介绍matlab while两个条件_matlab实现“生命游戏”,现在分享给大家,希望可以做个参考。

在著名作家刘慈欣的科幻小说《镜子》中,人类拥有的无限运算能力的计算机。于是,人类将宇宙大爆炸的初始条件输入程序,并按照一定的规则在夸克数量级推演,最终得到了精确的镜像宇宙。

下面给大家介绍一个模拟生命演化的游戏,即1970年由英国数学家约翰提出著名的“Game of Life”。

它的演化规则较为简单,即在一个二维方格平面上,由1或者0代表一个细胞的状态,其中1代表活着,0代表嗝屁了。以一个方格为中心的九宫格内,对应着八个方格邻居,如果一个细胞周围活着的邻居的个数小于2,它就会因为孤独而死(想象一下你一个人在深山老林,肯定得被狼叼走啊);当活着的邻居数是2或者3时,这个细胞可以正常活着;如果大于3,就会因为生存空间不足而死。另外,假如一个死去的细胞周围有3个细胞,它就可以活过来。规则看似简单,却蕴含着整个生命演化的历程。接下来,将在matlab实现这个游戏,下图是截取的生命演化过程中的某个时间点的生命状态。

cff8a8070122d542aad1c0730c407f44.png

经过足够的时间后,整个生命系统会稳定下来。而且,在初始条件不变的情况下,生命系统的状态在每个时间都是固定的,最终达到一个相对稳定的动态平衡,就像《镜子》里面的宇宙镜像一样。

复制代码
1
2
3
4
5
6
7
8
9
10
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语句。让生命系统无限次循环,每循环一次,代表生命系统更新一代。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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运算中我们会根据规则更新各个方格状态,并且在图像中表示出来,然后更新图像。

以下是完整代码:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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
dc1d506e4d43b1b52aabb79b1806b825.png

本文作者:南海一号

1f48dae106f6ea3eb0feb528e06b410d.png a939f172d52280502d5115f1570052ff.png d24d169a6637e0db05c4bdf9beb60ae2.png f2649ab83397a4bdfe73bd047c11d988.png 赞赏 是一种鼓励   分享 是一种支持  留言 是一种习惯

71fe89b9879190721a3c6bb571b71d29.png

最后

以上就是无私心锁最近收集整理的关于matlab while两个条件_matlab实现“生命游戏”的全部内容,更多相关matlab内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(90)

评论列表共有 0 条评论

立即
投稿
返回
顶部