将海龟分组:改进的合作伙伴示例?

Putting turtles into groups: modified partners example?

我一直在尝试在 NetLogo 中编写一个模型,我从一定数量的具有随机起始坐标的海龟开始。当我点击开始时,我希望海龟进入一​​定大小的组,然后继续移动。我知道有一个分组示例模型 ('grouping turtles example'),但它告诉海龟去某个补丁而不是分组在一起,所以如果它们移动它们就不再分组。

我一直在修改模型库中的 'partner example' 模型。在这里,乌龟被告知要找到另一只还没有伙伴的乌龟,将那只乌龟设置为它的伙伴,然后告诉那只新伙伴也将它设置为伙伴。这很好用,我可以告诉合作伙伴蜂拥而至,让他们在继续移动时保持在一起。但是我想不通我怎么能得到这样的东西来处理超过一对海龟。

我想我可以制作一个 'partners' 的代理集,其中包括一只海龟拥有的所有伙伴。我还考虑过在海龟之间使用无向 links 并使用 'network' 的代理集来包含连接到单个海龟的所有海龟。

我无法使这些想法中的任何一个发挥作用。当使用 links 时,我可以设置一只海龟可以拥有的首选 links 数量,但不是整个组中的海龟总数(包括 link-[=30= 的邻居]-neighbors),并且一个组中的海龟不共享相同的连接。当我尝试创建合作伙伴代理集时,它似乎永远不会起作用,因为每个后续合作伙伴都会覆盖前一个。我还需要确保一只乌龟与其组中的其他乌龟共享相同的伙伴。我一直在尝试使用 'turtle-set' 将新合作伙伴添加到任何以前的合作伙伴,但我遇到了问题。这是我用来设置合作伙伴的代码:

turtles-own
[next-partner ;a partner to be added to partners   
  group-size  ;includes turtle itself and number of partners in group (count)
  partners]   ;agentset of partners

to setup
  clear-all
  create-turtles num-turtles 
  [ setxy random-xcor random-ycor
    set next-partner nobody ;turtles haven't got any partners to start with
    set group-size 1 ;just itself
   ]
    reset-ticks
end

to go
  let singles turtles with [preferred-size > group-size] ;those turtles where the group it's in isn't big enough

  ask singles
  [ifelse any? other singles
  [set heading towards min-one-of (other turtles with [preferred-size > group-size]) [distance myself]] ;go towards other turtles who need more members in group
  [lt random 40
    rt random 40]
    fd 1
  ]

  ask turtles
   [set partners turtles with [next-partner = myself] ;partners are those turtles who have you in their partners, but I don't this will work because they won't always be a 'next-partner'
    set group-size 1 + count partners  
    if (preferred-size > group-size) and (any? other turtles in-radius 1 with [preferred-size > group-size])

    [set next-partner one-of other turtles in-radius 1 with [preferred-size > group-size]

     ask next-partner 
      [set next-partner myself  ;ask this new partner to set turtle as its partner too
       set partners (turtle-set partners next-partner)]  ;add the turtle as a partner to the partners agentset
       set partners (turtle-set partners next-partner) ;turtle does this after partner so that the partner doesn't add itself
      ]
    ask turtles with [preferred-size = group-size] ;turtles in the right group size just move around (I can get them to flock later)
  [lt random 40
    rt random 40
    fd 1]
  ] 
   tick
end

我希望这不会太长和不清楚。如果能提供任何帮助,我将不胜感激,我已经为此工作了好几天,但在之前的问题中找不到类似的内容。

谢谢!

达米安

查看 Railsback 和 Grimm 中的狼群示例:基于代理和基于个体的建模。基本上每个包都有一个唯一的标识符。

在这种情况下,一个组将具有该标识符。因此,当发生集群时,集群中的那些人允许其他人加入,并且将组标识符提供给创建的新成员或组。如果他们离开,标识符将被重置。您可以轻松地围绕新关系 [两只新海龟相遇并生成新的组编号]、组增长 [组中现有的数量以及到达或被拒绝的新海龟的数量] 以及离开组的那些 [重置组编号] 轻松设置规则。这样做的好处是您还可以轻松地创建具有相同组号的代理集,让他们都做同样的事情。