Как сделать так, чтобы черепаха могла сохранять удостоверение личности других черепах в Netlogo?
Вот что я хочу сделать:
Я хочу, чтобы команда состояла из 3 черепах в группе.
Все черепахи должны хранить свои собственные ID и teammatesID в переменной с именем teammatesID. (Представьте, что вы хотите создать группу, вы поместите свое имя и имя своих друзей в список, поэтому в этой переменной нужно хранить ownID, я плохо объясняю вещи..)
Вместо того, чтобы просто показывать
(agentset,3 turtles)
Мне нужно, чтобы они могли показать удостоверение личности всех товарищей по команде.После того, как они соберут всех 3 участников, они получат
teamID
,
Проблема здесь в том, что я не знаю, как заставить этих черепах хранить свой собственный ID и teammatesID в переменной с именем teammatesID. В группе должно было быть 3 разных участника. Эти товарищи по команде не должны быть из одной группы. И как их дать teamID
after
они получают всех членов.
Вот моя кодировка:
global
[ teamID]
turtles-own
[
myID
teammatesID
]
to setup
clear-all
set-default-shape turtles "arrow"
create-turtles 10
ask turtles [ set myID who]
reset-ticks
setup-group
end
to setup-group
set teamID []
let agent one-of other turtles
let nearestNeighbor one-of other turtles in-radius 1
set teamID = 0
ask agent with [ teammatesID < 3]
[ ask nearestNeighbor with [teammatesID < 3]
[ ;set teammatesID = myID ; here is the problem, I need to make sure they did not save the same turtle in one group.
show teammatesID]]
ask agent with [teammatesID > 3]
set teamID fput teamID teamID
end
Я ценю ваше дополнительное время здесь. Спасибо.
2 ответа
Если команды случайные, я не думаю, что вам нужен цикл для этого, так как ask
в любом случае будем звать черепах в случайном порядке.
Я думаю, что вы все равно должны использовать здесь наборы агентов, поскольку это облегчает определенные вещи. Например, когда черепахи знают их (agentset,3 turtles)
, вы можете легко запросить этот набор агентов для myID
с или любой другой переменной вы после.
Я не совсем ясно, с целью teamID
так что я могу быть неосновным здесь, но я не думаю, что вы хотите использовать его как глобальную переменную, если teamID
Они должны быть уникальными для каждой группы из трех черепах. Вы, вероятно, захотите, чтобы это было 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
Дайте мне знать, если вы хотите этого, надеюсь, это поможет.
Редактировать - согласно вашим комментариям:
Чтобы получить последовательные номера команд, вы можете использовать простой счетчик, который присваивается команде, а затем увеличивается для следующего модифицированного 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-дружественная версия
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
Я согласен с Люком в том, что наиболее подходящим способом работы с командами является набор агентов, а не сложное распределение идентификаторов. Вот как выглядит код для этого. Обратите внимание, что я не рассмотрел часть вашего вопроса о движении.
globals [max-teamsize]
turtles-own
[ teamID
teammates
]
to testme
clear-all
create-turtles 100
[ setxy random-xcor random-ycor
set teamID 0
set teammates nobody
]
set max-teamsize 3
setup-groups
reset-ticks
end
to setup-groups
; assign turtles to team by allocating a team number
let counter 1
ask turtles
[ if teamID = 0
[ set teamID counter
let potential-teammates turtles with [teamID = 0]
ask n-of min (list (max-teamsize - 1) (count potential-teammates)) potential-teammates
[ set teamID counter
]
set counter counter + 1
]
]
; store teammates as agentset of other turtles in team
ask turtles
[ set teammates other turtles with [teamID = [teamID] of myself]
]
end