Если команды случайные, я не думаю, что вам нужен цикл для этого, так как ask
будет вызывать черепах в случайном порядке в любом случае.
Я думаю, что вы все равно должны использовать здесь наборы агентов какэто делает определенные вещи проще.Например, как только черепахи узнают свои (agentset,3 turtles)
, вы можете легко запросить этот набор агентов для myID
s или любой другой переменной, которую вы ищете.
Я не совсем ясно о назначении teamID
, поэтому я могу быть неосновным здесь, но я не думаю, что вы хотите, чтобы он был глобальной переменной, если teamID
s должны быть уникальнымикаждой группе из трех черепах.Вы, вероятно, захотите, чтобы это тоже была переменная 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
процедура (более подробно в комментариях):
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
Дайте мне знать, если вы хотите этого, надеюсь, этоhelp.
Edit- Согласно вашим комментариям:
Чтобы получить последовательные номера команд, вы можете использовать простой счетчик, который назначается команде и затем увеличиваетсядля следующего - модифицированный 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
Второй вопрос может стоить нового отдельного вопроса, в зависимости от того, насколько подробно вы надеетесь получить, но вотодин очень упрощенный подход, при котором вы просто получаете все уникальные идентификаторы команд и имеете одну черепаху с этим идентификатором, когда их команда перемещается вместе:
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-friendly версия
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