Как MAP через агентский набор?
Мне нужно перебрать определенный набор патчей агента и получить соседей из них всех, а затем присоединиться к этим...
Я бы сделал что-то вроде
reduce patch-set (map [patch-set neighbors self] patches with [somecondition?])
Но MAP и REDUCE не будут работать на наборах агентов!
2 ответа
Нормальная идея map
на самом деле не имеет смысла для набора, но вы можете создать список с of
, а затем преобразовать его в набор патчей.
let _nbrs patch-set [neighbors] of mypatches
Вы фильтруете либо mypatches
или же _nbrs
с with
на любых условиях вы хотите.
Вот сумасшедший взлом, который я сделал, чтобы справиться с такой проблемой. Обратите внимание, что я действительно хотел сделать список числовых значений, полученных в результате применения функции к каждому агенту в наборе агентов, но нет. Мне нужно, чтобы они все применили функцию, касающуюся меня, а затем я должен вызвать функцию еще один раз, чтобы выяснить, какой результат был передан мне. Мне также пришлось переписать функцию, чтобы в качестве аргумента можно было указать интересующего меня агента (если я запускаю его) или меня в качестве аргумента (если агент запускает его для меня). Шиш!
to-report min-edge-distance [agentset maxsize]
report ifelse-value (any? agentset)
[edge-distance min-one-of agentset [edge-distance myself true] false] ; grr, what I want is min map edge-distance agentset, instead I have to do backflips
[maxsize]
end
to-report edge-distance [alex me?]
report ifelse-value (me?) ;because of netlogo's perverse syntax, I've been forced to ask someone else to figure out my edge distance – alex may be me!
[(distance alex) * (sqrt [energy] of alex / (sqrt [energy] of alex + sqrt energy) )] ;alex is me!
[(distance alex) * (sqrt energy / (sqrt [energy] of alex + sqrt energy) )] ; alex is not me
end