Как определить скопление черепах в NetLogo?

#netlogo

#netlogo

Вопрос:

Есть ли у кого-нибудь какие-либо решения для того, чтобы черепаха идентифицировала толпу других черепах, т. Е. группу черепах, сгруппированных вместе? Следующее не сработает, потому что 50 черепах в радиусе действия могут быть разрозненными (повсюду, а не рядом друг с другом):

 if count turtles in-radius 20 >= 50 [show "There's a crowd"]
  

На данный момент я определяю толпу как более чем 50 черепах, стоящих рядом друг с другом.

Ответ №1:

Если вам нужны непрерывно подключенные черепахи, вы могли бы изменить пример кластеров исправлений из библиотеки моделей — вот одна из версий. С помощью этой настройки:

 globals [ groups>50 ]

turtles-own [ 
  my-group
]

to setup
  ca
  crt 500 [
    set my-group -99
    set shape "square"
    move-to one-of patches
  ]  
  reset-ticks
end
  

И эти вспомогательные функции:

 to identify-groups
  let group-counter 0

  loop [
    let seed one-of turtles with [ my-group = -99 ]

    if seed = nobody [
      stop
    ]
    ask seed [
      set my-group group-counter
      set group-counter group-counter   1
      spread-group
    ]
  ]
end  

to spread-group
  set label my-group
  set color my-group * 10   5 
  ask ( turtles-on neighbors ) with [ my-group = -99 ] [
    set my-group [my-group] of myself
    spread-group
  ]
end
  

identify-groups запускает цикл, который идентифицирует всех черепашек на смежных участках и распределяет уникальное my-group значение среди этих групп.

Затем вы можете получить уникальные значения группы и использовать filter только для возврата номеров групп, для которых существует некоторое пороговое значение количества черепах:

 to go 
  identify-groups

  let unique-groups sort remove-duplicates [my-group] of turtles

  set groups>50 filter [ i -> count turtles with [ my-group = i ] >= 50  ] unique-groups

  print groups>50
end