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

时间:2014-06-04 10:52:42

标签: 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?
]

我怎么能问这个只是将人类联系起来将他的属性设置为真?

1 个答案:

答案 0 :(得分:2)

我在看到这个之前编辑了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。但是模型的设置方式应该永远不会发生。此代码也会报告{{ 1}}如果一只狗没有主人,这是有道理的。)

然后,假设您的人类仍有nobody变量,您可以这样做:

has_dog?

其他一些快速点:

  • 我注意到你的ask my-owner [ set has_dog? true ] 语句带有一个空的else子句。为什么不使用if

  • 您正在使用带有虚拟索引的while循环,只是为了重复多次。 NetLogo有repeat

  • 你的循环的逻辑是一个人可以有多只狗,因为ifelse可以多次报告同一个人。这并不难以置信,但可能不是你想要的。

  • 使用one-of代替while循环可以避免上一个问题,并且人类hatch有一定概率。通常,ask humans是NetLogo中的正确解决方案是非常罕见的。您应该尝试根据代理集进行思考,并使用while之类的内容和索引作为最后的手段。