#netlogo
#netlogo
Вопрос:
Я новичок в NetLogo и пытаюсь попросить некоторых черепах (студентов из разных социальных классов) ссылаться на другие черепахи (школы). Я бы хотел, чтобы учащиеся рабочего класса искали школу с наивысшим достижением, которая в то же время не дорогая и не достигла максимального количества разрешенных ссылок. Если желаемая школа достигла максимального количества разрешенных ссылок, я хочу, чтобы ученик искал следующую школу с наивысшим достижением, которая не достигла максимального количества разрешенных ссылок и так далее.
Это код. Я получаю следующее сообщение «ЕСТЬ? ожидалось, что ввод будет набором агентов, но вместо этого получил черепаху (школа 1).»
breed [schools school]
breed [upperclass upperclass-student]
breed [workingclass workingclass-student]
upperclass-own [achievement enrolled? target]
workingclass-own [achievement enrolled? target]
schools-own [schoolachievement expensive? ]
to setup
clear-all
set-default-shape schools "house"
set-default-shape upperclass "person"
set-default-shape workingclass "person"
ask patches [ set pcolor 8 ]
create-schools num-of-schools [ setxy random-xcor random-ycor set schoolachievement random-normal 5 1
set expensive? one-of [ true false ] ]
create-upperclass num-of-upperclass [ set color white setxy random-xcor random-ycor set achievement
random-normal 5 1 ] ;Students from upper class have higher achievement
create-workingclass num-of-workingclass [ set color red setxy random-xcor random-ycor set achievement
random-normal 4 1 ]
end
to go
ask workingclass [
choose-school ]
end
to choose-school
if breed = workingclass [
set target one-of schools with-max [ schoolachievement ] with [ expensive? = false ] ]
if any? target with [ count link-neighbors < max-link-count ] [
create-link-with target ]
set enrolled? TRUE
end
Комментарии:
1. краткий комментарий — я исправил ваше форматирование (и удалил теги, комментарии и т.д., Которые не соответствуют процедурам SO). В будущем фигурные скобки форматируются как код вместо того, чтобы пытаться делать это с помощью кавычек. Также полезно указать, какая строка выдает ошибку (NetLogo выделит ее желтым цветом)
Ответ №1:
Ваша проблема заключается в разнице между агентом и набором агентов, что является несколько тонкой проблемой. with-max
Возвращает набор агентов — набор агентов (в данном случае черепах). Этот набор агентов может содержать 0 членов, 1 члена, 2 члена, но является набором, даже если он пуст. Однако one-of
выбирает один агент из набора агентов и возвращает его как агент, а не как набор агентов. То есть NetLogo знает, что все, что возвращается one-of
, должно быть точно одним агентом. На этом этапе примитивы, предназначенные для наборов агентов (например any?
), выдадут ошибку, если только они не могут также использоваться на отдельных агентах.
Итак, вернемся к вашему коду. Мне нравится удобочитаемость проверки наличия жизнеспособных школ, а затем выбора одной, что, я думаю, вы и хотели сделать. Это было бы:
to choose-school
if breed = workingclass
[ set targets schools with-max [ schoolachievement ] with [ expensive? = false ]
set candidates targets with [ count link-neighbors < max-link-count ]
if any? candidates
[ create-link-with one-of candidates
set enrolled? TRUE
]
]
end
Обратите внимание, что я также изменил значение targets вместо target, что является одним из способов отслеживать, является ли что-либо агентом или набором агентов.
Другой способ, которым вы могли бы сделать это и сохранить его в качестве агента, — это:
to choose-school
if breed = workingclass [
set target one-of schools with-max [ schoolachievement ] with [ expensive? = false ] ]
if target != nobody and [count link-neighbors] of target < max-link-count [
create-link-with target ]
set enrolled? TRUE
end
Таким образом, вы можете использовать nobody
вместо any?
, но вы также не можете использовать with
в этой строке, потому что with
на самом деле это фильтр для набора.
Я также думаю, что у вас проблема с брекетингом — я предполагаю, что вы хотите set enrolled? TRUE
заключить в скобки. Я оставил это во втором исправлении, но изменил в первой ошибке (а также изменил соглашение о положении скобок, чтобы сделать структуру блока кода более заметной)
Комментарии:
1. Спасибо @JenB за исправление формата, исправление кода [который работает нормально] и за отличную часть обучения.
2. Я вижу, что некоторые школы с более низкой успеваемостью в школе не имеют ссылок, что означает, что черепахи нацелены только на школы с наивысшим достижением, в то время как я хотел бы сделать, чтобы черепахи пошли и нацелились на следующую лучшую жизнеспособную школу (у которой будет более низкое достижение, чем у школы с наивысшими достижениями). Имеет ли это смысл? Большое спасибо
3. Не уверен, что я полностью понимаю, но вы можете использовать скобки () так же, как вы делаете в математике, чтобы получить биты, которые будут первыми
4. спасибо, я имею в виду, что как только школы с наивысшим достижением достигнут максимального количества ссылок, черепахи нацеливаются на школу с наивысшим достижением (исключая тех, кто достиг максимального количества ссылок) и так далее, пока во всех школах не будет черепах, которые связаны. Спасибо
5. используйте ту же логику / код, но упорядочивайте подмножество так, чтобы те, кто достиг максимального количества ссылок, исключались первыми