【问题标题】:Linking turtles to another turtle with highest value in NetLogo. Limit the number of links将海龟链接到 NetLogo 中具有最高值的另一只海龟。限制链接数量
【发布时间】:2020-09-08 12:56:16
【问题描述】:

我是 NetLogo 的初学者,我想请一些海龟(来自不同社会阶层的学生)链接到其他海龟(学校)。我希望工薪阶层的学生寻找成绩最高的学校,同时又不贵,而且没有达到允许的最大链接数。如果所需的学校已达到允许的最大链接数,我希望学生寻找未达到允许的最大链接数的最高成就的下一所学校,依此类推。

这是代码。我收到以下消息“任何?预期的输入是代理集,但得到了海龟(学校 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

【问题讨论】:

  • 快速评论 - 我修复了您的格式(并删除了不遵循 SO 程序的标签、cmets 等)。将来,大括号格式为代码,而不是尝试使用引号。指出哪一行引发了错误也很有帮助(NetLogo 将以黄色突出显示它)

标签: netlogo


【解决方案1】:

您的问题是代理和代理集之间的区别,这是一个有点微妙的问题。 with-max 返回一个代理集 - 一组代理(在本例中为海龟)。该代理集可以有 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 实际上是一个集合上的过滤器。

我还认为您有括号问题 - 我假设您希望 set enrolled? TRUE 在括号内。我在第二个修复中保留了它,但在第一个错误中进行了更改(以及更改括号位置约定以使代码块结构更加可见)

【讨论】:

  • 感谢 @JenB 修复格式,更正代码 [正常工作] 并感谢您提供的伟大教育。
  • 我可以看到一些成绩较低的学校没有链接,这意味着海龟只针对成绩最高的学校,而我想做的是让海龟去和瞄准下一个最好的可行学校(其成绩将低于成绩最高的学校)。是否有意义?非常感谢
  • 不确定我是否完全理解,但您可以像在数学中一样使用方括号 ( ) 让位居首位
  • 谢谢,我的意思是一旦成绩最高的学校达到最大链接数,海龟就会瞄准成绩最高的学校(不包括那些达到最大链接数的学校)等等直到所有学校都有一些乌龟被联系在一起。谢谢
  • 使用相同的逻辑/代码,但排序你的子集,以便首先排除那些达到最大链接的人
猜你喜欢
  • 2016-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-19
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
相关资源
最近更新 更多