将海龟链接到NetLogo中具有最高价值的另一只海龟。限制链接数

时间:2020-09-08 12:56:16

标签: netlogo

我是NetLogo的初学者,我想让一些乌龟(来自不同社会阶层的学生)与其他乌龟(学校)建立链接。我想让工人阶级的学生寻找成绩最好的学校,而这同时又不昂贵,并且没有达到允许的最大链接数。如果期望的学校达到了允许的最大链接数,我希望学生寻找成绩最高但未达到允许的最大链接数的下一所学校。

这是代码。我收到以下消息“ ANY?期望输入是一个代理集,但得到了乌龟(学校1)。”

breed [schools school] 
breed [upperclass upperclass-student]
breed [workingclass workingclass-student]

upperclass-own [achievement enrolled? target]
workingclass-own [achievement enrolled? target]
schools-own [schoolachievement  expensive? ]
 
to setup
   clear-all
   set-default-shape schools "house"
   set-default-shape upperclass "person"
   set-default-shape workingclass "person"
   ask patches [ set pcolor 8 ]
   create-schools num-of-schools [ setxy random-xcor random-ycor set schoolachievement random-normal 5 1 
   set expensive? one-of [ true false ] ]
   create-upperclass num-of-upperclass [ set color white setxy random-xcor random-ycor set achievement 
   random-normal 5 1  ] ;Students from upper class have higher achievement
   create-workingclass num-of-workingclass [ set color red setxy random-xcor random-ycor set achievement 
   random-normal 4 1  ]
end

to go
    ask workingclass [ 
    choose-school ]  
end

to choose-school
      if breed = workingclass [
      set target one-of schools with-max [ schoolachievement ]  with [ expensive? = false ] ]
      if any?  target  with [ count link-neighbors  < max-link-count ]   [
      create-link-with target ]
      set enrolled? TRUE
end

1 个答案:

答案 0 :(得分:1)

您的问题是座席和座席集之间的差异,这是一个细微的问题。 with-max返回一个agentset-一组agent(在本例中为turtle)。该代理集可以有0个成员,1个成员,2个以上成员,但是即使是空的也可以是一个集合。但是,one-of从代理集中选择一个代理,然后将其作为代理而不是代理集返回。也就是说,NetLogo知道one-of返回的任何内容都必须是一个代理。此时,除非用于代理集的原语(例如any?)也可以在单个代理上使用,否则它们将引发错误。

因此,回到您的代码。我喜欢先检查一下是否有可行的学校,然后再选择一所学校,这是我认为您想要做的事情的可读性。那应该是:

to choose-school
    if breed = workingclass
    [ set targets schools with-max [ schoolachievement ]  with [ expensive? = false ]
      set candidates targets with [ count link-neighbors  < max-link-count ]
      if any? candidates
      [ create-link-with one-of candidates
        set enrolled? TRUE
      ]
    ]
end

请注意,我还更改了目标,而不是目标,这是一种跟踪某物是代理还是代理集的方法。

您可以这样做并将其保留为代理的另一种方法是:

to choose-school
      if breed = workingclass [
      set target one-of schools with-max [ schoolachievement ]  with [ expensive? = false ] ]
      if target != nobody and [count link-neighbors] of target < max-link-count   [
      create-link-with target ]
      set enrolled? TRUE
end

因此,您可以使用nobody代替any?,但您也不能在该行中使用with,因为with实际上是集合上的过滤器。 / p>

我还认为您存在包围问题-我假设您想将set enrolled? TRUE放在括号内。我将其保留在第二个修订中,但在第一个错误中进行了更改(以及更改了括号位置约定以使代码块结构更可见)