Привязка черепах к другой черепахе с наибольшим значением в NetLogo. Ограничить количество ссылок

#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. используйте ту же логику / код, но упорядочивайте подмножество так, чтобы те, кто достиг максимального количества ссылок, исключались первыми