Node.js的Predator-Prey模型

最近,通过网络对游戏“ 生活”的引用激增,这主要是由于其创建者死亡。

现在是时候了,每个人都对生物学产生了兴趣,到处都是这些生存时间表,好吧,我突然从记忆中走出了一个有趣的模型,据我曾经写过一个学期论文。

该模型与生命相似,因为它是一个循环过程,可以看作是一场大火,无休止地冥想并反思永恒。

这是Predator-victim这是应用数学中非常严肃的模型(英语国家的Predator-prey)。

该过程的本质是,在某个森林中生活着一群鹿(在另一种版本中是兔子,但不是本质),它们会在野外觅食并疯狂繁殖,迟早会填满整个领土。

但是,在同一森林中,也有捕食这些鹿的食肉动物(狼,但通常是野兔,通常是狐狸)。

在这个茂密的森林中发现的一对捕食者按照马尔萨斯法则成倍地繁殖,但是到了某个时候,鹿的资源开始枯竭,狼开始饿死而死,参展商迅速飞下来,只有最顽强的动物在那里生存。

鹿被逼到一个角落,抬起头,打开他们的参展商,开始统治森林,但幸存下来的鲜肉狼群却为新一轮的生育力找到了力量……以此类推。

这是一张图表(从Wikipedia提取):



此过程数学模型在20世纪初由Lotka和Volterra描述,并以它们命名。

为什么这种模式已经存在了一百年并且仍然有意义?

主要有两个原因:它非常简单,并且非常实际地描述了该过程。

该模型只有四个参数:

  • alpha)鹿的繁殖率
  • beta)狼吃鹿的速度
  • γ)饥饿的狼的灭绝速度
  • 三角洲)狼的繁殖率

该模型包含最小的非线性,并且经过分析考虑。通过精心选择的参数,它很稳定(鹿和狼都不会消亡到最后),并且可以真实地描述种群波动的动态。

一百多年来,已经进行了许多尝试以使某些事情变得更现实-但是复杂性的任何增加都会导致更高级别的非线性系统,然后一切都取决于不可渗透的积分方程,这些方程只能通过数值方法来求解。

还有另一种方法-只需将此过程编程为游戏即可。

实际上,这种方法称为多主体建模,非常适合通过课程。

选择技术


我希望该程序不仅在作者的机器上,而且在尽可能多的受众上都具有可视化效果,并且应该全部以自己的方式进行,而无需花费太多精力。
解决方案是在浏览器中运行该程序,这是合乎逻辑的,因此,您必须使用javascript编写该程序。

好吧,为了不产生技术动物园,我们还将在其上编写服务器。在github

描述了安装node.js以及所有需要的一切的标准步骤

鹿成长模型


我们传递到最有趣的-复制。如果没有掠食者,我们将在资源有限的情况下拥有马尔萨斯模型(在数学世界中,逻辑模型由对数函数或Verhulst方程描述),现在需要以某种方式将其应用于智能体。

可以为每只鹿选择概率系数,一切都应该算出来。
但是,代理程序建模是好的-您可以指定行为而不必将自己限制于几个因素。

通常,鹿的生活模型如下所示:

  • 鹿需要移动。不能随时间推移而变化的鹿死了(他也不能仅仅因为周围所有的笼子都被他的朋友占据而做出变化)。
  • , , .

  breed(u) {
    var spots = MapUtil.get_adj(u.point, this.W, this.H)
    if (!spots || spots.length < 1)
      return false
    var free = spots.filter(p => !this.GM.get(p))
    if (free.length < spots.length)
      return false
    var spot = _.sample(spots)
    if (!spot)
      return false
    var born = new Wild(u.kind)
    born.move(spot)
    this.add_wild(born)
    this.born.push(born)
  }

接下来,我们将制作一个简单的测试应用程序,该应用程序将创建一个20x20的森林世界,在最中央启动鹿,并运行100个周期,每次在csv中打印状态。

我们将生成的csv文件驱动到Google Spreadsheet中,并生成一个图形:



这是一个相当大的指标。我们看到鹿的数量稳定在200头以上,这可以通过以下事实轻松解释,即需要移动至少需要两个笼子来饲养鹿,整个森林的面积为400头。

最大的增长发生得很早-在14-15步,最后20步静止不动,略有波动。

总的来说,我想强调的是,最简单的主体模型的行为非常现实,非常类似于被轻微噪声稀释的逻辑曲线。

但是我们来这里并不是为了获得数字,而是为了您可以观看和放松的图片。

因此,是时候制作一个包含地图和图形的页面,并将模型运行转移到服务器上了。

我们放置了express和socket.io,我们将直接在html5 canvas上绘制(我对js引擎并不熟悉,任务也不是很困难)。

我们对鹿在几次迭代中实际上是如何淹没森林,然后在最大值附近渐近波动感到担忧。



一方面,这只是一个模型,但是在某些地方,这是一个真正的问题-只是Google 鹿人数过多,并且对与此主题相关的大量材料感到惊讶。

这种模式没有考虑到森林的退化,但实际上鹿是贪婪的消费者-他们吃芽,践踏地面并普遍破坏森林。

在这种情况下,林主应该怎么做?

他买了狼,在每只狼上悬挂了一个GPS传感器,并祈祷它们不会消失。

狼队


是时候将狼引入我们的模型了。

需要确定两件事-狼如何进食和繁殖。

有人时很容易打猎-如果附近的笼子里有鹿-就吃吧。

如果没有鹿,那么您可以生存一段时间。

首先,假设一举一动都可能有一只狼,但如果分两步走,就不可能-进化的一面。

随着更多选择的增加。

首先-我们删除美味佳肴,让狼在有空闲空间时始终繁殖。

并增加一个限制-饥饿的狼不会繁殖。

第一煎饼


让鹿稍微繁殖一下,然后将狼扔进人群中:



模型变了,说起来又温和又不稳定-狼立即割掉了所有鹿,很快就死了。

一无奈,无禅。

第二次尝试


需要更改某些内容。

狼繁殖出的爆炸性令人眼花the乱。

让他们的生活复杂一些-我们设定了一个条件,即只有相邻鹿细胞中的鹿比狼多时,才有可能繁殖。

    var preys = spots.map(p => this.GM.get(p)).filter(u => u && u.kind == Wilds.DEER)
    var preds = spots.map(p => this.GM.get(p)).filter(u => u && u.kind == Wilds.WOLF)
    if (preys.length <= preds.length)
      return false

当鹿的数量达到最大值时,放弃狼群。

这个尝试成功了很多。

食肉动物和受害者的平衡一直在变化,鹿的数量已大大减少,现在甚至还没有达到最大。



但是,任何事情都会发生,几乎每一次狼都设法消亡,而鹿又一次胜利地填满了灌木丛。

在这种情况下,狼持续了很长时间:



第三圈


我们将不得不更加严格地拧紧育种螺母。

现在,我们说明这种情况:附近一定有鹿,但没有狼。
这种温和的狼不容忍竞争。

系统更加稳定。

与上一张图相比,鹿和狼都使峰平滑。



通常,很明显应该采取什么行动才能获得与Wikipedia上相同的时间表。
结果,我们得出一个平庸的结论-我们必须有意识地繁殖,而不是最大程度地繁殖。
听起来像是享乐主义的广告,但您可以期望“改善其生活质量和寿命”来进一步降低狼的生育力...



部署方式


作为结尾,请部署说明。

它非常简短:

1.我们编写了一个简单的docker文件:

FROM node:14
ADD https://github.com/tprlab/predator-prey/archive/master.zip /
RUN unzip /master.zip
WORKDIR /predator-prey-master
RUN npm install
EXPOSE 8081
CMD ["node", "server.js"]

2. Docker构建。-t predator-prey

3. docker run -p 8081:8081 predator-prey

对于最懒惰的人,我收集了该映像并将其上传到Docker Hub。

如果您不希望与docker发生冲突,请在回购页面(从下面的链接)开始重新安装。

参考文献



All Articles