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

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

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

下面是我的一组测试数据,我模拟了兔子和老虎种群数量的对应关系。假设兔子的种群数量为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.xdnf.cn/news/141294.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【工作记录】springboot集成aop实现日志@20230918

springboot集成aop实现日志 1. 添加依赖 <!-- aop 依赖 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>2. 定义注解 Target(ElementType.METHOD)…

Vue.js 2 —组件(Component)化编程

一、模块与组件 模块 1. 理解 : 向外提供特定功能的 js 程序, 一般就是一个 js 文件 2. 为什么 : js 文件很多&#xff0c;很复杂 3. 作用 : 复用 js, 简化 js 的编写, 提高 js 运行效率 组件 组件是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素&#xff0c;封装…

javascript数据类型错误造成的前端分页不准的问题

有个react项目是自己写的mock后端api&#xff0c;使用的是json文件模拟DB, slice函数模拟分页&#xff0c;但是在实际分页时&#xff0c;发现了分页不准的问题&#xff0c;现象如下&#xff1a; 当pageSize为5的时候&#xff08;共16条数据&#xff09;&#xff0c;总共分4页&…

nginx实现反向代理实例

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

闪光激光雷达实现无人驾驶导航

一艘宇宙飞船盘旋在灰色、布满陨石坑的月面上&#xff0c;扫描着它的着陆点&#xff0c;然后&#xff0c;在火箭的火焰中&#xff0c;扬起大量尘埃的火焰中&#xff0c;着陆器“墨菲斯”安全稳定地下降到一个空旷的地方。在布满碎石的岩石表面。 事实上&#xff0c;2014 年的这…

【C# Programming】值类型、良构类型

值类型 1、值类型 值类型的变量直接包含值。换言之&#xff0c; 变量引用的位置就是值内存中实际存储的位置。 2、引用类型 引用类型的变量存储的是对一个对象实例的引用&#xff08;通常为内存地址)。 复制引用类型的值时&#xff0c;复制的只是引用。这个引用非常小&#xf…

测试工程师需要具备哪些“技能”?

1、良好的沟通 相信大家都在网上看到过各种吐槽程序员不解风情的段子&#xff0c;开怀大笑之余深思&#xff0c;作为一个测试工程师又何尝不是如此&#xff1f;通常沟通技能成为横亘在测试工程师与其他合作部门之间的万丈鸿沟&#xff0c;也成为测试工程师成长的最大瓶颈。下面…

84、Redis客户端-->可视化图形界面工具(Another Redis Desktop Manager)的下载、安装及初步使用

Redis客户端–>可视化图形界面工具(Another Redis Desktop Manager)的下载、安装及初步使用 ★ Redis客户端&#xff1a; ▲ Redis自带的命令行工具&#xff08;简陋&#xff09;&#xff1a; CLI工具&#xff0c;重新打开一个命令行窗口&#xff0c;在其中输入如下命令&…

Java基础(四)

前言&#xff1a;本博客主要涉及java编程中的线程、多线程、生成者消费者模型、死锁。 目录 线程多线程 线程同步 synchronized Lock锁 线程通信 生产者消费者模型 线程池 使用线程池处理Runnable任务 使用线程池处理Callable任务 Excutors 悲观锁 乐观锁 并发VS并…

迅为iTOP-RK3568开发板Sobel 算子边缘检测

本小节代码在配套资料“iTOP-3568 开发板\03_【iTOP-RK3568 开发板】指南教程 \04_OpenCV 开发配套资料\32”目录下&#xff0c;如下图所示&#xff1a; Sobel (索贝尔)算子是计算机视觉领域的一种重要处理方法。主要用于获得数字图像的一阶梯度,常见的应用和物理意义是边缘检…

3D目标检测实战 | 图解KITTI数据集与数据格式

目录 1 数据集简介2 传感器坐标系3 数据集下载与组织4 数据内容说明4.1 矫正文件calib4.2 图像文件image4.3 点云文件velodyne4.4 标签文件label4.5 平面文件plane 1 数据集简介 KITTI数据集是一个广泛应用于自动驾驶和计算机视觉领域的公开数据集。该数据集由德国卡尔斯鲁厄理…

【Vue】ElementUI实现登录注册

目录 一.跨域的概述 1.1.概述 1.2.特点 二.ElementUI 2.1. 导入 2.2.搭建 2.3.页面 三.数据交互 3.1.安装相关模块 3.1.1安装模块 3.1.2查看模块 3.1.3.引用模块 3.2. axios的get请求 3.3. axios的post请求 四.注册功能 好啦今天到这了&#xff0c;希望能帮到你&…

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

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

Redis 缓存雪崩、缓存穿透、缓存击穿

Redis 是一种常用的内存缓存工具&#xff0c;但在某些情况下&#xff0c;它可能会遭受缓存雪崩、缓存穿透和缓存击穿等问题。下面是一些预防这些问题的建议&#xff1a; 1、缓存雪崩 缓存雪崩指的是在某个时间点上&#xff0c;大量的缓存数据同时失效或过期&#xff0c;导致大…

从管易云到金蝶云星空通过接口配置打通数据

从管易云到金蝶云星空通过接口配置打通数据 数据源平台:管易云 管易云是上海管易云计算软件有限公司旗下的专注提供电商企业管理软件服务的品牌&#xff0c;总部位于中国上海张江高科技产业园区。管易云旗下拥有管易云C-ERP、EC-OMS、EC-WMS、B2C/B2B/BBC/微商城开发、PDA无纸化…

【送书】从不了解用户画像,到用画像数据赋能业务看这一本书就够了丨《用户画像:平台构建与业务实践》

系列文章目录 送书第一期 《用户画像&#xff1a;平台构建与业务实践》 文章目录 系列文章目录前言一、内容简介二、目录三、本书摘要简介总结 前言 在大数据时代&#xff0c;如何有效地挖掘数据价值并通过画像数据进行呈现&#xff0c;如何基于画像数据构建平台功能并提高业…

大数据之Hadoop

大数据 按顺序给出数据存储单位&#xff1a; bit 、 Byte 、 KB、 MB 、 GB 、 TB 、 PB 、 EB 、 ZB 、 YB 、 BB 、 NB 、 DB 。 1Byte 8bit 1K 1024Byte 1MB 1024K 1G 1024M 1T 1024G 1P 1024T Hadoop Hadoop是一个能够对大量数据进行分布式处理的软件框架。 分…

mac怎么把两张图片拼在一起

mac怎么把两张图片拼在一起&#xff1f;在如今的生活中&#xff0c;喜欢摄影的朋友们越来越多。拍照已经成为我们的一种习惯&#xff0c;因为当我们遇到美景或迷人的人物时&#xff0c;总是忍不住按下快门&#xff0c;将它们定格。随着时间的推移&#xff0c;我们渐渐发现自己的…

人工智能安全-2-非平衡数据处理(2)

5 算法层面 代价敏感&#xff1a;设置损失函数的权重&#xff0c;使得少数类判别错误的损失大于多数类判别错误的损失&#xff1b; 单类分类器方法&#xff1a;仅对少数类进行训练&#xff0c;例如运用SVM算法&#xff1b; 集成学习方法&#xff1a;即多个分类器&#xff0c;然…

数据结构--选择排序

目录 选择排序的定义 选择排序的过程 选择排序的算法实现 算法的性能分析 时间、空间复杂度 稳定性 实用性 回顾 选择排序的定义 选择排序的过程 找到最小的元素和第一个元素交换位置 得到 接下来第一个位置不用管了&#xff0c;从剩下的元素中扫描找到最小的元素放到…