Netlogo, написание и вызов функции - PullRequest
0 голосов
/ 24 сентября 2019

Я хочу написать функцию, в которой список, содержащий набор агентов, удаляется, если выполняется определенное условие.В этой ситуации, если переменная собственной черепахи установлена ​​умершей?= true, удалите их из списка.У меня есть несколько списков, и я хочу сделать это для всех списков, поэтому я пишу функцию для этого.Я не уверен, как написать отчет в функции или даже если это необходимо.Также как мне вызвать функцию

breed [traps trap]
breed [Cages cage]
breed [foxes fox]

traps-own[list-trapped-foxes]
Cages-own[list-caged-foxes]
foxes-own [deceased?]

to-report remove-agents [list-x]
foreach list-x[
  i ->
    ask i[
      if deceased? = True [
      let agent-to-be-removed self
      ask myself [
        set list-x remove agent-to-be-removed list-x
        report list-x
        ]
      ]
    ]
  ]
end

to renew-agents
  ask traps [remove-agents list-trapped-foxes]
  ask Cages [remove-agents list-caged-foxes]  
end

1 Ответ

1 голос
/ 24 сентября 2019

а) Очень редко (или даже разрешено) изменять список, пока вы итерируете его, как вы пытаетесь это сделать здесь.

б) Как сказал ДженБ, было бы разумнееиспользовать наборы агентов вместо списков, если можете.(Одна из причин, по которой вам могут понадобиться списки, заключается в том, что один и тот же агент должен присутствовать в списке более одного раза; предотвращение этого может быть причиной для использования наборов агентов.

Если бы list-x был набором агентов, вы должны использовать:установить list-x list-x с [не умершим?]

c) Что вам нужно для списков, так это примитивный «фильтр»: я не пробовал, но это должно работать вместо всего вашего репортера: установить список-x фильтр (не умер?) list-x

(Не забывайте всегда проверять, написано ли то, что вам нужно, перед повторным запуском, особенно для такой распространенной задачи!)

...