Netlogo: создание конкретных связей между черепахами с помощью информации из csv

Я работаю над симуляцией социального поведения в чрезвычайной ситуации, используя анонимные данные о реальном событии. Ниже приведен фрагмент кода, который я использую для создания черепах-«людей».

to read-people-from-file [filename]
  let rows bf csv:from-file filename
  foreach rows
  [[row] ->
create-people 1
[
 set size .46
 setxy (item 0 row) (item 1 row)
 set age (item 2 row)
 set gender (item 3 row)
 set visited? (item 4 row)
 set group-number (item 6 row)
 set group-type (item 7 row)
 if group-number < 300 and ((person group-number) = (other group-number))) [create-links-with other person]
]
 ]
end

Все работает, кроме ссылок на групповые номера. Я пробовал несколько разных его вариантов, но безуспешно, за исключением тех случаев, когда я пытался if group-number <300 [create-links-with other people, который работал с созданием ссылок, но был бесполезен с функциональной точки зрения. Я пытаюсь сделать так, чтобы каждый человек, который собрался вместе (у которого был одинаковый номер группы), имел связь с другими членами группы. В частности, меньше 300, потому что числа 300 и выше предназначены для людей, которые пришли одни или с другими обозначениями.

Теоретически я мог бы создать ссылки вручную после создания черепах, но это кажется пустой тратой времени (у меня набор данных более 400) и чем-то, что делает код значительно менее применимым к другим сценариям.

Как заставить Netlogo создавать связи между членами одной группы на основе содержимого CSV?

Собственно, ответ мечты: как мне заставить Netlogo создавать разные виды ссылок (на основе типа группы) между членами одного и того же номера группы на основе того, что находится в CSV?

Изменить: в конце концов, мне пришлось отделить создание ссылок от начальной настройки агента. Вот что сработало:

 to soclink ;;groups that came together have links based type of relationship
ask people [if group-number < 300 
 [
if group-type = 1 [ask other people with [group-number = [group-number] of myself] [create-coworker-with myself]]
if group-type = 2 [ask other people with [group-number = [group-number] of myself] [create-friend-with myself]]
if group-type = 3 [ask other people with [group-number = [group-number] of myself] [create-partner-with myself]]
if group-type = 4 [ask other people with [group-number = [group-number] of myself] [create-family-with myself]]
if group-type = 5 [ask other people with [group-number = [group-number] of myself] [create-multiple-with myself]]

  show count links]]
end

person Chiomi    schedule 27.11.2017    source источник


Ответы (1)


Для первой части, возможно, это сработает - как только ваши люди будут созданы с их номерами, присвоенными group-number:

to group-link
  ask people [
    let my-group other people with [ group-number = [ group-number] of myself ]
    create-links-with my-group
  ]  
end

Для ответа мечты - это может зависеть от того, сколько видов ссылок вам нужно. Насколько мне известно, типы ссылок должны быть предопределены - вы не можете программно генерировать ссылки по мере необходимости для разных групп (хотя я не эксперт - может быть способ). Если у вас уже определены типы ссылок, например:

undirected-link-breed [ link-as link-a ]
undirected-link-breed [ link-bs link-b ]

Теперь представьте, что ваш group-type либо "a", либо "b", и вы можете сделать что-нибудь вроде

to specific-link-breeds
  ask people [
    let my-group other people with [ group-number = [ group-number] of myself ]
    if group-type = "a" [
      create-link-as-with my-group
    ]
    if group-type = "b" [
      create-link-bs-with my-group
    ]
  ]
  ask link-as [ 
    set color red
  ]
  ask link-bs [
    set color blue
  ] 
end

Изменить: изменил turtles на people, как и должно быть - спасибо, Матцап.

person Luke C    schedule 27.11.2017
comment
Я также считаю, что вам нужно заранее определить породы ваших ссылок. Однако было бы просто создать атрибут ссылок, содержащих тип группы. - person JenB; 28.11.2017
comment
Одним из улучшений, позволяющих сократить число операторов if, было бы создание таблицы, в которой ключом является тип группы, а значением - функция create-link-xs-with, где xs заменяется каждой породой ссылок. К вашему сведению, для начинающих нетлогеров, если у вас есть более конкретная порода, используйте ее (например, людей) вместо общей породы черепах, которая называет всех черепах - что было бы плохо, если у вас есть несколько пород. - person mattsap; 28.11.2017
comment
Спасибо вам обоим - согласен. @ mattsap - хороший улов, это была недосмотр, я отредактировал, чтобы исправить. - person Luke C; 28.11.2017