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

news2025/1/13 2:59:15

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

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

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

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

相关文章

【C++】STL之list深度剖析及模拟实现

目录 前言 一、list 的使用 1、构造函数 2、迭代器 3、增删查改 4、其他函数使用 二、list 的模拟实现 1、节点的创建 2、push_back 和 push_front 3、普通迭代器 4、const 迭代器 5、增删查改(insert、erase、pop_back、pop_front) 6、构造函数和析构函数 6.1、默认构造…

BGP-IBGP(第九课)

BGP-IBGP(第九课) 0 IBGP 水平分割的概念 1 BGP 反射器 2 IBGP 互联不了的原因 3 BGP 通告原则 4 IBGP 互通 方案一 静态路由 5 IBGP 互通 方案二 OSPF 中引入BGP 6 IBGP 互通 方案三 全网互通 7 IBGP 互通 方案四 反射器 0 IBGP 水平分割的概念 通过IBGP获得的最优路由不会发…

网页文本编辑器

<!DOCTYPE html> <html><head><meta charset"utf-8"><title>文本编辑器</title><style>.box {height: 500px;width: 1000px;margin: auto;background-color: navajowhite;}.box_h {/* font-weight: normal; */text-al…

基于springboot小区疫情防控系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

前端性能优化汇总

1.减少HTTP请求次数和请求的大小 &#xff08;三大类&#xff09; 文件的合并和压缩&#xff1a;&#xff08;1&#xff09;&#xff08;6&#xff09; 延迟加载&#xff1a;&#xff08;3&#xff09;&#xff08;4&#xff09; 用新的文件格式代替传统文件格式&#xff1a;&a…

百度SEO优化基本原理(掌握SEO基础,提高网站排名)

随着互联网的迅速发展&#xff0c;越来越多的企业开始意识到网站优化的重要性&#xff0c;其中百度SEO优化是企业不可忽视的一项工作。本文将介绍百度SEO优化的基本概念、步骤、原理、解决方法和提升网站标题优化的方法。蘑菇号-www.mooogu.cn 百度SEO优化是指针对百度搜索引擎…

[源码系列:手写spring] AOP第一节:切点表达式

在本专栏之前的文章中已经带大家熟悉了Spirng中核心概念IOC的原理以及手写了核心代码&#xff0c;接下来将继续介绍Spring中另一核心概念AOP。 AOP即切面编程是Spring框架中的一个关键概念&#xff0c;它允许开发者在应用程序中优雅地处理横切关注点&#xff0c;如日志…

c++程序内存区域划分

目录 内存区域划分 例题&#xff1a; malloc&#xff0c;calloc和realloc的区别 new和delete 申请空间并初始化 申请多个空间&#xff1a; new和delete对于自定义类型的处理&#xff1a; new和delete一定要匹配 new和malloc以及delete和free的区别 抛异常的使用方法&…

ubuntu 开启笔记本摄像头并修复画面颠倒问题

文章目录 基本环境状况&#xff1a; 没找到摄像头检查 opencv检查系统应用 键盘右侧&#xff0c;硬件层面开启摄像头画面镜像问题 基本环境 笔记本&#xff1a; 联想拯救者 系统&#xff1a; ubuntu 22.04 状况&#xff1a; 没找到摄像头 检查 opencv 使用 cv::VideoCaptu…

vue elemnt封装文件上传 +根据后台接口来上传文件

1.创建一个新的子页面,放文件上传 <template> <div><el-uploadaction"https://jsonplaceholder.typicode.com/posts/"list-type"picture-card":on-preview"handlePictureCardPreview":on-remove"handleRemove">&l…

7.网络原理之TCP_IP

文章目录 1.网络基础1.1认识IP地址1.2子网掩码1.3认识MAC地址1.4一跳一跳的网络数据传输1.5总结IP地址和MAC地址1.6网络设备及相关技术1.6.1集线器&#xff1a;转发所有端口1.6.2交换机&#xff1a;MAC地址转换表转发对应端口1.6.3主机&#xff1a;网络分层从上到下封装1.6.4主…

交换机技术综述(第十一课)

交换机技术综述基础 1 Vlan技术的学习 三大接口 Vlan技术实操(第四课)_IHOPEDREAM的博客-CSDN博客https://drean.blog.csdn.net/article/details/132455765?spm=1001.2014.3001.5502

论文阅读:DisCO Portrait Distortion Correction with Perspective-Aware 3D GANs

论文阅读&#xff1a;DisCO Portrait Distortion Correction with Perspective-Aware 3D GANs 今天介绍一篇比较有趣的文章&#xff0c;通过 3D GAN inversion 来解决成像的透视畸变问题 Abstract 文章的摘要&#xff0c;一开始就介绍说&#xff0c;近距离成像的时候&#x…

【3维视觉】20230922_网格编码最新进展

网格编码技术研究进展 1. VDMC编码技术 1.1 VDMC介绍 1.1.1 编码对象 具有时变拓扑的动态网格 1.1.2 技术细节 VDMC的编码和解码过程的高层框图如图2所示[4][5]。预处理模块提供了更好的率失真( Rate-Distortion&#xff0c;RD )性能&#xff0c;支持可伸缩解码和渐进传输…

Minecraft 1.20.x Forge模组开发 06.建筑生成

我们本次尝试在主世界生成一个自定义的建筑。 效果展示 效果展示 效果展示 由于版本更新缘故,1.20的建筑生成将不涉及任何Java包的代码编写,只需要在数据包中对建筑生成进行自定义。 1.首先我们要使用游戏中的结构方块制作一个建筑,结构方块使用教程参考1.16.5自定义建筑生…

记一次hyperf框架封装swoole自定义进程

背景 公司准备引入swoole和rabbitmq来处理公司业务。因此&#xff0c;我引入hyperf框架&#xff0c;想用swoole的多进程来实现。 自定义启动服务封装 <?php /*** 进程启动服务【manager】*/ declare(strict_types1);namespace App\Command;use Swoole; use Swoole\Proce…

软考知识产权基础知识

商标权可以根据需要无限延长 根据《商标法》的规定&#xff0c;商标的有效期为10年&#xff0c;自商标注册之日起计算。有效期届满后&#xff0c;可以递交商标续展申请。每次续展的有效期为10年。但是&#xff0c;商标续展仅限于最后一年有效期也就是期满前六个月内提交申请。…

服务注册发现_actuator微服务信息完善

SpringCloud体系里的&#xff0c;服务实体向eureka注册时&#xff0c;注册名默认是IP名:应用名:应用端口名。 问题&#xff1a; 自定义服务在Eureka上的实例名怎么弄呢 在服务提供者pom中配置Actuator依赖 <!-- actuator监控信息完善 --> <dependency><groupId…

011_第一代软件开发(三)

第一代软件开发(三) 文章目录 第一代软件开发(三)项目介绍带下知识点系统日志滤波器陷波滤波器带通滤波器 打印初始化调用打印机打印文件保存到PDF 总结一下 关键字&#xff1a; Qt、 Qml、 日志、 打印、 滤波器 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这…

排序算法:非比较排序(计数排序)

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关排序算法的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通…