| 第13行: |
第13行: |
| | | | |
| | [[File:屏幕快照 2015-12-11 16.01.02.png]] | | [[File:屏幕快照 2015-12-11 16.01.02.png]] |
| | + | |
| | + | 这里黑色表示的是窗户,灰色是窗户之间的隔断。为什么窗户是黑色的?太难看了吧?哦,这是晚上,而且屋子里都没有开灯。没关系,反正大楼里面住的都是自己的朋友,你可以让一些人把灯打开,下面的图表示的是有些屋子亮灯的图案(好看多了): |
| | + | |
| | + | [[File:屏幕快照 2015-12-11 16.01.08.png|屏幕快照 2015-12-11 16.01.08.png]] |
| | + | |
| | + | 聪明的人已经想到了,其实这就是一个简单的霓虹灯!我们可以让不同的窗户开灯来组成不同的图案。比如要想用这种方法组合出一个“十”字图案,我们可以让第7列的窗户都开灯,并让第13行的窗户也都开灯 |
| | + | |
| | + | [[File:屏幕快照 2015-12-11 16.04.02.png|屏幕快照 2015-12-11 16.04.02.png]] |
| | + | |
| | + | 如果是复杂点的图案呢?我们仍然可以如法炮制,不过麻烦了点,因为你需要告诉这幢大楼里的每一个同学是开灯还是关灯。 |
| | + | |
| | + | 如果要让霓虹灯图案动起来呢?比如每1秒钟就变换一下图案,那么你就需要给每个朋友编制一些指令,告诉他们在什么时刻是开灯还是关灯。我们不妨用0表示关灯,用1表示开灯,那么比如指令011011001指派给了住在第三行第4列的朋友,那么他应该在第1秒内关灯,在第二秒、第三秒都开灯,第四秒关...。汗,这恐怕太麻烦了,你算算,如果要展示一个10分钟的动画(600秒)那就需要为每个窗户后面的朋友编制长度600的指令。何况很可能这里有100扇窗户呢! |
| | + | |
| | + | 如果你够聪明,可以换一种方法来制作你的大楼霓虹灯动画。让居住在大楼里面的每个朋友密切观察他的邻居,根据上一秒内他邻居的开灯状况决定下一秒内该朋友的动作。显然每个窗户后的朋友都会有上、下、左、右、左上、右上、左下、右下八个邻居(如下图),那么每个人的开灯状态就会被他的邻居们以及他自己的上一时刻的开灯状态所影响,并且翻过来这位朋友是否开灯又会影响他的邻居们,整个大楼的各个窗户就会不停的闪烁,这也能达到动画的效果了。 |
| | + | |
| | + | [[File:屏幕快照 2015-12-11 23.06.21.png|一个窗户和它的八个邻居,分别是左上、上、右上、左、右、左下、右下]] |
| | + | |
| | + | 具体邻居的开灯与否如何影响该朋友是否开灯呢?这仍然需要我们为该朋友定义规则,比如“只有当八个邻居的灯都亮了我才能开灯”,这就是一条规则,“只要我这个时刻亮着灯,那么下一时刻无论邻居们什么情况我仍然亮灯”也是一条规则......另外,还有一个初始状态的问题,也就是在一开始第一秒内哪些窗户应该开灯,那些应该关灯呢?我们完全可以让窗户后面的每个朋友自己随便决定,也就是初始时刻窗户的开灯状态是随机的。 |
| | + | |
| | + | == 生命游戏 == |
| | + | |
| | + | 好了,上面基本讲清楚了大楼霓虹灯的工作原理了,下面我们开始设计一个切实的动画。按照刚才讲到的聪明的霓虹灯动画设计方法,我们为每个窗户后面的朋友设计规则如下: |
| | + | |
| | + | * 规则1.如果我现在开着灯,只要八个邻居中有2个或者3个人开灯了,那么下一时刻我才开灯,否则邻居亮灯数超过3个或者少于2个,我都会把灯关掉; |
| | + | * 规则2:如果我现在关着灯,那么当邻居中有3个人开灯,那么下一个时刻我就把灯打开。比如某个窗户和他邻居窗户的开灯状态如下图示: |
| | + | |
| | + | [[File:cellularautomatagameoflifeslider.jpg|cellularautomatagameoflifeslider.jpg]] |
| | + | |
| | + | 其中中心位置的窗户为你所在的窗户(也就是图中的4号),在这个时刻,你观察旁边的八个邻居中有左上、右上、下三个窗户是亮灯的,那么按照规则2,你在下一个时刻应该把灯打开。这样,每个窗户后面的朋友都按照这两条规则行事,比如左上方1号这个邻居下一个时刻是否应该开灯呢?那么我们就应该考察这个窗户的8个邻居,以1号窗户为中心的9个方格如下图: |
| | + | |
| | + | [[File: 屏幕快照 2015-12-11 23.09.16.jpg|屏幕快照 2015-12-11 23.09.16.jpg]] |
| | + | |
| | + | 那么根据规则1,下个时刻应该继续开着灯。注意,这个图中的右下部分标有1、2、3、4的4个窗户与上图中左上角标有1、2、3、4的4个窗户的开灯状态是一样的。他们都是同样的4个窗户。这样,当我们用同样的规则考虑大楼中所有的窗户的时候,整体大楼的动画就可以产生了。我们以一个随机的初始状态开始,根据那两条规则会产生什么样的大楼霓虹灯动画呢?让我们把镜头拉远,观察整个大楼:哇,一个奇妙的动画诞生了。下面是两张动画的截图(由50行50列窗户构成的大楼): |
| | + | |
| | + | [[File:屏幕快照 2015-12-11 23.10.13.png|屏幕快照 2015-12-11 23.10.13.png]] |
| | + | |
| | + | 很怪异不是么?如果你看到能够运动的动画你会感觉更怪异,整个大楼的窗户就像沸腾了。实际上,我们可以把整个大楼霓虹灯游戏做在电脑里,让电脑程序代替那些居住在大楼里,不停机械的开灯关灯来完成你设计的无聊动画的可怜的朋友们。你可以到以下网址观看程序:gameoflife/。在程序中,方格就代表窗户,黄色的格子就是亮灯的窗户,黑色的就是关灯的。你会发现,整个电脑屏幕像煮开了一样,不停的有方格变成黄色,也有方格变成黑色,而由这些亮方格构成的图案是五花八门,奇形怪状,看这是几个截图: |
| | + | |
| | + | [[File:屏幕快照 2015-12-11 23.10.58.png|屏幕快照 2015-12-11 23.10.58.png]] |
| | + | |
| | + | 这些图案有风筝、蝴蝶、桃心。如果观察动态结果,你会发现不可思议的东西还更多。首先,你会发现一种被人们称作“滑翔机”的结构,他是由几个格子构成的一个动态的结构,随着时间的推移,他会从屏幕的一段走到另一端,下面是“滑翔机”行走的原理: |
| | + | |
| | + | [[File:屏幕快照 2015-12-11 23.12.12.png|屏幕快照 2015-12-11 23.12.12.png]] |
| | + | |
| | + | 12345在5步内,“滑翔机”结构往右下方行走了一个格子。你可以看到,在第五步内黄色亮点组成的结构与第一步的结构完全一样,只不过位置完全平移了。“滑翔机”会偶尔在屏幕的一个角落里闪现出来,步态缓慢的移动到另一角,就好像一个悠闲的散步者,在楼宇的窗户间移动着。值得注意的是,你可以推敲一下,“滑翔机”的每一步移动都完全符合我们上面定义的两条动画规则。<br /> |
| | + | |
| | + | 我们的游戏还有其他的壮观景象:看这边由多个亮窗子构成的两个“村落”分处于大楼的角落彼此没有来往,然而一个“村落”发射了一个“滑翔机”对另一个“村落”展开了进攻,而另一个“村落”则由于这个“滑翔机”的到来被打破了原先的寂静开始沸腾起来。偶尔你会看到一个村落逐渐变大、分化成两个部分分别进行繁衍......,这里的语言不能穷尽这个游戏的所有可能情况。该游戏有一个好听的别名:“生命游戏”,这是由计算机科学家Johnconway在上个世纪50年代发明的。为什么叫做“生命游戏”呢?其实你不妨大胆运用你的想象力,认为这个游戏创造了一个“活生生的”宇宙。也就是说你和你的朋友们遵循简单的规则产生的集体楼宇霓虹灯动画创造了一个宇宙,这个宇宙就镶嵌在你们的楼宇的窗户之间。该宇宙按照自己的规律不断演化着。我们可以把闪亮的格子看作是这个虚拟宇宙中的生命体,这样,它们不停的演化、繁殖、灭亡。 |
| | + | |
| | + | == 从霓虹灯到方格宇宙 == |
| | + | 这一切又意味着什么呢?从霓虹灯的例子中我们体会到了系统的深层含义。什么是系统?由多个部分组成的整体就是一个系统,上面提到的霓虹灯的例子就是一个系统,它是由多个小灯泡的组合形成的一个霓虹灯整体;人类社会也是一个系统,各种各样的人构成了这个系统;“生命游戏”也是一个系统,多个方格格子组成了它。仅仅了解系统的部分并不能了解整个系统。这就好像你能很清楚的了解到每个单独灯泡的闪烁状态并不能帮助你理解多个小灯泡构成的霓虹灯图案如何的道理一样。要想知道霓虹灯整体的图案,你必须要“跳出来”,也就是站在一个更高的角度来观察这个霓虹灯的整体,而忽略每一个具体灯泡的细节。我们常说的只见树木不见森林正是揭露了观察系统的时候太重视局部而忽略整体的这个弊端。 |
| | + | |
| | + | 我们学到的科学方法一直在运用分解、还原的方法。比如要研究一台电视机,我们就需要把这台电视机拆开,看看每一个部件的工作机理,这显然是有效的,但是正如你仅仅有一大堆电子元件而不会正确的组合它们就不能组装一台电视机一样,单纯运用分解还原的老方法是不能够理解系统。这又是为什么呢?原因是系统的特性一方面体现在组成部分的性质上,而更多的则取决于系统各个部分的相互之间的关系上。正是由于系统中各部分的相互关系的复杂性才导致了系统的复杂性和不可理解性。观察下面的图: |
| | + | |
| | + | [[File:屏幕快照 2015-12-11 23.13.33.png|屏幕快照 2015-12-11 23.13.33.png]] |
| | + | |
| | + | 我们可以认为多个蓝色的点构成了一个系统,而每个点之间的连线就是系统组成部分之间的联系。为什么系统很难理解呢?原因是点之间的连线太复杂了。假如一个系统由n个点组成,那么所有可能的点之间的连线关系就有2<sup>(n-1)(n-2)/2</sup>种情况,比如n=100,那么连线的可能性就是24851,不用算了,这个数字已经远远超过了当前的宇宙年龄。我们之所以对系统概念感到很难理解正是由于系统组成部分之间关系的复杂性。而当我们用还原的方法研究系统的时候,也就是要研究系统中单个点的性质,我们就必须切断该点与其他点的联系,这当然方便我们研究该点,但是当切断它与其它点的联系的时候,我们已经严重破坏了系统的性质,看不到了系统各部分之间的联系了。在霓虹灯的例子中,当我们把目光集中到单个灯泡上的时候,我们就是采用还原分解的方法把注意力集中到了一个点,而没有看到该灯泡与其它灯泡之间的联系,所以我们不能够清楚整体霓虹灯的图案与动画。 |
| | + | |
| | + | 好了,到这里如果你已经完全理解或者隐约理解了上面所讲的系统概念,那么你已经取得了一个重大的进步。下面我们再来看看系统的另外一个性质。我们都知道计算机是由硬件和软件组成的。什么是硬件什么又是软件呢?运用我们刚刚熟悉的系统的概念不难回答,广义上来讲构成系统的各个单点就是硬件,而点与点之间的连线关系以及这些关系的变化就是软件。比如一台计算机系统的硬件部分是由CPU、内存、硬盘、显示器、键盘鼠标等等部分组成,那么软件就是运用这些硬件的一种组合方法。比如Word程序这个软件就是把键盘输入的信息经过CPU和内存的处理显示到显示器上,这整个过程就是一个软件。当然我们这里的叙述忽略了很多技术细节,而仅仅在概念形式上进行讨论。我们知道硬件构成了软件的基础,显然你没有硬盘、内存、CPU这些硬件是不可能执行任何软件程序的,但反过来,软件又是独立于硬件的某种特有的东西。因此你在一台PIII的机器上运行Word程序和在另一台PII上运行该程序一样(除了速度不同)。 |
| | + | |
| | + | 知道了硬件与软件之间的关系有什么用处呢?它可以帮助我们解答关于生命、智能、社会等等难以理解的复杂事物。比如上面介绍的“生命游戏”就是一个很好的例子。因为整个游戏的过程就是一个软件,这个软件无论运行在何种硬件介质中都是无关紧要的。所以我们用大楼窗户的开灯与关灯可以完成“生命游戏”,而运用电脑屏幕中的闪烁的方格也可以来完成该游戏。显然,我们现实的生命过程要远远比生命游戏复杂得多,然而它也很有可能是一种软件的过程,而与运行该软件的硬件没有关系。同样的,人类的智能也是一种复杂的软件过程,用人类的头脑能够完成的思维智能过程也同样能在另一种介质:计算机中实现。这也正是“人工智能”的理论来源。 |
| | + | |
| | + | 进一步,我们可以大胆设想:把整个宇宙都理解为一种运算的软件过程,这样,完成该运算过程的硬件介质是无关紧要的,而关键是软件过程。在“生命游戏”中,我们正是创造了一种宇宙演化的过程。在游戏中,不同的方格可以理解为抽象的宇宙空间,而程序运行的嘀嗒声正是这个虚拟宇宙中的时间。 |
| | + | |
| | + | 在“生命游戏”中,我们规定了每个格子的运行规则而得出了一个虚拟的宇宙,如果我们设计其他不同的规则会得到什么样的宇宙呢?进一步的,在大楼霓虹灯的比喻中,如果我们允许每个窗户里面灯的颜色有多种,每个窗户的邻居窗户不仅仅是8个,而可以是24个或者48个能演化出什么样的宇宙呢?更进一步设想,如果我们运行的游戏是在一个三维空间中或者四维空间中又是什么样的呢?所有这一系列的问题几乎可以写成一本教科书了,当然这本教科书中并不教我们牛顿定律,而是一套关于我们自己的虚拟宇宙的物理学知识。我们为什么一定要学习这个宇宙的科学?难道我们不能自己作上帝创造一个全新的宇宙么?嗯,我们就把我们的宇宙叫做“方格宇宙”吧,下面就来看看这个“方格宇宙”有什么性质。 |