Как сделать так, чтобы черепаха могла сохранять удостоверение личности других черепах в Netlogo?

Вот что я хочу сделать:

  1. Я хочу, чтобы команда состояла из 3 черепах в группе.

  2. Все черепахи должны хранить свои собственные ID и teammatesID в переменной с именем teammatesID. (Представьте, что вы хотите создать группу, вы поместите свое имя и имя своих друзей в список, поэтому в этой переменной нужно хранить ownID, я плохо объясняю вещи..)

  3. Вместо того, чтобы просто показывать (agentset,3 turtles) Мне нужно, чтобы они могли показать удостоверение личности всех товарищей по команде.

  4. После того, как они соберут всех 3 участников, они получат teamID,

Проблема здесь в том, что я не знаю, как заставить этих черепах хранить свой собственный ID и teammatesID в переменной с именем teammatesID. В группе должно было быть 3 разных участника. Эти товарищи по команде не должны быть из одной группы. И как их дать teamIDafter они получают всех членов.

Вот моя кодировка:

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
Другие вопросы по тегам