netlogo - NetLogo 中链接代理之间的访问属性

标签 netlogo

例如,在我创建的一个项目中,有 1000 个人。 现在,如果满足概率,那么我会创建一只狗,并将他与人类联系起来。我们开始吧:

to setup-agents
 set-default-shape humans "person"
 set-default-shape dogs "default"

create-humans people [
 setxy random-xcor random-ycor
 set size 1.5 
 set color green
 set sick? false
]

let i 1
while [i <= people] [

  ifelse random 100 < 43 [

    create-dogs 1 [
     set size 0.5
     set color green
     set sick_dog? false
     create-link-from one-of humans [set tie-mode "fixed" tie hide-link]
   ]
  ] []

  set i i + 1  
]

   move

end

然后,在创建链接后,我需要访问 humasn 的属性(has_dog?)并将其设置为 true。

humans-own [
  has_dog?
  sick?
]

我怎样才能要求刚刚链接的人将他的属性设置为true?

最佳答案

我编辑了my answer to your previous question在我看到这个之前。您可能会在那里找到您想要的大部分内容。话虽这么说:

您可能不需要 has_dog? 变量,因为您可以轻松地通过报告器确定人类是否养狗:

to-report has-dog? ; human reporter
  report any? out-link-neighbors  
end

不过,您可能仍然需要联系狗的主人。这是记者的报道:

to-report my-owner ; dog reporter
  report one-of in-link-neighbors
end

(使用链接理论上可以让一只狗拥有多个主人,因此表达式中的one of。但是您的模型的设置方式永远不会发生这种情况。这段代码如果狗没有主人,也会报告 nobody,这是有道理的。)

然后,假设你的人类仍然有一个 has_dog? 变量,你可以这样做:

ask my-owner [ set has_dog? true ]

其他一些要点:

  • 我注意到您有一个带有空 else 子句的 ifelse 语句。为什么不直接使用 if

  • 您使用带有虚拟索引的 while 循环只是为了重复某些操作多次。 NetLogo有repeat为此。

  • 循环的逻辑是一个人可以养多只狗,因为 one-of 可以多次报告同一个人。这并非难以置信,但它可能不是您想要的。

  • 上一个问题可以通过使用ask human而不是 while 循环来避免,并且让人类 hatch有一定概率是一只狗。一般来说,while 很少是 NetLogo 中的正确解决方案。您应该尝试从主体集的角度进行思考,并使用 while 和索引之类的东西作为最后的手段。

关于netlogo - NetLogo 中链接代理之间的访问属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24035509/

相关文章:

netlogo - 让海龟在 NetLogo 中的 2 个元素之间完成

NetLogo - 显示要监视的海龟的值

netlogo - 如何实现 Netlogo 代码以达成共识

hashtable - 当需要2个键时如何使用函数 "table:get"(表扩展)?

netlogo - netlogo 中的处理顺序

random - 如何使用 netlogo 生成 0.3 < X < 0.7 范围内的数字

netlogo - 具有网络扩展的最低成本路径

NetLogo:杀死其余的代理集

watch - 在不重置视角的情况下取消监视代理

Netlogo - 从txt文件读取并导入字符串数据