隔离模型的适应:如何避免其他品种密度在 patch-here

Adaptation of segregation model: how to avoid other breed densities at patch-here

我的子模型的 objective 是模拟狼避开人类密度大于其容忍阈值的斑块。人类代理仅在城市补丁(灰色)上创建,但在 NetLogo 世界中也有草地补丁(棕色)和森林补丁(绿色)(请参见下面的界面选项卡 link 以获得视觉效果) .人类代理人是静止的,而狼代理人可以选择逃跑,如果他们对当前位置[不满意?] [寻找新地点]。

Interface Tab

globals [
  grass-patches
  forest-patches
  urban-patches
  percent-unhappy
  ]

breed [wolves wolf]

breed [humans human]

wolves-own [
  happy?
  anthro_tolerance
  ]

humans-own [
  human-population]

patches-own [
  human-density]


;; creating the urban patches
  set urban-patches patches with [pxcor < 10 and pycor < -30 ]
  ask urban-patches [set pcolor grey]
  ask urban-patches [set human-density human-density = pop-density]


to-report pop-density
      report count humans / (count urban-patches)
    end

狼群判断自己开心的代码?水平并报告 %-unhappy 是:

to update-wolves
  ask wolves [
    set anthro_tolerance 0.049
    ifelse (patch-here human-density >= anthro_tolerance)  ;;Error message
    [set happy? FALSE]
    [set happy? TRUE]
  ]
end

to update-globals
  set percent-unhappy (count wolves with [not happy?]) / (count wolves) * 100
end

如何编写 ifelse happy 代码?代表个体狼问自己 "what is the human-density of the patch I'm on, and is it above my anthro_tolerance?"

此外,当我检查一个补丁时,所有城市补丁的人类密度变量都为零(即使补丁上有人)。我该如何纠正这个问题?

好的,我可以在这里看到几个问题。第一个是:

ask urban-patches [set human-density human-density = pop-density]

我不确定为什么没有抛出错误。但不管怎样,你不要在 NetLogo 中使用 '=' 到 set 变量值。假设您的意图是要将人口密度的计算值分配给名为 human-density 的补丁变量,该行应该是:

ask urban-patches [set human-density pop-density]

关于你的实际错误。你有:

ifelse (patch-here human-density >= anthro_tolerance)

检索属于某个模型实体的变量值的正确语法使用原语 of,因此您可以编写(未测试):

ifelse ([human-density] of patch-here >= anthro_tolerance)

但是你也可以利用海龟可以访问它们所在的补丁的补丁变量这一事实。请注意,这不能反向工作 - 海龟到补丁是唯一的,因为一只海龟一次只能在一个地方。然而,一个补丁上可以有很多海龟,所以一个补丁不知道要访问哪只海龟的变量。

使用这个技巧可以让你:

ifelse human-density >= anthro_tolerance

您还可以使用另一个技巧,因为您的 ifelse 正在将变量设置为 true 或 false。这有点微妙,所以有些人不使用它,因为它有点难以阅读,特别是如果您是 NetLogo 的新手。但是你可以替换:

ifelse human-density >= anthro_tolerance
[set happy? FALSE]
[set happy? TRUE]

与:

set happy? human-density < anthro_tolerance

从右到左阅读。首先,它应用比较运算符“<”,如果 human-density < anthro_tolerance 则报告 true,如果不是 human-density < anthro_tolerance,则报告 false。然后将该值(truefalse)赋予名为 "happy?".

的变量

我自己回答了问题的最后一部分,但我想 post 如果有人像我一样对 NetLogo 感到好奇或不熟悉,我是如何解决这个问题的..

当我检查单个城市补丁时,补丁的变量 "human-density" 将为 0,即使补丁上有人类代理(非常清楚)。我通过在 [setup] 和 [go] 程序的末尾添加 [update-patches] 来解决这个问题。

to update-patches
  ask urban-patches [set human-density pop-density]
end

通过在 [setup] 和 [go] 程序结束时调用这个 update-patches 命令,我在检查补丁时准确地显示了人体密度。