Удаление набора агентов из другого набора агентов (агенты из первого набора, которые также присутствуют во втором наборе)
В моем коде netlogo у меня есть сеть с компаниями (это моя порода). Я хочу попросить компании поделиться информацией со своими соседями и соседями, и так далее, это работает (см. Код ниже, наборы агентов b, c и d).
Однако, когда я запрашиваю информацию о соседях третьего уровня, мой набор агентов также включает в себя соседей первого уровня (очевидно, поскольку он учитывает всех соседей), поэтому я хочу удалить этих соседей первого уровня из набора агентов соседей третьего уровня. В коде это означает, что я хочу удалить агентов, присутствующих в D
которые также присутствуют в B
Но я не могу найти способ сделать это, other
не работает, так как это не агент, спрашивающий, который должен быть удален. А также remove
также, кажется, не делает работу. Я тоже пробовал !=
не равен первому уровню, но это сообщает true
или же false
и я просто хочу удалить эти агенты из набора агентов третьего уровня, чтобы не считать их дважды.
ask companies [
let i who
let b link-neighbors
ask b [ let c link-neighbors
ask c [ let d link-neighbors
ask companies with [who = i] [
set iburen [who] of b
set iiburen [who] of other c
set iiiburen [who] of d
]
]
]
]
кто-нибудь может мне помочь с этим?
2 ответа
Я думаю, что вы хотите, это member?
примитивный. Если D и B - наборы агентов, следующее должно дать вам членов D, которые не являются членами B.
let DminusB D with [not member? self B]
Много вещей, чтобы сказать здесь:
- Ответ Чарльза технически верен.
Если a
а также b
являются агентские наборы, a with [ not member? self b ]
даст вам агентов из a
которые еще не в b
,
Но я думаю, что есть лучшие способы выполнить то, что вы пытаетесь сделать. Я вернусь к этому, но сначала общий совет:
- Не использовать
who
!
who
у примитива есть несколько (очень мало) законных способов использования, но в основном это зло. Это приводит к хрупкому, неэффективному коду. Например, когда вы делаете:
let i who
; ...
ask companies with [who = i] [ ... ]
NetLogo должен просканировать все компании, чтобы найти ту, who
число.
NetLogo может хранить ссылки на агентов напрямую. Используйте это вместо этого! Например:
let this-company self
; ...
ask this-company [ ... ]
- Особенно не используйте списки
who
номера!
NetLogo подходит для манипулирования списками, но отлично подходит для манипулирования наборами агентов. Если вы делаете что-то вроде этого:
set iburen [who] of b
set iiburen [who] of other c
set iiiburen [who] of d
Вы утрачиваете силу наборов агентов. Я не знаю, почему вы хотите хранить три разных уровня отдельно, но, предположив, что все ваши соседи можно хранить вместе, вы можете сделать следующее:
set my-neighbors other (turtle-set b c d)
Использование other
исключит оригинальную компанию и turtle-set
удостоверится, что каждый агент в наборе уникален (поскольку наборы агентов в любом случае могут содержать только уникальных агентов).
Если вам действительно нужны три отдельные переменные, используйте ответ Чарльза, но обязательно храните наборы агентов, а не списки who
номера!
Однако если вам не нужны отдельные переменные, я думаю, что лучшим решением будет:
- использование
nw:turtles-in-radius
,
Расширение NetLogo Networks имеет примитив, который делает именно то, что, я думаю, вы хотите сделать:
ask companies [ set my-neighbors nw:turtles-in-radius 3 ]
Вот и все.