我正在创建一个netlogo模型,以演示植物通过epizoochory传播的过程(种子附着在衣服或鞋子上,然后落在其他地方)。
摘要:我有两个品种: 1.徒步旅行者和2.苗木。每个徒步旅行者每隔一刻就孵化出一株树苗。每个补丁都有一个介于0和1之间的随机值。徒步旅行者产生苗子代理,然后要求苗子以等于补丁值的概率死亡。
我现在的目标是:一旦‘树苗’品种从‘远足者’品种孵化出来,我需要树苗有机会根据补丁的价值而死亡。换句话说,我会让树苗死亡,这取决于它孵化的斑块的价值。
场景示例:“种苗”品种是从“远足”品种孵化出来的,值为0.7。因此,苗木有70%的存活机会和30%的死亡机会。
下面是一个基本的“场景”,可以用来帮助解决问题。注意,我需要在“询问苗子死亡的机会”方面得到帮助。
非常感谢!
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发布于 2021-11-23 22:11:05
简短的回答
您只需执行以下操作:
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。更像你的话的代码应该是这样的:
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)。
额外的思考
这可能有些夸张,但它突然出现在我的脑海中,我忍不住把它贴了出来。
如果你是一个效率狂热者,那么按照下面的方法做会更有效率:
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调用),但我只是想指出两个原因:
https://stackoverflow.com/questions/70085313
复制相似问题