Найдите разницу между двумя переменными агентов двух разных пород - Netlogo

У меня есть 2 типа агентов, мальчики и девочки.

breed [boys boy]
breed [girls girl]

У каждой черепахи есть возраст из набора данных. Кроме того, когда агент мальчик, его мальчик? верно, а если это девочка, девочка? правда.

turtles-own [ 

    age
     boy?
       girl?

]

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

  ask boys [

    ask link-neighbors with [girls? = true]
    [  
      set Gage age]
       let H abs(item 0 age - item 0 Gage)  
  ]

Редактировать Когда я использую ask link-neighbors with [girls? = true]соседи учитываются все вместе, в то время как я хочу, чтобы они один за другим учитывались, где я могу сравнить их разницу в возрасте и на основе этого сделать некоторые другие вещи . Какие-либо предложения? Спасибо


person user710    schedule 10.02.2018    source источник


Ответы (1)


Это не проверено, но я надеюсь, что это достаточно близко, чтобы вы туда попали, если это не так.

Во-первых, у вас какая-то путаница с вашими породами, а у черепах - собственный показатель пола. Было бы намного проще иметь и то, и другое. Полностью откажитесь от собственного утверждения черепах и просто проверьте breed, потому что тогда вы не сможете вносить ошибки, когда (например) у вас есть флаг (девочка? или мальчик?), несовместимый с породой, или оба установлены на ИСТИНА или что-то еще. То, как вы это настроили, возможно иметь черепаху породы мальчик, но случайно установить ее переменную мальчика? на ЛОЖЬ. Эти переменные вообще не нужны, breed — это автоматическая переменная (например, who число или size, созданное с помощью черепахи), и вы можете напрямую протестировать породу.

Приступая к вашей фактической ошибке, вы просите link-neighbors установить их переменную Gage, а не устанавливать значение исходной черепахи, которая делает запрос (то есть черепахи, которая является центром этой сети эго).

ОБНОВЛЕНО из комментариев, вы хотите, чтобы у мальчика был список (названный ниже возрастной разницей) разницы в возрасте между его собственным возрастом и всеми девушками, с которыми он связан. Примитив map используется для вычитания константы из списка, а запрос значений переменных of и набор агентов создает список этих значений.

boys-own [age-diff]

ask boys
[ let my-girls link-neighbors with [breed = girls]
  if any? my-girls
  [ set age-diff map [ x -> abs (x - age) [age] of my-girls ] ]
]
person JenB    schedule 10.02.2018
comment
Большое спасибо за ответ. Не могли бы вы уточнить это? - person user710; 10.02.2018
comment
проверить породу, потому что тогда вы не сможете внести ошибки, когда (например) у вас есть флаг (девочка? или мальчик?), несовместимый с породой, или оба установлены на ИСТИНА или что-то еще - person user710; 10.02.2018
comment
Близко к тому, что вы упомянули, я хочу, чтобы у каждого мальчика была переменная с именем H, которая содержит разницу (не среднюю) между возрастом его соседки и им самим. Им нет дела до соседей-мальчиков. Проблема в том, что когда я прошу мальчиков найти эту разницу для всех своих соседок-девочек, я не могу вычесть возраст, потому что для выполнения всего с переменными Netlogo учитывает переменные link-neighbors, которые были заданы позже, чем мальчики. - person user710; 10.02.2018
comment
Мне нужно что-то вроде этого ask boys [ ask link-neighbors (one by one) with [breed = girls] let diff [age] of boy i - [age] of link-neighbor j with [breed = boys] ] - person user710; 11.02.2018
comment
У каждого мальчика есть ровно одна девочка-соседка? Или вам нужен список всех возрастов соседских девушек? - person JenB; 11.02.2018
comment
Я обновил ответ, чтобы создать список. Обратите внимание, что если единственное, что вы хотите сделать со списком, это выбрать девушку с минимальной разницей в возрасте (например), вам не нужно создавать список явно, и вы можете использовать аналогичный код в команде min-one-of - person JenB; 12.02.2018