本文程序代码链接(压缩包里的“myworld”项目,压缩包还包含其他各类成熟的细胞自动机完整代码实现):https://download.csdn.net/download/qq_39932172/11218374
目的:
- 探究在一定规则下,人,动植物在不同投放条件下,会如何演变。
- 探究在何种规则下,人与动物,植物可以和谐相处。或者说,在已制定的规则下,怎样控制条件(包括初始生命投放,以及后期调节)才能使生命稳定存活下去。观察各种条件对世界演变的影响。
内容:
初始只有人,动物,植物。整个世界只是一个无限大的方格,而它又被划分为无数个小方格。每个小格子周围相邻八个小方格。
具体规则如下(初期想法,后期并未完全实现):
- 食物有限及种族繁衍:
- 以一个方格内的生物为坐标,周围有八个方格,若其余八个方格内,没有其余生物,则人与动物死掉,植物可独立存在。
- 若有四个及以上同种生物,则他们因为无法得到足够资源死掉。
- 若有一到三个同种生物,都可存活,当其中有且仅有一个同种生物时,人与动物可产生一个新生物,而植物仅仅是继续存活。
- 注:鉴于需要随机产生,但是由于太过繁杂,我们规定左/上方的上面为第一个产生新生物的地点。第2及第3不加赘述。
- 死亡规则:
- 一个人与一个动物,人死;
- 一个人与一个植物,正常存活;
- 一个动物与一个植物,正常存活;
- 两个人一个动物,动物死亡;
- 两个人与一个植物,植物被砍倒,死亡;
- 另外动物与植物一直和平相处。
- 死亡“收获”:
- 人被杀死,产生一个武器,凑齐十个,随即死亡三个动物,且死亡的动物会产生病毒;
- 动物无论是被人杀死,还是被武器随机杀死,都会产生一个病毒,凑齐十个,随即传染死亡五人;
- 植物被砍倒,则会产生一个医疗工具,凑齐十个,随机产生五个人,两个动物。
- 环境影响:
- 每十次变换,一次雨,随机产生一棵树;
- 每五十次变化,一次灾难,人与动物,传染率30%,死亡率10%,植物随机被破坏5%,其中人死亡不会产生武器,植物死亡不会产生医疗工具,动物死亡仍会产生病毒。
- 另外,规则设定时遇到一个问题:若是一个4*4的区域,全部充满同种生物,分别标号1到16,根据同种生物规则,由1判断到16,则1存活,2,3死亡,4存活,5,6,7死亡,8存活!但是,按照一开始的设定,8周围有五个同种生物,应该死亡!所以,这里就存在一个“先死后死”的问题。这种问题无法随机做出,我们觉得不公平,世界应该公平一点,所以我们决定这种情况下,死亡或者存活,仅仅从上一时刻的状态来看,每次死亡一批,即这种情况下,8是否死亡,看周围情况,但是,即使3,7死亡,无法判断先后,则视其为存活,则8周围有五个同种生物,死亡!
- 1 2 3 4
- 5 6 7 8
- 9 10 11 12
- 13 14 15 16
鉴于水平有限,一开始就从最复杂的开始,可能错误百出,难以改正,故由易到难,先从最简单的开始。例如:只设定一种生物:人,以及他的一些规则,再完善规则,完善规则之后,再增加生物,如动物,或者植物,另外增加他们之间的关系规则,完善关系,甚至可以直到扩大细分到一个小型生物圈抑或一个世界。
在结合我们制定出来的世界规则的背景下以及制定的不成熟的实验设计方案之后,我们来到类具体实现这一步。当我们按照之前的规则编写好部分代码时,我们发现我们在之前的规则上以及设计中的一些弊端,所以为了更好地体现不同生物生存能力的强弱,我们在原有规则的基本模式下对生物生存和死亡的规则做了一些改动:
具体修改如下:(该部分已完全实现)
单物种之间生存与死亡的规则:
人类:
- 周围没有人,则此地如果有人则他会孤独而死,没人即保持不变。
- 周围有1人或2人,则此地保持当前状态不变,有人无人都可。
- 周围有3人,则此地如果没人则会繁衍出一个人,有人即保持不变。
- 周围有4人及更多,则此地如果有人他会因为资源匮乏而死。没人则不变。
动物:
- 周围有0~2只动物,则此地如果有动物则它会因种群太少而死,没有则不变。
- 周围有3只或5只动物,则此地如果没有动物则会繁衍出一只,有则不变。
- 周围有4只动物,则则此地保持当前状态不变,有动物无动物都可。
- 周围有6只及更多,则此地如果有动物它会因种群斗争而死,没有则不变。
植物:
- 周围有0~1株植物,则此地如果有植物则它会因同类极少而死,没有则不变。
- 周围有2株植物,则此地如果没有植物则会衍生出一株,有则不变。
- 周围有3株植物,则此地保持当前状态不变,有无植物均可。
- 周围有4株及更多,则此地如果有植物它会因竞争阳光等资源而死,没有则不变。
三者生物之间的交互制约规则:
(博文开始处已写明,但程序中并未完全实现)
下面是具体实现的总体框架图:
根据上述的总体框架图,我们共设置了5个类,分别是World类(世界),Environment类(环境),Human类(人类),Animal类(动物),Plant类(植物)。
其中,World类代表了我们所设置的M*N个方格。Environment类代表着每一个小方格,所有方格构成一个Environment类的类数组,也正好构成了我们的世界,也就是World类。在每个Environment类的类对象中,也就是每个小方格中,存活着不同种类的生物,例如人类,动物,植物,也就是我们所设置的Human类,Animal类和Plant类。他们有各自不同的属性,生存死亡条件,这就决定着他们之后的生存状态。
然后我们分别在只有植物,只有人类,只有动物的情况进行了代码可行性的测试,因为考虑到和现实结合的原因所以在规则那里我们已经把植物的生存能力弄得稍微强一些,然后人类次之,动物最弱。也就是上面所述修改后的规则,在实现过程中也很好地达到了我们的预期。
具体测试情况如下:(以下结果均在30*30的方格中测试得到)
- 当只有植物时,我们测试出只要在初始时随机给出10株植物,由于植物生存能力最强,所以在此情况下一般能较正常地繁衍下去,直至在整个世界范围内变化。
- 当只有人类时,我们先测试了初始时随机给出10个人,由于人类生存能力比植物弱了一些,所以发现基本不可能繁衍下去,然后我们又测试了初始时随机给出50个人,发现在此情况下一般能较正常地繁衍下去,直至在整个世界范围内变化。
- 当只有动物时,我们先测试了初始时随机给出10只动物,由于动物生存能力最弱,所以动物也就基本不可能繁衍下去,然后我们又测试了初始时随机给出50只动物,发现在这种情况下动物还是难以繁衍下去.
- 最后我们又测试初始时随机给出100只动物,这一次虽然某些随机情况发现还是不能繁衍下去,但某些随机情况已经能正常的繁衍下午,直至在整个世界范围内变化。
- 所以本次测试正好体现了我们设置的植物生存能力最强,人类次之,动物最弱的这一点,也让我们对后续的其他生物演变过程有了一些小小的期望。
下面是我们在测试对只有单一物种情况下的一些实验过程截图:
只有植物时:
初始设置10株:
繁衍10代以后:
繁衍20代以后:
繁衍30代以后:
繁衍40代以后:
繁衍50代以后:
只有人类时:
初始设置50人:
繁衍20代以后:
繁衍40代以后:
繁衍60代以后:
繁衍80代以后:
繁衍120代以后:
只有动物时:
初始设置100只:
繁衍40代以后:
繁衍80代以后:
繁衍120代以后:
繁衍160代以后:
繁衍200代以后: