当前位置:编程学习 > JAVA >>

生命、细胞及进化的模拟尝试

序章

一直想做个模拟物种进化的程序,最近花了点时间考虑了一下,发现如果要模拟真实世界的话需要考虑的因素实在太多,决定先从一个完全简化的模型入手。因为j2me简单方便,所以程序用j2me来写。

首先建立一个假设的前提:整个模拟世界的基础是能量。一切生物活动、生长、繁殖的基础都是能量,生物从环境获取能量或者直接从其他生物获取能量,生物的活动以及维持生命本身都需要消耗能量。当获取到足够多的能量后生物会生长,以及繁殖。当生物死后,一部分残存的能量还会返回环境。



第一章:环境

在有物种之前首先需要有一个适合物种生存的环境(Environment),因此先建立一个简化的环境模型。
该模型中包含四种基本因素:

·第一就是作为世界基础的能量(energy)。整个环境中充满了强度不同的能量,并且作为简化的模型,我们假设环境中的能量是类似流体的可以在环境中自由流动的。

[图1]随机在环境中生成能量,那些蓝色和绿色的点是各种强度的能量,颜色越亮能量值越高


[图2]能量开始轮流动


[图3]继续流动,能量混在一起看起来模糊了


[图4]能量流动的结果,开始变得清晰了


[图5]能量流动逐渐趋于稳定,看上去很像中学地理里学的等温线

·第二是能量在环境中的存在形式(energy_provide_code)。为了将来能够模拟出物种的多样性,我们让环境中的能量以多种形式存在,然后只有特定的生物能够吸收与之对应的形式的能量。(特别的,能量在环境中的流动是不会受到存在形式的影响的,也就是说,在环境中,任何形式的能量都能够自由的转换形式进而进行流动,因为我们主要想模拟的是生物的进化,因此在简化的环境模型中,我们不用考虑环境中能量流动的过程,只要知道能量能够在环境中转化和流动就可以了)。

[图6]能量在环境中存在的形式,因为还有很多种类的能量是存在于生物体能而不是存在于环境中,所以我限制了能量的波谱,这让整个环境看起来是一片蓝色


[图7]将能量的值和能量的类型叠加在一起,形成了这样的效果

·第三是地形(terrain),像所有RPG或者动作游戏一样,地形是生物活动的依据,地形除了会影响到生物的活动以外,也会影响到环境中能量的自由流动。地球起源之初是一片汪洋大海,地形我就先不做了

第四是生物反馈信息(trace),尽管在真实世界里,生物对于环境的反馈全部都是通过能量进行的,但由于环境模型中能量的存在形式本身已经被我简化了,所以特别的把与生物活动有关的信息提取出来,它的功能在之后再详细设计。

太阳的辐射源源不断地为这片孕育生命的海洋补充能量,为了模拟这一点,我每隔一段时间随机向环境注入一股能量。

[图8]红色圈中是刚刚向这个环境注入的一股能量引起的波纹,而蓝色圈中看上去好像鼓起来一个包似的形状,是上一次注入能量在环境中发散后留下的 --------------------编程问答-------------------- 这么好的帖子,竟然没人回复~ --------------------编程问答-------------------- 第二章:细胞

上帝好像就是这样不断的尝试,又不断地编写新的功能,最终在这个宇宙中创造出了适合生物生存的环境,又在这个环境中创造了能够生存下来的生物,生物繁衍后代,不断进化,最后出现了人类。



2.1 从环境中摄取能量、运动、繁殖、和死亡

从无机物到有机物,再从有机物到生物的过程我就不模拟了,据说没有人知道这是怎么发生的。

假设现在已经有了生物(actor)这样一种东西,它由细胞(cell)构成。于是开始为细胞建立模型。

一、基本属性
细胞的一个基本属性就是能量(energy)这个东西伴随细胞终生,细胞每活过一个单位时间,都会消耗能量,每繁殖一次,会把能量分给新的个体,甚至于每吸收一次能量,都要消耗掉能量。
细胞的其他属性主要有:
·自身存储的能量类型(energy_provide_code),与环境所提供的能量类型一样,每个细胞都有它自己存储的能量类型,只有对应于这种类型的生物才能从这个生命体身上吸取能量,正如另一些特定的能够从环境中直接吸取能量的生物一样。
·能够吸取的能量类型(energy_incept_code),这个属性正是生物能够从外界获取能量的根本原因,只有当incept_code与其他生物或者环境的provide_code相匹配的时候才能从它们那儿吸取能量,并且匹配度越高,吸取能量的效率越高。
·单位能量损耗(energy_cost),即维持该细胞的生命,每个单位时间需要消耗多少能量。
·最大能量存储量(energy_max),即该细胞最多能够存储多少能量,能量饱和后就能进行细胞分裂,细胞分裂使得生命可以成长和繁殖。
·移动力(locomotivity)、记忆力(memory)、感知力(apperceive)、繁殖力(propagate)、能量传输能力(energySharing),这些分别对应这个细胞在各个方面的能力,当生命逐渐进化的时候,最终发展出各种具有特别功能的器官。
·颜色(color),颜色只是用来标识不同细胞的,仅仅用于我们观察,它与生命进化本身没有任何影响。

二、摄取能量
目前暂时还没做到生物之间的捕食机制,生命起源初期所有生物都之能够从环境中获取能量,这个时候无论是食草动物还是食肉动物都还没出现。
也就是说,我们现在创造出来的生物还之能够根据自己的incept_code与它周围环境的provide_code相比较,如果匹配则从环境中获取能量。但是将来的生物将能够找到provide_code与自己的incept_code匹配的其他生物,然后从它们那里获取能量。还记得吗,匹配度越高,吸取能量的效率就越高,正因为如此,未来的高等生物们将会有它们各自的口味偏好。

三、运动
细胞本身的运动暂时被忽视,所有细胞的移动力被加总到生命体本身上,然后由生命体的运动带领身上的细胞一起运动。由于现在只有单细胞生物,而且环境中的地形还没制作,所以运动这件事情现在看来还不重要。
现在的单细胞生物只会杂乱的、随机的移动,是因为遗传中还未包含记忆信息。当未来出现能够遗传记忆的生物之后,所有细胞的行为将会变得更理性。

二、繁殖
DNA是一个非常重要的东西,它存在于生命体的每一个细胞中,任何一个细胞中的DNA都包含了整个生命体的全部属性,这使得生物的各种繁殖方式变得可能。
而当繁殖时由于某种原因造成DNA内容的改变,就出现了变异,变异是整个进化过程中最关键的一个环节。

三、死亡
由于现在的科学界对于熵(entropy)这个概念仍然模糊不清,所以一开始我非常不愿意把熵的概念加入进来,但是有关细胞自然死亡的根本原因科学界似乎也没有一个定论,我不得不在后来又加入了一个类似熵的概念来模拟新陈代谢。每个细胞都有一个总的负熵值,把它分成很多份,在细胞的生命周期中,每一个单位时间用掉一份,这一份的数值越大,它一次性从外界获取的能量就越多,当全部的负熵被用完之后细胞就死亡了。由于每一份的数值都不一样,所以生命越短的生物一次性获取大量能量从而进行繁殖的能力就越强。而生命越长的生物繁殖能力就越弱。

四、反复的多次模拟
我猜想地球上环境的不断变迁可能是上帝进行的多次尝试。

刚开始的时候,因为环境太苛刻,另外在一开始随机生成的单细胞生命体的属性也太弱,基本上几个周期后就死光了,只有一次出现了一个特别“顽强”的生命体,居然生存了下来并且通过繁殖衍生出一个种群,尽管很小,却一直持续了很久。


[图2.1]这是仅有的一次某个“顽强”的生命体繁殖出了后代,并衍生出一个很小的种群,在很长时间之后,它们吸取的能量影响了整个环境

第2次我提高了随机原始细胞总的负熵值,使得这些单细胞生物的寿命和繁殖能力大大增加。仅仅146个单位时间之后它们衍生出来的种群数量就已经发展出超出我电脑的承受能力。尽管这样其实能够在更少的单位时间里进化得更快,但由于我的电脑需要每5秒才能跑一桢(正常情况下应该是1秒钟20桢),我不得不把它们的能力稍微降低一些以便于观察。


[图2.2]当随机生成的原始单细胞生物的总负熵值提高5倍之后,生物的生存和繁殖能力显得过于旺盛了

重新调整之后,刚开始,环境似乎仍然显得有点苛刻,投放进去的200个原始生命一下就快死光了,我没有在意并走开了一小会儿。
当我回到电脑旁的时候大吃一惊,存活下来的3个种群超出了我的想象。


[图2.3]尽管197个原始生命以及它们的后代全部都死亡了,但有三个种群活了下来


[图2.4]它们不断的繁殖、向外扩张、吃掉更多的能量


[图2.5]当两个种群遇到一起时出现了相互抢夺能量的情况,还好现在它们还不会相互吞噬


[图2.6]三个种群以及它们的后代吃掉了环境中大部分能量,以至于画面上出现了黑色的能量空洞


[图2.7]抢夺资源的结果是大家都因为没有了更多的能量而使得种群数量开始下降


[图2.8]我们可以看到一个缺乏天敌的生物环境将会出现什么情况:少量的几个物种大量的掠夺资源,直到环境中的全部资源被耗尽,所有物种最后消失 --------------------编程问答-------------------- 进化中,未完待续 --------------------编程问答-------------------- 顶.......下 --------------------编程问答-------------------- 楼主还玩么 .... 看起来太好玩了!!  --------------------编程问答-------------------- 不错的想法,实现起并不简单哦~ --------------------编程问答-------------------- 即使是简化过的模型,这里想要实现的进化所涉及到的因素仍然过于复杂,另外如果要模拟真实进化的话,需要极为庞大的样本量,可怜的PC机应该是跑不动的。

最近看到一些其他资料,决定在这个基础上修改一下研究方向,限定物种无穷无尽的可能性,仅在一些简单的已知规则下进行模拟(例如,假设地球上的植物这一较小的既定分类),只有遗传,没有突变,并且在较短的时间里运行。

也就是说,在这种有限环境里,假如我用植物做为例子,那么所有的样本永远都不可能进化成动物或者其他任何生物,它们永远不会改变生理上的基本规则。

虽然完全不是我的初衷,但目前看来,也只能先退而求其次了。 --------------------编程问答-------------------- --------------------编程问答-------------------- 呵呵 为什么搞j2me 而不是 j2se --------------------编程问答--------------------
引用 9 楼  的回复:
呵呵 为什么搞j2me 而不是 j2se


有KE这种神一样的模拟器了以后,j2me跟j2se对于这种程序来说已经没啥区别了。

老本行是搞j2me的,习惯而已。先把思路理顺,以后找时间移到C上面去,执行效率也许会高一些。 --------------------编程问答-------------------- 赞一个,想法很好玩 --------------------编程问答-------------------- 真的是很好的帖子,贵在不但想了,而且做了 --------------------编程问答-------------------- 再顶顶楼主啊  希望能进化下去啊 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- --------------------编程问答-------------------- 有点意思,生命应该多半是随机产生的吧,排除高级生命操作的因素
补充:Java ,  J2ME
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,