动物计算:模型的建立与仿真

欢迎回来!我是Maurice。我想向你介绍两个来自《自私的基因》的思维实验,并将其使用Unity和C#实现了出来。希望可以帮到你,增长知识。

亲,点进来了,说明你对生物进化理论,或者数学建模啥的,还是有点儿兴趣的。第一次阅读,建议首先理解其中的设定,以及生物个体数量的变化过程即可。代码细节可以先不深究。(说来惭愧,这个程序我折腾了几个月,涉及观察者模式、四叉树、递归什么的。代码结构也重构了几次T–T)有什么问题可以在下面留言,我看见了就会回。总之,一起进步^__^

实验一:老鹰与鸽子

基本设定

本文假想并模拟了一个20*20的二维平面空间。在此二维平面空间中,设计了2种虚拟的假想电子生物。老鹰,以及鸽子。老鹰性格凶残,争强好胜。鸽子温文尔雅,在竞争中保持优雅。

我们假设,种群中的个体会相互竞争,争夺社会资源。老鹰与鸽子、老鹰与老鹰、鸽子与鸽子之间都会,为了社会资源进行斗争。争夺来的社会资源可以拿来生成新的子代(俗称生孩子)。我们将社会资源量化为数字,人为数值设定为:在一次比赛中,赢一场比赛 + 50 +50 +50分,输一场比赛 0 0 0分。被对手打成重伤 − 100 -100 100分。

同时,我们假设,老鹰或者鸽子,会将战斗获得的资源上交系统月子中心,系统月子中心会将老鹰或者鸽子上交的资源多寡,生成对应数量的子代老鹰或者鸽子。(通俗理解就是,赚了钱归系统,系统根据你上交的金钱数量,帮你照顾对应数量的孩子。交的钱越多,照顾的孩子越多

假设有一个种群,其个体完全由鸽子构成。鸽子在假想的世界里闲庭信步,遇见其他鸽子则进入战斗状态,争夺社会资源。由于鸽子之间的战斗只是虚张声势的恫吓对方,并不进行真正的战斗。只有两只处于战斗状态鸽子的一方坚持不住,先行宣告退出,则竞争结束。

于是,赢家由于和败家鸽子“战斗”消耗了半天时间, − 10 -10 10分。赢家鸽子总分为: 50 − 10 = 40 50-10 = 40 5010=40分。败家鸽子由于消耗了时间而无所得,得 0 − 10 = − 10 0-10 = -10 010=10分。由于鸽子输赢的概率为 50 % 50\% 50%,所以每一只鸽子的平均收益(数学期望)为 40 × 50 % + ( − 10 ) × 50 % = + 15 40 \times50\% + (-10)\times50\% = +15 40×50%+(10)×50%=+15分,每只鸽子成绩看起来都不错。整个鸽子种群欣欣向荣。

鸽子欣欣向荣.png

假设这时候混进来一只老鹰。对于老鹰来说,打败鸽子简直太简单了:鸽子不会真正的战斗,老鹰必胜鸽子!每一场搏斗老鹰都可以获得+50的收益。败北鸽子虽然输了,但是不会受伤,收益为 0 0 0。可以预见,在满是鸽子的世界里,老鹰可以积累大量社会资源。老鹰的基因便在种群中扩散开来。下图为一只老鹰混入鸽子种群后,扩增为14只老鹰的画面:

仅仅只是一个老鹰进入了鸽子种群中.png

如果老鹰的基因在种群中进一步扩大,迎接而来的是老鹰们的噩梦:对手很难再是鸽子,都是老鹰。大家都很强很内卷,会为了一点儿蝇头小利争个你死我活。如果老鹰赢了,得分+50分。如果老鹰输了,则负重伤得分-100分。由于我们假定输赢各半,每一只老鹰得分的数学期望为: 50 × 50 % + ( − 100 ) × 50 % = − 25 50\times50\% + (-100)\times50\% = -25 50×50%+(100)×50%=25.可以发现收益为负数。老鹰无法上交更多的社会资源给系统月子中心,也就无法生成老鹰子代。可以预见,整个老鹰种群的数量在下降。

老鹰锐减.png

这时,如果混进来几只鸽子,局面便会清朗很多。**虽然鸽子打不过老鹰,但是它绝不受伤!**老鹰由于面对大环境无处不在的老鹰,在一场场的战斗中不断锐减。鸽子却在与鸽子的战斗中,缓慢恢复自己的鸽子种群数量。

鸽子入场.png
最后,神奇的是,如果你把老鹰和鸽子一股脑放进去模拟,老鹰与鸽子的数量在进行暂态的波动以后,会进入一个稳定状态,并很难发生改变。鸽子与老鹰的比例,在我设计的程序里,大约是13:37。

以下为《老鹰与鸽子》程序。(不用担心,自己动手试试吧!):

链接:https://pan.baidu.com/s/1j1oC31rEAGy_7UwEsIuWnw
提取码:GPNU

实验二:Gender War

本文假想并模拟了一个20*20的二维平面空间。在此二维平面空间中,设计了4种虚拟的假想电子生物。忠诚型雄性、薄情型雄性、羞怯型雌性、放荡型雌性。每一种不同的生物,有自己不同的行为准则。

在下图中,红色方块为忠诚型雄性。黑色方块薄情型雄性。白色圆形为羞怯型雌性。黄色圆形为放荡型雌性。灰色圆形表示已经受孕的雌性。

两性战争.png

基本设定

  • 羞怯型雌性必须与雄性经过长达数周且代价昂贵的追求以后,才肯与雄性交配。
  • 放荡型雌性则来者不拒,愿意迅速与追求它的雄性交配。
  • 忠诚型雄性会对雌性展开长时间的追求,并且交配之后仍然与自己的配偶呆在一起。
  • 薄情型雄性会对雌性展开恰如其分的追求,如果雌性不与之交配,它会立刻离开。

数值设定

为了对上述的设定进行模拟,我们将采用一些数值表示每一个雄性、雌性个体的收益和损失。

  • 第一,我们假定生下一个子代个体会获得+30个基因收益。
  • 第二,每抚养一个子代个体会消耗-20个基因收益。
  • 第三,雄性对雌性展开旷日持久的追求会消耗大量的时间精力,记为-3个基因收益。

配对情况

如果羞怯型雌性遇上了忠诚型雄性,它们为漫长的求爱仪式付出了巨大代价,记为-3分。抚养生下的一个幼儿,记录为+30分,并共同承担抚养幼儿,记录为-20分。可以算出,如果羞怯型雌性遇上了忠诚型雄性,平均每人的计算收益为 (30-20-6)/2 = +2分。

如果羞怯型雌性遇上了薄情型雄性,薄情型雄性发现无法在短时间内快速追求到羞怯型雌性,会立即离开,双方都不会浪费时间,收益为0。

如果放荡型雌性遇上了忠诚型雄性,放荡型雌性立即与之交配。由上文可以知道,抚养生下的一个幼儿,记录为+30分,并共同承担抚养幼儿,记录为-20分。同理,如果放荡型雌性遇上了忠诚型雄性,平均每人的计算收益为 (30-20)/2 = +5分。

如果放荡型雌性遇上了薄情型雄性,放荡型雌性立即与之交配。不幸的是,薄情型雄性交配完后会立即离开,抛弃放荡型雌性,让其独自抚养它们的子代。所以,薄情型雄性的基因收益为30/2 = 15.而放荡型雌性则要独自抚养孩子,基因收益为:(30/2)-20 = -5.

规则设定

为了方便使用Unity3D书写程序,我们也对平面世界的一些规则进行了设定。

我们设定:

  • 第四,每一位个体,无论雄性、雌性,在平面上要么横着走、要么竖着走。
  • 第五,在横着走或者竖着走时,有一定的概率 P P P会转弯
  • 第六,个体行走到平面世界边缘时,调转运动方向,自动返回。
  • 第七,程序无时无刻都在进行个体之间的碰撞检测。如果雄性和雌性被系统检测出碰撞,且它们之间选择进行交配,则雌性进入3秒冷却状态。(俗称CD时间\冷却时间\技能CD)在冷却状态雌性无法再次受孕。
  • 第八,个体获得的的基因收益累加进种群中。由系统月子中心对象自动合成全新的子代个体。
  • 第九,一次繁衍生下一雄一雌。无论雄雌,其性格(类别)都跟随自己的父母。
  • 第八,我们把猎杀雄性、雌性个体的动物,称之为捕食者。一旦种群数量超过100,则捕食者会随机捕食雄性、雌性个体,直至种群数量下降到100以下。(防止内存爆炸)
  • 第九,所有个体都存在寿命 T T T。所有个体一旦产生,则按照对象内的计数器时间 T T T进行计时。时间到则该个体自动死亡。

局面

如果种群中所有雄性都是忠诚型雄性,所有的雌性个体羞怯型雌性。程序模拟仿真结果显示,每一个忠诚型雄性,或者羞怯型雌性都获得了正数的基因收益,整个种群欣欣向荣。(注:灰色圆形表示已经受孕的雌性,雄性同理)

忠诚与羞怯.png

假如这时候混进来一只放荡型雌性,情况就有一点儿微妙了。由于种群中只有忠诚型雄性,放荡型雌性无论如何都可以找到一位好父亲。每抚养一位幼儿,放荡型雌性的基因收益为:+5,相比于羞怯型雌性的+2基因收益要好上许多。所以,放荡型雌性的基因收益积累的更快,在系统月子中心的帮助下,放荡型雌性的基因便在种群中扩散开来。

忠诚与放荡.png

如果羞怯型雌性在种群中蔓延开来,以至于把羞怯型雌性排挤掉,那么种群中便会只剩下忠诚型雄性,和放荡型雌性。 假如这时候混进来一只薄情型雄性。那么对于薄情型雄性来说,面对种群中无处不在的放荡型雌性,薄情型雄性可以轻易获得与放荡型雌性的交配机会。薄情型雄性在交配之后便抛弃放荡型雌性,自己享受+15的基因收益。孩子则完全由放荡型雌性抚养,因此放荡型雌性要付出抚养孩子的全部代价,基因收益为-20;随着时间的推移,薄情型雄性的基因便在种群中扩散开来、羞怯型雌性逐渐老去死亡、忠诚型雄性被劣币逐良币,惨遭淘汰。

薄情.png

在耗尽所有放荡型雌性之后,等待薄情型雄性的,只有死亡。我做仿真的最大感受就是,所有的高速增长都是以未来为代价的消耗型的增长:整个环境被透支了。

如果这个时候进入了一只羞怯型雌性,情况便会好转好多。薄情型雄性等待不了漫长的求爱时光,不会与羞怯型雌性交配。种群中极少量的忠诚型雄性遇见羞怯型雌性,并与之交配。生下羞怯型雌性和忠诚型雄性。于是,羞怯型雌性和忠诚型雄性的基因便在种群中扩散开来,重新回复平衡。

生态恢复.png

程序我已经拿Unity写出来打包好,上传到网上了,大家可以玩一玩:

链接:https://pan.baidu.com/s/1lbbrQHYla96wHEbbEXqBEg
提取码:GPNU

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值