首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Netlogo:基于斑块值的海龟死亡概率

Netlogo:基于斑块值的海龟死亡概率
EN

Stack Overflow用户
提问于 2021-11-23 17:31:52
回答 1查看 50关注 0票数 0

我正在创建一个netlogo模型,以演示植物通过epizoochory传播的过程(种子附着在衣服或鞋子上,然后落在其他地方)。

摘要:我有两个品种: 1.徒步旅行者和2.苗木。每个徒步旅行者每隔一刻就孵化出一株树苗。每个补丁都有一个介于0和1之间的随机值。徒步旅行者产生苗子代理,然后要求苗子以等于补丁值的概率死亡。

我现在的目标是:一旦‘树苗’品种从‘远足者’品种孵化出来,我需要树苗有机会根据补丁的价值而死亡。换句话说,我会让树苗死亡,这取决于它孵化的斑块的价值。

场景示例:“种苗”品种是从“远足”品种孵化出来的,值为0.7。因此,苗木有70%的存活机会和30%的死亡机会。

下面是一个基本的“场景”,可以用来帮助解决问题。注意,我需要在“询问苗子死亡的机会”方面得到帮助。

非常感谢!

代码语言:javascript
复制
patches-own [value]

breed [hikers hikes]
breed [seedlings seedling]

hikers-own [hiker-seed]


to setup
  clear-all
  ask N-of 500 patches [set pcolor red]
  ask N-of 500 patches [set pcolor blue]
  
ask patches [
  if pcolor = blue [set value  0.5]
  if pcolor = red [set value  0.9]
  if pcolor = black [set value 0.1]
  ]
  
  create-hikers 10 [
    setxy random-ycor random-xcor
    set size 2
    set color yellow
    set shape "person"
    set hiker-seed 10
  ]
  reset-ticks
end

to go
  ask hikers [drop-seeds]
  
  ask seedlings [chance-to-die]
end
  
to drop-seeds
  ask hikers [hatch-seedlings 1 [set pcolor white set size 2 set shape "plant"]]
end

to chance-to-die
  *here is where the code would go that is something like:
  
  ask seedlings [have the probability of death = patch-value]
end
EN

回答 1

Stack Overflow用户

发布于 2021-11-23 22:11:05

简短的回答

您只需执行以下操作:

代码语言:javascript
复制
to chance-to-die
  if (random-float 1 < value) [die]
end

重要的相关思想

之所以如此,是因为每个海龟都可以直接读取(和修改)它所在补丁的补丁本身的变量。在您的示例中,这意味着每个苗木能够读取它所在的补丁的value,而不必指定该补丁。

无论如何,请注意您所说的与您的代码所做的是不同的。你说过,你希望每一棵由徒步旅行者孵化出来的新苗,要么死亡,要么留下来,根据补丁-自己的value。但是,在您的代码中,to chance-to-die是作为to go的一部分调用的,在这里您可以使用ask seedlings [chance-to-die]。这意味着,在to go的每一次迭代中,您都会要求所有的种子(包括那些尚未孵化的种子)执行to chance-to-die。更像你的话的代码应该是这样的:

代码语言:javascript
复制
to go
  ask hikers [
    drop-seeds
  ]
end

to drop-seeds
  hatch-seedlings 1 [
    chance-to-die
    set pcolor white
    set size 2
    set shape "plant"
  ]
end

to chance-to-die
  if (random-float 1 < value) [die]
end

现在,通过这种不同的排列,只有新的种子执行to chance-to-die,而不是所有的种子(例如:不是从以前的迭代中存活下来的种子)。

请注意,在任何情况下都不应在to chance-to-die中包含ask seedlings,因为此过程是从hatch-seedlings命令块调用的。这意味着每个新的种子一旦创建,就会自动执行to chance-to-die。在to chance-to-die中包含ask seedlings将导致每个新的苗子都要求每个其他的苗子执行该操作。(类似和等价的推理也适用于您的初始示例,其中您使用了ask seedlings [chance-to-die]。通常,请始终确保您不会重复询问!)

最后一个建议:在风格礼仪方面,最好将所有命令过程(例如,以to开头的命令过程;而不是以to-report开头的reporter过程)命名为动词(例如:to check-death-probability)。

额外的思考

这可能有些夸张,但它突然出现在我的脑海中,我忍不住把它贴了出来。

如果你是一个效率狂热者,那么按照下面的方法做会更有效率:

代码语言:javascript
复制
to go
  ask hikers [
    if (random-float 1 >= value) [
      drop-seeds
    ]
  ]
end

to drop-seeds
  hatch-seedlings 1 [
    set pcolor white
    set size 2
    set shape "plant"
  ]
end

请注意,在这种安排中没有to chance-to-die程序,但检查是在上游执行的,即在徒步旅行者孵化之前。这将是更有效的,因为在这些情况下,当苗木不必存活时,NetLogo 将不会必须创建苗木(通过hatch-seedling 1),只需使其在一秒钟后死亡。相反,在这些情况下,条件(random-float 1 >= value)将计算为FALSE (注意不等式中的方向变化,从通常的<>=),并且徒步旅行者将跳过包含drop-seeds的命令块。

我并不是说这种效率提升会有什么实际的不同(除非你有一个巨大的模型,有大量的drop-seeds调用),但我只是想指出两个原因:

  1. 你可能是那些从知道已经执行了这种修复方法中获得宁静和满足的人中的一员(即使有人可能会理所当然地评论这对mental health);
  2. Perhaps不好,但更重要的是,这是一个很好的、可转移的方式来理解如何考虑提高你的NetLogo模型的性能。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70085313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档