Удаление набора агентов из другого набора агентов (агенты из первого набора, которые также присутствуют во втором наборе)

В моем коде 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]

Много вещей, чтобы сказать здесь:

  1. Ответ Чарльза технически верен.

Если a а также b являются агентские наборы, a with [ not member? self b ] даст вам агентов из a которые еще не в b,

Но я думаю, что есть лучшие способы выполнить то, что вы пытаетесь сделать. Я вернусь к этому, но сначала общий совет:

  1. Не использовать who !

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

let i who
; ...
ask companies with [who = i] [ ... ]

NetLogo должен просканировать все компании, чтобы найти ту, who число.

NetLogo может хранить ссылки на агентов напрямую. Используйте это вместо этого! Например:

let this-company self
; ...
ask this-company [ ... ]
  1. Особенно не используйте списки 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 номера!

Однако если вам не нужны отдельные переменные, я думаю, что лучшим решением будет:

  1. использование nw:turtles-in-radius,

Расширение NetLogo Networks имеет примитив, который делает именно то, что, я думаю, вы хотите сделать:

ask companies [ set my-neighbors nw:turtles-in-radius 3 ]

Вот и все.

Другие вопросы по тегам