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

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

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

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

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

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

Проблема в том, что Я не знаю , как заставить эти черепахи хранить свои собственные ID и teammatesID в переменной с именем teammatesID группе они должны иметь 3 разных члена .Эти товарищи по команде не должны быть из той же группы. И как дать их teamID after они get all member .

Вот мое кодирование:

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 ]

0 голосов
/ 07 ноября 2018

Я согласен с Люком, что наиболее подходящим способом работы с командами является набор агентов, а не сложное распределение идентификаторов.Вот как выглядит код для этого.Обратите внимание, что я не рассмотрел часть вашего вопроса о движении.

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
0 голосов
/ 01 октября 2018

Если команды случайные, я не думаю, что вам нужен цикл для этого, так как 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
...