获取所有海龟死亡时的平均年龄
Get the mean age of all turtles on the time of death
我想得到所有垂死的海龟的平均年龄。我尝试通过截取以下代码来实现这一点:
globals [mean-death-age]
turtles-own [age prob-die?]
to-report mean-age
if (prob-die? = true) [
set mean-death-age mean [age] of turtles
]
report mean-death-age
end
每只乌龟都有死亡的概率(prob-die?),每个时间步(tick)都应该重新计算。如果概率死?设置为真平均死亡年龄应该更新。目前我遇到的问题是
我不知道如何启动变量平均死亡年龄。也许,使用 if 循环会有所帮助
if (ticks >= 1) [
if (prob-die? = true) [
set mean-death-age mean [age] of turtles
]
]
我没有得到已经计算出的平均死亡年龄的更新,但是变量被覆盖并且返回了这个 tick 海龟的平均死亡年龄
我在访问该值时遇到问题。当我尝试用例如
调用它时
print mean-age
即使我尝试将 mean-age 保存为全局变量,我仍收到错误消息,指出 mean-age 是 turtle-only。
完整代码可用here。
我认为你把事情搞得比需要的更复杂了。最简单的方法是只保留海龟死亡年龄的列表,然后取该列表的平均值:
globals [death-ages]
turtles-own [age]
to setup
clear-all
create-turtles 100 [
setxy random-xcor random-ycor
set age random 100
]
set death-ages [] ; start with an empty list
reset-ticks
end
to go
if not any? turtles [ stop ]
ask turtles [
if random 100 < age [
set death-ages lput age death-ages ; add age to our list of ages of death
die
]
]
print mean death-ages
tick
end
唯一的缺点是您的 death-ages
列表将随着您的模型 运行 不断增长。如果结果证明这是一个问题(虽然它可能不会),您将需要跟踪当前平均值和当前观察次数并使用 set avg ((n * avg) + age) / (n + 1) set n n + 1
.[=13= 之类的内容更新您的平均值]
至于为什么您当前的代码不起作用,需要进行大量拆包才能解释清楚(很抱歉,我现在不能)。作为一般性评论,我建议当您 运行 遇到这样的困难时尝试退后一步,并考虑解决问题所需的最少信息量。在这种情况下,您需要指死亡年龄。最简单的方法是什么?保留一份死亡年龄列表,并在需要时取该列表的平均值。
我想得到所有垂死的海龟的平均年龄。我尝试通过截取以下代码来实现这一点:
globals [mean-death-age]
turtles-own [age prob-die?]
to-report mean-age
if (prob-die? = true) [
set mean-death-age mean [age] of turtles
]
report mean-death-age
end
每只乌龟都有死亡的概率(prob-die?),每个时间步(tick)都应该重新计算。如果概率死?设置为真平均死亡年龄应该更新。目前我遇到的问题是
我不知道如何启动变量平均死亡年龄。也许,使用 if 循环会有所帮助
if (ticks >= 1) [ if (prob-die? = true) [ set mean-death-age mean [age] of turtles ] ]
我没有得到已经计算出的平均死亡年龄的更新,但是变量被覆盖并且返回了这个 tick 海龟的平均死亡年龄
我在访问该值时遇到问题。当我尝试用例如
调用它时print mean-age
即使我尝试将 mean-age 保存为全局变量,我仍收到错误消息,指出 mean-age 是 turtle-only。
完整代码可用here。
我认为你把事情搞得比需要的更复杂了。最简单的方法是只保留海龟死亡年龄的列表,然后取该列表的平均值:
globals [death-ages]
turtles-own [age]
to setup
clear-all
create-turtles 100 [
setxy random-xcor random-ycor
set age random 100
]
set death-ages [] ; start with an empty list
reset-ticks
end
to go
if not any? turtles [ stop ]
ask turtles [
if random 100 < age [
set death-ages lput age death-ages ; add age to our list of ages of death
die
]
]
print mean death-ages
tick
end
唯一的缺点是您的 death-ages
列表将随着您的模型 运行 不断增长。如果结果证明这是一个问题(虽然它可能不会),您将需要跟踪当前平均值和当前观察次数并使用 set avg ((n * avg) + age) / (n + 1) set n n + 1
.[=13= 之类的内容更新您的平均值]
至于为什么您当前的代码不起作用,需要进行大量拆包才能解释清楚(很抱歉,我现在不能)。作为一般性评论,我建议当您 运行 遇到这样的困难时尝试退后一步,并考虑解决问题所需的最少信息量。在这种情况下,您需要指死亡年龄。最简单的方法是什么?保留一份死亡年龄列表,并在需要时取该列表的平均值。