将海龟分组:改进的合作伙伴示例?
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 中的狼群示例:基于代理和基于个体的建模。基本上每个包都有一个唯一的标识符。
在这种情况下,一个组将具有该标识符。因此,当发生集群时,集群中的那些人允许其他人加入,并且将组标识符提供给创建的新成员或组。如果他们离开,标识符将被重置。您可以轻松地围绕新关系 [两只新海龟相遇并生成新的组编号]、组增长 [组中现有的数量以及到达或被拒绝的新海龟的数量] 以及离开组的那些 [重置组编号] 轻松设置规则。这样做的好处是您还可以轻松地创建具有相同组号的代理集,让他们都做同样的事情。
我一直在尝试在 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 中的狼群示例:基于代理和基于个体的建模。基本上每个包都有一个唯一的标识符。
在这种情况下,一个组将具有该标识符。因此,当发生集群时,集群中的那些人允许其他人加入,并且将组标识符提供给创建的新成员或组。如果他们离开,标识符将被重置。您可以轻松地围绕新关系 [两只新海龟相遇并生成新的组编号]、组增长 [组中现有的数量以及到达或被拒绝的新海龟的数量] 以及离开组的那些 [重置组编号] 轻松设置规则。这样做的好处是您还可以轻松地创建具有相同组号的代理集,让他们都做同样的事情。