如何模拟自然界生态系统中的食物链

本人最近在研究一款针对青少年儿童的教育游戏,希望从培养孩子各方面的综合素质出发,引导孩子掌握多方面的软知识,软技能。其中有一个比较新颖的游戏玩法------打猎。该玩法创新点在于,引入了食物链的概念。过去一般的游戏里,打猎场景里面的动物都是源源不断。这跟现实生活严重脱节。我研发的这个小游戏,希望能通过参考现实生活的生态系统功能,既能保证每种动物能以一定的繁殖速度增加种群数量,也会因为被天敌或者玩家猎杀,而导致数量紧剧下降,最终导致整个生态系统崩塌。通过这样的设定,来教育小朋友要保护好我们的生态环境。

既然涉及到食物链,一个不得不提的问题是,天敌与下游动物此消彼长的数量关系。一个很自然的想法就是,只要下游动物的繁殖速度足够快,大于天敌自身种群数量以及其增长速度。种群的数量应该是比较平稳的。但事实上是这样的吗?

下面是我的一组测试数据,我模拟了兔子和老虎种群数量的对应关系。假设兔子的种群数量为120,老虎的种群数量为10,兔子和老虎的繁殖率均为1.1。每只老虎每天都要吃一只兔子。按道理每天兔子新增的数量都会比老虎的数量加新增数要多。从上面的推测来看,兔子的数量应该是平稳的。但实测结果是:

1天:当前兔子120.0只,老虎10.0只,相差110.0

2天:当前兔子121.0只,老虎11.0只,相差110.0

3天:当前兔子121.0只,老虎12.0只,相差108.0

4天:当前兔子119.0只,老虎13.0只,相差106.0

5天:当前兔子117.0只,老虎14.0只,相差102.0

6天:当前兔子112.0只,老虎16.0只,相差96.0

7天:当前兔子106.0只,老虎17.0只,相差88.0

8天:当前兔子97.0只,老虎19.0只,相差77.0

9天:当前兔子85.0只,老虎21.0只,相差64.0

10天:当前兔子70.0只,老虎23.0只,相差47.0

11天:当前兔子51.0只,老虎25.0只,相差25.0

12天:当前兔子28.0只,老虎28.0只,相差0.0

上面的数据中免子当天的数量=(免子上一天的数量老虎上一天的数量)*繁殖率。为了数据精确,动物的数量都使用浮点数。只是打印的时候,以下取了个整,实测结果表明,虽然兔子撑过了两轮攻击,但随着老虎数量的持续上升,兔子的数量开始出现了明显的下滑。

这证明之前的思路有问题。但到底怎么设计这个增长速度才比较合理?众所周知,计算机能处理的数据是有限。如果疯狂给兔子叠繁殖BUFF,兔子的数据很快就会溢出(指数爆炸)。那么,怎么定这个增长速度才比较合理呢?这就需要借助数学的力量。

首先,我们必须给上述场景来个数学建模。上面的问题是一个经典的迭归函数定义。为了数学推导的通用性,假设兔子的初始数量为a,繁殖率为q,老虎的数量为b,繁殖率为p,容易得出关于兔子数量的迭推公式:

现假定F(0)=a

F(x)= ( f(x - 1) – b * p ^ x – 1 ) * q

现在我们希望兔子至少能存活x天。即f(x)>0.

qa >0

f(x – 1) > b * p ^ (x - 1)

换下元有:f(x) > b* p ^ x

下面我们尝试把迭推公式展开,我们留意到

f(1)=(a-b) * q

f(2) = ((a – b) * q – b * p ) * q

= (a * q – b (q + p)) * q

f(3) = ((a * q – b (q + p )) * q – b * p ^ 2) * q

     = (a * q ^ 2 – b( q ^2 + q * p + p ^ 2)) * q

……

由此,一个大胆的想法就出来了,根据上述规律,兔子种群函数会不会是:

fx=a* qx-1-b*i=1xqx-ipi-1*q    1

下面使用数学归纳法证明,设有f(k)为

fk=a* qk-1-b*i=1kqk-ipi-1*q

由迭推公式得f(k + 1)

fk+1=fk-b*pk*q

将f(k)的展开式代入得

fk+1=a* qk-1-b*i=1kqk-ipi-1*q-b*pk*q

简单处理下,即得:

fk+1=a* qk+1-1-b*i=1kqk+1-ipi-1+ pk*q

通过观察,容易发现最里层括号里的第1项,则好是

ik+1qk+1-ipi-1

的前k项,而第2项刚好是上式的最后一项。因此合并后即得

fk+1=a* qk+1-1-b*i=1k+1qk+1-ipi-1*q

满足我们猜想的形式,命题得证!f(x)的迭推公式展开式即为(1)式

留意到(1)式最内层的括号的累加式,实为首项q ^ x - 1,公比为p/q的等比数列的累加和。由等比数列的求程公式即得进一步化简后的公式(m=p/q)

fx=qx*(a-b* mx-1m-1)   (2)式

上机测试一下,令兔子开始的数量为a = 100,老虎的数量为b=10,兔子增殖率q = 4,老虎增殖率为 p=2。得到如下结果。

n=10.0,a=100.0,q=4.0,b=10.0,p=2.0

1天:当前兔子100.0只,老虎10.0只,最后剩90.0,扩展式计算结果:100.0

2天:当前兔子360.0只,老虎20.0只,最后剩340.0,扩展式计算结果:360.0

3天:当前兔子1360.0只,老虎40.0只,最后剩1320.0,扩展式计算结果:1360.0

4天:当前兔子5280.0只,老虎80.0只,最后剩5200.0,扩展式计算结果:5280.0

5天:当前兔子20800.0只,老虎160.0只,最后剩20640.0,扩展式计算结果:20800.0

6天:当前兔子82560.0只,老虎320.0只,最后剩82240.0,扩展式计算结果:82560.0

7天:当前兔子328960.0只,老虎640.0只,最后剩328320.0,扩展式计算结果:328960.0

8天:当前兔子1313280.0只,老虎1280.0只,最后剩1312000.0,扩展式计算结果:1313280.0

9天:当前兔子5248000.0只,老虎2560.0只,最后剩5245440.0,扩展式计算结果:5248000.0

10天:当前兔子2.098176E7只,老虎5120.0只,最后剩2.097664E7,扩展式计算结果:2.098176E7

完美!证明展开式是对的。

有了(2)式,就可以回到前面的讨论,如何令f(x) > 0

q > 0

a>b* mx-1m-1

这里针对m可能的值,分开讨化。

当p > q时,m >1,m^x随着x变大,不等式右边是一个迭增函数。因此,不等式终究会不成立。

如果p < q, m < 1,

不等式变换为:

a>b* 1-mx1-m

m^x随着x变小,1-m^x的值增大,不等式右边还是一个迭增函数。因为0<m^x<1。所以只需要保证a>=b/(1-m)。就可以保证兔子永远不会被灭绝

有了上述数学结论,游戏里面就只需要设置好兔子的增殖率和老虎的数量,增殖率,就可算出兔子的初始种群a,使其一定不会灭绝。同时,也可以通过调整增殖率让动物的数量保持在一定范围,不会导致程序数据溢出。游戏整个生态系统的稳定性就有了理论上的保障。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/140832.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

时间复杂度、空间复杂度

一、时间复杂度 1、概念 时间复杂度&#xff1a;计算的是当一个问题量级增加的时间&#xff0c;时间增长的趋势&#xff1b; O&#xff08;大O表示法&#xff09;&#xff1a;渐进的时间复杂度 2、举例 ① 以下 for 循环的时间复杂度&#xff1a;O(1 3n) O(n) 去掉常数…

查看吾托帮88.47的docker里的tomcat日志

步骤如下 &#xff08;1&#xff09;ssh &#xff08;2&#xff09;ssh root192.168.88.47 等待输入密码&#xff1a;fytest &#xff08;3&#xff09;pwd #注释&#xff1a;输出/root &#xff08;4&#xff09;docker exec -it wetoband_deploy /bin/bash #注释&#xff1…

nginx实现反向代理实例

1 前言 1.1 演示内容 在服务器上访问nginx端口然后跳转到tomcat服务器 1.2 前提条件 前提条件&#xff1a;利用docker安装好nginx、tomcat、jdk8&#xff08;tomcat运行需要jdk环境&#xff09; 只演示docker安装tomcat&#xff1a; 默认拉取最新版tomcat docker pull t…

【vue2第二十章】vuex使用 (state,mutations,actions,getters)

vuex是什么&#xff1f; Vuex是一个用于Vue.js应用程序的状态管理模式。它允许您在应用程序中管理共享状态&#xff0c;并以可预测的方式进行状态更新。Vuex集成了Vue的响应式系统&#xff0c;使得状态的变化能够自动地更新视图。使用Vuex&#xff0c;您可以将应用程序的状态集…

【论文阅读 07】Anomaly region detection and localization in metal surface inspection

比较老的一篇论文&#xff0c;金属表面检测中的异常区域检测与定位 总结&#xff1a;提出了一个找模板图的方法&#xff0c;使用SIFT做特征提取&#xff0c;姿态估计看差异有哪些&#xff0c;Hough聚类做描述符筛选&#xff0c;仿射变换可视化匹配图之间的关系&#xf…

如何使用ArcGIS Pro自动矢量化道路

对于已经制作好的电子地图&#xff0c;我们可以通过像素识别的方式将其中的要素提取出来&#xff0c;比如本教程要讲到的道路数据&#xff0c;这里为大家介绍一下在ArcGIS Pro中如何自动矢量化道路&#xff0c;希望能对你有所帮助。 栅格计算 在工具箱中点击“Spatial Analys…

【AIGC】Llama2-7B-Chat模型微调

环境 微调框架&#xff1a;LLaMA-Efficient-Tuning 训练机器&#xff1a;4*RTX3090TI (24G显存) python环境&#xff1a;python3.8, 安装requirements.txt依赖包 一、Lora微调 1、准备数据集 2、训练及测试 1&#xff09;创建模型输出目录 mkdir -p models/llama2_7b_chat…

unity gb28181 rtsp 视频孪生图像拉流和矫正插件(一)

目的是为了视频孪生&#xff0c;将视频放到三维里面&#xff0c;如果使用自己写的插件&#xff0c;有更好的灵活性&#xff0c;同时断线重连等等都更好控制了。 1、矫正算法和硬件解码 最好使用opencv制作&#xff0c;可以使用opencv的cuda加速&#xff0c;opencv的编译&…

面试题:RocketMQ 如何保证消息不丢失,如何保证消息不被重复消费?

文章目录 1、消息整体处理过程Producer发送消息阶段手段一&#xff1a;提供SYNC的发送消息方式&#xff0c;等待broker处理结果。手段二&#xff1a;发送消息如果失败或者超时&#xff0c;则重新发送。手段三&#xff1a;broker提供多master模式&#xff0c;即使某台broker宕机…

聚观早报 | 杭州亚运开幕科技感拉满;腾讯官宣启动「青云计划」

【聚观365】9月25日消息 杭州亚运开幕科技感拉满 腾讯官宣启动「青云计划」 FF任命新全球CEO 比亚迪夺得多国销冠 iPhone 15/15 Pro销售低于预期 杭州亚运开幕科技感拉满 杭州第19届亚洲运动会开幕式23日晚在杭州奥体中心主体育馆举行&#xff0c;这届开幕式可谓科技感拉…

基于Yolov8的野外烟雾检测(2):多维协作注意模块MCA,效果秒杀ECA、SRM、CBAM等 | 2023.9最新发布

目录 1.Yolov8介绍 2.野外火灾烟雾数据集介绍 3.MCA介绍 4.训练结果分析 5.系列篇 1.Yolov8介绍 Ultralytics YOLOv8是Ultralytics公司开发的YOLO目标检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最先进的&#xff08;SOTA&#xff09;模型&#xff0c;它建立在先前…

【Vue】vue-cli一站式搭建SPA项目

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Vue快速入门》。&#x1f3af;&#x1f3af; &…

Python:获取当前目录下所有文件夹名称及文件夹下所有文件名称

获取当前目录下所有文件夹名称 def get_group_list(folder_path):group_list []for root, dirs, files in os.walk(folder_path):for dir in dirs:group_list.append(dir)return group_list获取文件夹下所有文件名称 def get_file_list(folder_path, group_name):file_list …

[Linux入门]---进程的概念

文章目录 1.进程的概念①描述进程-PCB②task_struct-PCB的一种③task_ struct内容分类 2.查看进程3.通过系统调用获取进程表示符4.通过系统调用创建进程---fork初识 1.进程的概念 在我们的电脑开机的时候&#xff0c;操作系统会被加载到内存中&#xff0c;点击多个应用进行时&a…

机器学习第十四课--神经网络

总结起来&#xff0c;对于深度学习的发展跟以下几点是离不开的: 大量的数据(大数据)计算资源(如GPU)训练方法(如预训练) 很多时候&#xff0c;我们也可以认为真正让深度学习爆发起来的是数据和算力&#xff0c;这并不是没道理的。 由于神经网络是深度学习的基础&#xff0c;学…

基于SSM的高校图书馆个性化服务的设计与实现(有报告)。Javaee项目。

演示视频&#xff1a; 基于SSM的高校图书馆个性化服务的设计与实现&#xff08;有报告&#xff09;。Javaee项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过S…

前端JavaScript中的 == 和 ===区别,以及他们的应用场景,快来看看吧,积累一点知识。

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 一、等于操作符 二、全等操作符 三、区别 小结 一、等于操作符 等于操作符用两个等于号&#xff08; &am…

GaussDB数据库SQL系列-定义重载函数

目录 一、前言 二、函数重载的定义 三、GaussDB创建自定义函数的事项说明 四、GaussDB数据库中的自定义函数示例 示例一&#xff1a;创建package属性重载函数&#xff0c;根据不同的SQL条件获取生成视图 示例二&#xff1a;创建package属性重载函数&#xff0c;根据不同的…

SpringMVC+入门案例

一、入门案例 1.依赖导入 <!--1. 导入SpringMVC与servlet的坐标--> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scop…

uni-app:实现元素中实现竖直居中

效果展示 前&#xff1a; 后&#xff1a; 未实现前代码 <template><view class"container"><view class"centered-element">我是要被居中的元素</view></view> </template><script>export default {data() {r…