Добавление того же элемента в другие списки - PullRequest
1 голос
/ 25 октября 2019

Мне нужно знать, возможно ли добавлять один и тот же элемент в несколько списков одновременно. В частности, я хочу добавить элементы в список одной черепахи и в списки всех черепах, связанных с этой черепахой. Примерно так:

set list lput item list (список черепах)

set list lput item list (списки соседей)

Элемент, который должен быть таким же. Вы можете изобразить график: черепахи - это узлы, и каждая черепаха имеет свой список. Мой подход был:

ask one-of turtle[
set list lput item list
foreach [in-link-neighbors] of turtles-here
 [  item -> set list lput item list ] 
]

Спасибо за вашу помощь

1 Ответ

2 голосов
/ 25 октября 2019

Краткий ответ - да, это возможно.

Вот полная модель с распечаткой, чтобы вы могли видеть, что она делает.

turtles-own [mylist]

to setup
  clear-all
  create-turtles 10
  [ set color blue
    set mylist (list random 10)
  ]
  ask turtles [ create-links-with n-of 2 other turtles ]
  layout-circle turtles 7
  ask turtles [show mylist]
  ask one-of turtles [add-item-egonet]
  ask turtles [show mylist]
  reset-ticks
end

to add-item-egonet
  let new-value 3
  let targets (turtle-set self link-neighbors)
  ask targets
  [ set color red
    set mylist lput new-value mylist
  ]
end

Вы не сказали, что произошлокогда вы попробовали свой код, но получили бы ошибку, потому что item и list являются ключевыми словами NetLogo. У вас также есть логическая ошибка - когда вы ask черепаха, вы переключаете перспективу (или «контекст» в терминологии NetLogo) на эту черепаху, последующий turtles-here подхватит всех черепах в этом же патче.

Большая разница между нашими подходами заключается в том, что я использовал наборы агентов, а не списки. Это можно сделать, просматривая список черепах, но если вы пишете код NetLogo, который запускает foreach над списком черепах, первое, что вы должны сделать, это переосмыслить свой подход. Существуют конкретные ситуации, когда вам нужны списки черепах, например, если вам нужно отслеживать последовательность других черепах, с которыми встречалась черепаха. Однако, если вы не находитесь в одной из этих ситуаций, лучше использовать наборы агентов и ask.

Итак, переключаясь на парадигму наборов агентов, мой код создает набор агентов из черепах, который я хочу изменить (выбранной черепахи и ее соседей по сети), а затем просто говорит им добавить новое значение в конце их собственных списков значений.

Обратите внимание, что в рамках модели это может быть достигнуто с помощью одной строки путем построениянабор черепах одновременно с запросом, но было бы более типично делать что-то вроде (изнутри ask, так что перспектива - какая-то выбранная черепаха):

set mylist lput new-value mylist
ask link-neighbors [ set mylist lput new-value mylist ]
...