Val, я понимаю, что вы изначально спрашивали: «Я хотел бы спросить вас о разнице в использовании let и set». но позже вы объясните, что вам нужно реализовать, на что я и ответил. Итак, название этого вопроса не очень точное.
Я не уверен, что это единственный путь, но я пытался решить вашу проблему, насколько я понимаю, используя две породы (людей и предметы). Я надеюсь, что из приведенного ниже кода вы увидите, как это сделать - просто нигде не используйте «Ask-Turtles», если вы не хотите воздействовать как на людей, так и на объекты. в проблемы.
Рабочий код приведен ниже.
Как я интерпретировал ваш вопрос,
- объекты являются постоянными и глобальными,
- изменяется наатрибуты объекта кем-либо в любое время обновят значение этого атрибута для этого объекта в my-list каждого агента
- каждый человек имеет свой собственный список my-list, возможно, пустой.
- my-списки разных агентов будут отличаться
- каждый человек может искать один из объектов из своего списка, основываясь на атрибуте, и я сохраняю полученный объект, если он есть, в их текущем выборе.
- каждый человек должен иметь возможность выбрать любой из объектов и добавить этот объект в свой my-list
Выбор дизайна реализации:
- Используйте дваo породы, «люди» и «объекты», которые имеют разные переменные.
- Каждый объект обладает атрибутом и типом объекта (например, «яблоко» или «апельсин»)
- Каждый человеквладеет моим списком и текущим выбором. my-list - это список, а current-choice - агент (возможно = nobody )
Особенности кода ниже
Код создает 5 человек и 6 объектов для тестирования. Все они просто остаются сидящими в начале координат на дисплее.
На каждой итерации шага "go", случайный человек выбирает два случайных объекта и добавляет их в свои my-list, а затем находит один из них на основе значения атрибута.
код создает список из всех объектов в my-list, имеющих требуемый атрибут,который может иметь ноль, один или несколько объектов в нем, и делает что-то разумное в зависимости от длины списка.
ни один элемент не был удален из моего списка или проверен, чтобы убедиться, что он там уже есть.
, это все, что он делает. Запустите программу установки, запустите go (один раз) и проверьте результаты.
Надеюсь, это полезно. Дайте мне знать, если я не ответил на ваш вопрос.
Wade
;; this is the second version of the code. It has some comments removed or
;; corrected, and initializes current-choice to nobody instead of []
globals [found?] ;; keep track of whether we found an object
breed [objects object]
breed [people person]
objects-own [
object-type ; say "apple" or "orange" or "widget"
attribute ; user defined, apparently an integer
]
people-own[
current-choice ; an agent
my-list] ; a list of objects
to setup
clear-all
make-people
make-objects
reset-ticks
end
to go
;; for debugging we'll push two objects onto the my-list for a random agent
;; then find one of them with the right attributes and pull it into current-choice
ask one-of people[
;; select a random apple, set its attribute to 111,
;; and push it onto this turtle's my-list
set current-choice one-of objects with [object-type = "apple"]
ask current-choice [set attribute 111 ]
set my-list ( lput current-choice my-list )
;; select a random orange, set its attribute to 222,
;; and push it onto this turtle's mylist
set current-choice one-of objects with [object-type = "orange"]
ask current-choice [set attribute 222 ]
set my-list ( lput current-choice my-list )
;; ok, let's see if we can find an object in my-list with attribute 111
let want-attribute 111 ;; for debugging purposes
;; make a list of ALL objects on the list with the desired attribute
;; as far as we know,there may be many, one, or zero objects with this attribute
let found-list filter [ i -> want-attribute =[attribute] of i ] my-list
if-else length found-list > 0
[ ;; we found at least one match
set found? true
;; pick a random object from the list of objects which have the desired attribute
set current-choice one-of found-list
]
[ ;; we didn't find any matches
set current-choice nobody
set found? false
;; do whatever you do when there is no matching object
]
;; if desired, check out how things ended up by uncommenting the next
;; two lines:
;; inspect current-choice
;; inspect self
]
tick ;; update the tick counter
end
to make-people
create-people 5
[
set current-choice nobody
set my-list []
]
end
to make-objects
create-objects 3 ; create 3 apples
[ set object-type "apple"
set attribute 333 ]
create-objects 3 ; create 3 oranges
[ set object-type "orange"
set attribute 555 ]
end
;; Above code was created by Wade Schuette, 3-November-2019
;; modified sightly 4-November-2019
;; No copyright is claimed. Enjoy!