如果团队是随机的,我认为您不需要为此设置循环,因为 ask 无论如何都会以随机顺序调用海龟。
我认为您仍然应该在这里使用代理集,因为它使某些事情变得更容易。例如,一旦海龟知道了它们的(agentset,3 turtles),您就可以轻松地查询该代理集以获取myIDs 或您所追求的任何变量。
我并不完全清楚 teamID 的目的,所以我可能会在这里偏离基础,但如果 teamIDs 对每个组都是唯一的,我认为你不希望它作为全局变量三只乌龟。您可能还希望它是 turtles-own 变量。
这是一个结合了上述想法的示例。使用此设置:
turtles-own [ myteamset teamID myID teammatesID ]
to setup
ca
crt 10 [
set myID who
set myteamset nobody
set teammatesID [ ]
]
setup-groups
print remove-duplicates [teammatesID] of turtles
print sort [teamID] of turtles
reset-ticks
end
还有setup-groups 过程(cmets 中有更多详细信息):
to setup-groups
ask turtles [
; If you don't have a team yet
if myteamset = nobody [
; Make a temporary agent-set out of all other turtles that
; are also not yet part of a team
let possible-teammates other turtles with [ myteamset = nobody ]
; If there are at least two more turtles, make a new team:
ifelse count possible-teammates > 1 [
; Make a team out of myself and two possible teammates
set myteamset ( turtle-set self n-of 2 possible-teammates )
; Make a temporary variable to pass on to my entire team
; (yourself included) for the team ids and the team members.
; Also, assign a random teamID to the whole team
let ids sort [myID] of myteamset
let teammmembers myteamset
let tempteam random 1000
ask myteamset [
set teammatesID ids
set myteamset teammmembers
set teamID tempteam
]
] [
; If there aren't enough turtles to form a new team,
; print a warning to the console.
show "Not enough turtles to make a new team!"
]
]
]
end
如果这就是你所追求的,请告诉我,希望对你有所帮助。
编辑 - 根据您的 cmets:
要获得连续的团队编号,您可以使用一个简单的计数器,该计数器被分配给一个团队,然后为下一个增加,修改后的setup-groups 看起来像:
to setup-groups
; Create a temporary variable to use as a counter
let teamCounter 1
ask turtles [
if myteamset = nobody [
let possible-teammates other turtles with [ myteamset = nobody ]
ifelse count possible-teammates > 1 [
set myteamset ( turtle-set self n-of 2 possible-teammates )
let ids sort [myID] of myteamset
let teammmembers myteamset
; Assign the current teamCounter as team number, then
; increment it by one for the next team
let tempteam teamCounter
set teamCounter teamCounter + 1
ask myteamset [
set teammatesID ids
set myteamset teammmembers
set teamID tempteam
]
] [
show "Not enough turtles to make a new team!"
]
]
]
end
第二个问题可能值得单独提出一个新问题,具体取决于您希望获得的深度,但这是一种非常简单的方法,您只需获取所有唯一的团队 ID 并让一只乌龟具有该 ID让他们的团队一起行动:
to move-in-groups
; Get the unique team IDs
let teamNumbers remove-duplicates [teamID] of turtles
; Get one member of each team to ask all members
; of its team (itself included) to move
foreach teamNumbers [
tn ->
ask one-of turtles with [ teamID = tn ] [
let newHeading heading + random 60 - 30
if myteamset != nobody [
ask myteamset [
set heading newHeading
fd 1
]
]
]
]
end
编辑 2:NetLogo 5 友好版本
to move-in-groups
; Get the unique team IDs
let teamNumbers remove-duplicates [teamID] of turtles
; Get one member of each team to ask all members
; of its team (itself included) to move
foreach teamNumbers [
ask one-of turtles with [ teamID = ? ] [
let newHeading heading + random 60 - 30
if myteamset != nobody [
ask myteamset [
set heading newHeading
fd 1
]
]
]
]
end