当前位置:文档之家› (最新版)生命游戏JAVA语言代码细胞自动机毕业论文设计

(最新版)生命游戏JAVA语言代码细胞自动机毕业论文设计

浙江理工大学

毕业论文(设计)诚信声明

我谨在此保证:本人所写的毕业论文(设计),凡引用他人的研究成果均已在参考文献或注释中列出。论文(设计)主体均由本人独立完成,没有抄袭、剽窃他人已经发表或未发表的研究成果行为。如出现以上违反知识产权的情况,本人愿意承担相应的责任。

1

声明人(签名):

年月日

摘要

本文利用Java 作为编程语言,Java swing编写图形界面实现了生命游戏的可视化编程,并且在生命游戏的基础上进行了一定的扩展,增加了系统复杂性,给定了简单的初始状态以此进一步研究细胞自动机在复杂系统中所表现的能力,为细胞自动机及生命游戏的后续研究奠定基础。结论:计算机实现的细胞自动机在计算机模拟的复杂系统中确实拥有复杂系统所表现出来的自适应性,不确定性等特性

关键词:生命游戏;细胞自动机;复杂系统

ABSTRACT

Using Java as a programming language, Java Swing as graphical interface to achieve a visual programming of the Game of Life. Expand the basis of the game of life, increased system complexity, given the simple initial state in order to further studythe demonstrated ability of cellular automata in a complex system, lay the foundation for the follow-up study of cellular automata and the Game of Life. Conclusion: The computer-implemented cellular automaton computer simulation of complex systems do .FOODMULTIPLE*getWeakPercentByAge()*beEatedToMeat()*(0.3+speed70. 0bodySize+strength30.0bodySize);

LifeGameCommon.FOODMULTIPLE为程序设定的倍数,用于控制个体所需食物量从而达到控制个体数量的效果。

getWeakPercentByAge()返回的是一个削弱值,表现为个体在寿命的前20%以及后20%竞争力会按一定比例上升下降.

beEatedToMeat()返回该生物被吃掉时产生的肉食数量,与个体体积成正比

(0.3+speed70.0bodySize+strength30.0bodySize)表示个体需要的食物量至少需要自身体型的0.3倍,当速度力量高时,也会提高这个数值,显然速度的提升对食物的消耗更少。

3.7 环境规则

根据LifeGameCommon中定义的环境自增长比率(下一节中有介绍),每一个周期每一格环境自增长,每当比率达到下一个等级,曾颜色变深一级,土地,草地,每当比率达到100%,则环境变换成下一种类型(土->草,草->树),草地,树林,每

3

到比率降到0%以下,则环境变换成上一种类型(树->草,草->土)。

3.8 关键参数设置

PAM = 0.03

突变概率为0.03,该值应取尽量接近于0,但由于过小的突变概率会导致想要得到较好的结果需要大量的运行时间,而过大的突变概率会导致个体的不确定性太大,就算个体已经往适应环境的方向发展了很长时间,也有可能因为突然的变化而导致个体大幅度变化,最终大幅影响系统的稳定性。

所以需要折中考虑该值对程序运行时间与系统稳定性的影响,若想在1个小时内得到结果,那么该值取0.005-0.05都是合理的。当该值大于0.05时,个体会有较大的几率完全灭亡,而该值小于0.005时,程序的运行效率大幅降低,需要运行很长时间才能得到该有的结果,这不是我们想要看到的。

PAMPercent = 0.8

突变时某项属性得到80%的变化,同样,该属性需要折中考虑对程序运行时间与系统稳定性的影响,需要更加稳定时需要减少该值但是对计算机性能要求更大。该值80%的设定,已经比较大(原则上这样的设置会导致个体属性达到80%的变化幅度),但是突变的属性仍然会在0~80%之间取得随机值,所以平均40%的变化幅度还是可以接受的,若想在一个小时内得到较好的结果,那么该值平均变化幅度在30%~50%之间都是合理的。当该值大于50%时,个体会有很大的几率完全灭亡,而该值小于30%时,程序的运行效率大幅降低,需要运行很长时间才能得到该有的结果。

FOODMULTIPLE = 5

食物消耗倍率,由于系统中个体所系食物通过个体属性经过一定计算得到,并没有实际单位,通过最后乘以该系数调整与环境生长之间的关系。

PLANTGROWSPEED = 0.003

植物生长速率,每一个时间周期环境的肥沃度增加0.3%

以上两个属性需要一起考虑,由于系统设定中,每个单元格的资源是有上限的,那么就意味着,如果有一个个体的所需资源已经超过了这个上限,那么这个个体必然无法生存,如果个体所需的食物量太少,则每个单元格上会出现非常多数目的个体,现在在程序中,世界的大小被设定为2500个单元格的大小,若每个单元格出现太多的个体,单台电脑的CPU和内存是无法承受的,所以将食物消耗倍率调到了5倍,即理论上减少单个单元格所能容纳的个体数目到原来的15,即系统中总共个体数目

较少为正常情况的15。

PAM与PAMPercent控制了系统达到稳定灭亡的速度,FOODMULTIPLE与PLANTGROWSPEED用于平衡个体数目。

3.9 预测结果及理论分析

1. 在设计时个体属性中刻意加入了成年年龄这个属性,但未对该属性加以限制,该属性只对个体造成负面影响,个体在进化过程中应该使该值向趋于0的方向发展。

2. 个体的数量会从0增加到一个非常大的数目,然后因为匮乏资源,大部分死亡。

3. 步骤2的过程会不停的发生,再重复该过程中生物会不停的往不同方向进化,当然适应能力差的个体会优先死亡。

4. 系统的运行结果基本有2种,全部灭绝或者趋于稳定,由于系统中进化突变的概率非常高,系统并不可能显得每一次都能达到稳状态,变异也具有一定不稳定性。但是如果系统能趋于稳定(即在不停的重复2的过程中,越来越适应环境),个体数量的震幅应该会变得越来越小。

5. 加入了肉食性的系统后,由于算法过于复杂,十分影响运行速度(没有加入时我的CPU能在系统有10000个以下个体时运行,加入肉食性后,1000个个体的运算CPU已难以承受),运行时去掉了肉食性,去掉后势必带来一个严重的后果,参考现实世界,在一开始资源较少,个体较容易变异时,虽然竞争力其实不强,但是由于个体小,消耗资源少,非常容易存活下来,所以这样的生物会猛涨,并且无法得到控制,系统的平稳阶段会停留在低级生物的阶段。如果加入肉食性系统,则当该种生物爆发到一定阶段时,植食性动物资源大量减少而具有一定肉食性动物就容易生存,系统容易达到高级生物阶段。

6. 在设定中,刻意将速度对生物的提升设置为高于力量的提升,最终结果应当表现为速度对生物更有价值,会比较高,而力量值会较低。

3.10 运行结果及结论分析

以下图都为程序运行半小时左右得到的结果

5

图3-4 程序运行半小时后结果图

由于系统运行时间不够长,不能非常好的看出结果,但是可以看到在横坐标300左右开始有平衡在5000左右的趋势,个体数量一开始会震荡的比较厉害,可以看到有几次几乎将要灭绝,但是又会马上增长回来,原因是初始的个体的各项属性设置的较高,需求的食物量较多,所以在没有肉食的情况下,非常容易因缺乏资源而死去,个体数量非常少,很长一段时间都保持在1500以下,每次在生物爆发后,资源量非常小的情况下,能生存下去的个体一定是食物需求量非常小的,之后由于长时间的变异,变异出的个体势必会往小型发展,所以个体数量会不停上升,到个体体型小到一定程度后,由于体型小带来的竞争力下降会使个体在较稳定的环境中更难生存,所以个体会趋于稳定,表现为整个系统处于较稳定状态,个体数目趋于稳定(当然由于不确定性,突然的变异就有可能导致所有个体的灭亡)

如预测,成年年龄由于未加入限制,生物在进化过程中趋向于0,因为该属性设置为越小对个体越有利(在未成年时竞争力按百分比下降),并为加入限制,结果也确实说明个体在系统中的进化结果基本废弃了该属性。因为时间越长越趋于零,到200个时间周期之后几乎就与x轴重合了,所以图中取了较短的时间的横坐标,更好

的反应结果曲线。

7

图3-5 成年年龄随时间变化

图3-6 个体平均速度变化图

图3-7 个体平均力量变化图

图3-8 个体平均体型变化图

可以看到力量,体型,由于肉食性的取消,不断的往小型生物方向发展,而速度由于拥有更高的性价比,个体在进化时任然保留了该属性,这个结果非常的说明问题,速度一直保持在较高的水平,个体一直没有放弃这个属性,而力量对个体的收益远没有速度大,因为几乎在个体的进化中完全消失(当然不能保证每一次运行结果生物都一定会往这个方向发展,这只是一个更高概率的合理解释),显然这也是在这样的系统中趋于稳定的个体自适应过程的结果。

寿命并不能直接影响个体的竞争力,因为在达到基本稳定之前,大部分个体在竞争中已死亡,并非达到寿命再死亡,这个属性需要程序运行时间达到一定长度才能反映出一定问题,在这里并不能说明什么问题。寿命的结果曲线并为给出,但是数据

上结果是寿命几乎是一个无序状态,个体的寿命时高时低,系统的平均寿命表现出随机性,无法预测(这只是短时间的运行结果,长时间的运行由于性能限制无法进行)。

由于本人在设计系统时并未考虑计算机性能,导致在实际运行中,由于算法过于庞大,导致计算机在个体数量达到1000左右的时候已经无法流畅运行,所以最终修改了一定参数,简化了程序算法以控制个体数量。

原本打算加入的智力天敌由于算法过于复杂严重影响运行效果,没有加入系统。

原本打算加入的飞行游泳能力的进化由于在用较简单的方法无法模拟,没用加入系统。

原本已经加入的食性,即食肉食草由于严重影响运行效率,在结果分析时并没有加入程序运行。

由于人为限制了单个单元格中最大的食物量,又去掉了肉食的可能性,人为减少了系统的稳定性,所以事实上体型大,力量、速度强的个体无法表现出更强的竞争力,系统的运行结果并不是每次都很理想。

由于肉食性的取消,每次生物爆发完之后,有可能生存下来的必然是食物需求量小的那部分(本来会有以这些生物为食的个体出现,因为资源充分而大量繁殖),所以个体确实往体型,力量,速度越来越小的方向发展,大型个体根本无法生存。

如果要达到理论理想状态需要将程序进行适当修改,并分布式部署程序,增加植物的生长速率,减少个体消耗食物的倍率。在一个计算机群上运行,预计将会达到更好的效果。

由于计算性能限制,生物的初始状态已被设置为固定,而初始位置,对运行的结果并没有决定性作用,故选了几个简单的初始状况仿真生命演变过程。

总结:

1.个体初始状态是由人为初始设定的,并不能非常好的适应环境。如果个体没

有去适应环境,所有属性不会变化,个体将会在非常短的时间内就死亡。

2.力量、速度两属性对个体的影响是近似的,只是设定上速度优于力量,结果

个体进化过程中确实优先保留了速度属性,而很大程度上放弃了力量。

3.虽然个体随着进化,增强了适应性,理论上应该会使系统稳定度不断的上升,

直到个体数目曲线基本持平,但是从图3-4可以切实的看到虽然会有很多时

间系统是稳定的,但是由于整个系统的稳定是依靠个体之间的相互作用共同

9

达到的,所以个体突如其来的变化仍然会表现出系统的不确定性。

4.由于肉食性的取消(个体只有争夺资源时竞争,没有相互生死搏斗),个体体

型的不断的变小并不会导致生存能力下降(虽然竞争力下降了,但是所需资

源少了),所以个体不断的往体型小的方向发展,这也是个体适应环境的表现。

5.成年年龄作为我特意加入的属性,就是为了观察个体在复杂系统中的适应性,

因为该属性只对个体产生负面影响,而进化的结果确实是该属性被完全抛弃,无限趋于0.

结果表明:生命游戏的演变过程是及其复杂化的。真实的世界要比我的生命游戏复杂的多,但是有一点是肯定的,个体会朝更适合自己生存的方向发展,计算机模拟的细胞自动机在复杂系统中确实拥有一定的适应性,不确定性等。

3.11 本文尚未完成部分

1.本文只是从一个生命游戏的特例对细胞自动机在复杂系统中的行为进行分析,无法从理论上证明其在每一个计算机模拟的复杂系统中都能表现出各种特性。

2. 本文在系统设计时由于过于理想化,并未考虑计算机性能,导致最终进行了大量改动,从很大程度上影响了结果。需要简化算法或并部署为分布式结构进一步进行研究分析。

3. 由于本人能力有限,对复杂系统的理解尚浅,所以本文中对其特性的理解也许会有错误,本文只是最大限度的从实际运行结果对理论进行一定的验证及分析。

致谢

本文是在王老师的悉心指导下完成的。王老师为论文研究思路的设计和文献资料的选择提供了非常有益的指导,使得研究和论文走向了正确的方向,避免了许多不必要的麻烦。同时王老师在复杂系统方面的丰厚的知识量也极大的帮助了我。在论文完成之际,谨向王老师致以衷心的感谢!

最后感谢所有关心、支持和帮助我的朋友和老师!

11

参考文献

[4] 杨晓利.一种混沌细胞自动机的特性研究[D].华北师范大学,2009:P1-P29.

[5] 晓东.生命游戏[J].软件,1998:P1-P15.

[6] 吴大鹏,李炳新,张汉卿,孙长伟.基于元细胞自动机的生命游戏硬件以及软件实现[J].电子技术,2007,(Z2):P1-P3.

[7] 黄文高,吴自立.混沌边缘的生命和艺术[J].美术观察,2001(9):P44-P47.

[9]沃尔德罗普. 复杂:诞生于秩序和混沌边缘的科学[M]. 北京:三联书店,1997: P398-P399.

[10] 赵海英,车跃跃,徐正光.基于摩尔奇偶性CA与生命游戏演化的组合模型[J].计算机应用研究,2011,28(12):P4734-P4737.

[11]Heudin J C. A new candidate rule for the game of two-dimensional life [J]plex

[12]Javid M.A.J. Boekhost R. Cell dormancy in cellular automata [C].Proc Of

[14] 徐迎庆,刘慎权,齐东旭.织物纹理的计算机生成技术[J].软件学报,1998,9

(6):P409-P413.

[15] 刘稚洁,刘延申.基于矩阵置乱的自适应视频水印算法[J].中国图像图形学报,2005,10(11):P1471-P1475.

[16]郭娟,吴迪,赵宪明.生命游戏复杂性的模拟研究[J].计算机伪真,2007,24

(10):P285-P289.

[18] 刘健勤.人工生命的理论及其应用[M]. 北京:冶金工业出版社,1997: P23-P32.

[19] 张焘.关于促进复杂性科学研究的考虑(复杂性研究)[M].科学出版社,1993:P20-P21.

[20] 戴燕红.初等元细胞自动机的复杂性研究[D].苏州大学,2008:P1-P35.

[21] 王寿云.开放的复杂巨系统[M].浙江科技出版社,1996:P56.

[22] 约翰·L·卡斯蒂. 虚实世界[M]. 上海: 上海科技教育出版社, 1998: P33-P52.

[23] 张传武.细胞自动机及其理论研究进展[J].贵州大学学报,2004,21(3):P289-P292

[24]Wolfram, S. Universality and Complexity in Cellular Automata [J]. Physica D, 1984,

16 (10): P1-P35.

[25]Langton, C. G.. Studying Artificial Life with Cellular Automata[J]. Physica D,

1986, 23 (10): P120-P14

[26]Bays C. Candidates for the game of life in three dimensions [J]plex

附录

1.生物个体类package https://www.doczj.com/doc/8f227076.html,anism;

import com.apei.lifegame.LifeGameCommon;

import com.apei.lifegame.model.condition.GroundUnit; public class Organism {

寿命

private double lifeTime;

体型

private double bodySize;

速度

private double speed;

力量

private double strength;

智力,太复杂

private double intelligence;

年龄

private double age;

发育年龄

private double adulthoodAge;

状态0-100

private int condition;

饱食度

private double foodCondition;

繁殖状态

private int reproduceState;

繁殖周期

private double reproduceblank;

13

private int x;

private int y;

public Organism(int x,int y) {

this();

this.x = x;

this.y = y;

}

public Organism() {

this.lifeTime = 80 ;

this.bodySize = 10.0;

this.speed = 5.0;

this.strength = 5.0;

this.age = 0;

this.adulthoodAge = 20;

this.condition = 60;

this.reproduceblank=15.0;

this.reproduceState = 0;

this.foodCondition=1;

}

public boolean getBirthFromOrganism(Organism organism) { double percent=0;

if(Math.random()>LifeGameCommon.PAM){

percent = Math.random()*0.2-0.1;

}else{

if(Math.random()>=0.5){

percent = LifeGameCommon.PAMPercent;

}else{

percent = -LifeGameCommon.PAMPercent;;

}

}

TODO

double randomNum=Math.random()*6;

this.lifeTime = organism.getLifeTime();

this.bodySize = organism.getBodySize();

this.speed = organism.getSpeed();

this.strength = organism.getStrength();

this.adulthoodAge =organism.getAdulthoodAge();

this.reproduceblank=organism.getReproduceblank();

this.foodCondition=100;

if(randomNum<1){

this.lifeTime = organism.getLifeTime()*(percent+1.0);

}else if(randomNum<2){

this.bodySize = organism.getBodySize()*(percent+1.0);

if(bodySize<0.01){

bodySize=0.01;

}

}else if(randomNum<3){

this.speed = organism.getSpeed()*(percent+1.0);

}else if(randomNum<4){

this.strength = organism.getStrength()*(percent+1.0);

}else if(randomNum<5){

this.adulthoodAge = organism.getAdulthoodAge()*(percent+1.0);

}else if(randomNum<6){

this.reproduceblank = ((double)organism.getReproduceblank()*(1.0+percent));

15

if(reproduceblank

reproduceblank=lifeTime*0.2;

}

}

this.condition = 100;

this.reproduceState = 0;

this.age = 0;

this.x = organism.getX();

this.y = organism.getY();

return true;

}

public double getWeakPercentByAge(){

double dAge = this.age;

double lifeTime = this.lifeTime;

if(dAgelifeTime<0.2){

return 0.2+dAgelifeTime0.2*0.8;

}else if(dAgelifeTime>0.8){

return 1-(lifeTime-dAge)lifeTime0.2*0.8;

}else{

return 1.0;

}

}

获取生物竞争力,

public double getCompetitivenessByGround(GroundUnit groundUnit) {

double competitiveness = getWeakPercentByAge();

if(groundUnit.getGroundType()==0){

competitiveness*=(strength*3+speed*7*1.2);

if(bodySize<=5){

competitiveness*=(5bodySize);

}else if(bodySize>=45){

competitiveness*=(bodySize45);

}

}

if(groundUnit.getGroundType()==1){

competitiveness*=(strength*3+speed*7*1.2);

if(bodySize<=25){

competitiveness*=(25bodySize);

}else if(bodySize>=80){

competitiveness*=(bodySize80);

}

}

if(groundUnit.getGroundType()==2){

competitiveness*=(strength*3+speed*7*1.2);

if(bodySize<=45){

competitiveness*=(5bodySize);

}else if(bodySize>=150){

competitiveness*=(bodySize150);

}

}

System.out.println("competitiveness"+competitiveness);

if(reproduceState>=1&&reproduceState<=6){

competitiveness*=0.5;

System.out.println("competitiveness"+competitiveness);

}

return competitiveness;

}

17

public double beEatedToMeat(){

return bodySize*0.01*getWeakPercentByAge();

}

public double getSumNeeded(){

return

LifeGameCommon.FOODMULTIPLE*getWeakPercentByAge()*beEatedToMeat()*(0.3+ speed70.0bodySize+strength30.0bodySize);

}

食物,对foodCondition产生影响

public void getFood(double food) {

foodCondition+=foodthis.getSumNeeded();

}

public double getPlantNeeded() {

System.out.println("plantNeed+"+ this.getSumNeeded();

}

public int grow() {

if(foodCondition>0.9){

condition+=30;

}else if(foodCondition>0.8){

condition+=20;

}else if(foodCondition>0.7){

condition+=10;

}else if(foodCondition<0.4){

condition-=30;

}else if(foodCondition<0.5){

condition-=20;

}else if(foodCondition<0.6){

condition-=10;

}

if(condition>100){

condition=100;

}

System.out.println("foodCondition"+foodCondition);

foodCondition=0;

System.out.println("condition"+condition);

age+=1.0;

if (age - 1 >= adulthoodAge) {

reproduceState++;

if (reproduceState >= reproduceblank) {

reproduceState = 1;

繁殖

if(condition>=60){

return LifeGameCommon.GROW_STATE_BRITH;

}else{

condition = 0;

System.out.println("太累!");

return LifeGameCommon.GROW_STATE_DEAD;

}

}

}

if (age >= lifeTime||condition<=0) {

return LifeGameCommon.GROW_STATE_DEAD;

}

System.out.println("age:" + age + "reproduceState" + reproduceState+"condition:"+condition+"foodCondition:"+foodCondition);

return LifeGameCommon.GROW_STATE_NORMAL;

19

}

@Override

public String toString() {

return "x:"+this.x+",y:"+this.y;

}

public String toAllString() {

return "Organism [lifeTime=" + lifeTime + ", bodySize=" + bodySize

+ ", speed=" + speed + ", strength=" + strength + ", age="

+ age + ", adulthoodAge=" + adulthoodAge + ", condition=" + condition + ", foodCondition="

+ foodCondition + ", reproduceState=" + reproduceState

+ ", reproduceblank=" + reproduceblank + ", x=" + x + ", y="

+ y + "]";

}

public double getLifeTime() {

return lifeTime;

}

public void setLifeTime(int lifeTime) {

this.lifeTime = lifeTime;

}

public double getBodySize() {

return bodySize;

}

public void setBodySize(double bodySize) {

this.bodySize = bodySize;

}

public double getSpeed() {

return speed;

}

相关主题
文本预览
相关文档 最新文档