Участок в NetLogo разных пород с люком

У меня проблемы с выводом пород. В частности, у меня три породы: sellers, buyers и cars. Отношения между породами примерно следующие:

if breed = buyers [
hatch-cars 1
[ set attribute_1 random-float 1
...]
]
if breed = sellers [
hatch-cars 1
[set attribute_2 random-float 1
...]

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

 ask cars with [breed = buyers ][plotxy attribute_1 ticks]
 ask cars with [breed = sellers ] [plotxy attribute_2 ticks]

но он ничего не отображает, и я не получал сообщения об ошибке. Затем я попробовал с

ask cars [plotxy attribute_1 ticks] 
ask cars [plotxy attribute_2 ticks]

и это почти нормально. Однако он показывает и другие моменты: кажется, что он учитывает все породы, buyers, sellers и cars. Если я напишу

if breed = buyers [ask cars [plotxy attribute_1 ticks]]
if breed = sellers [ask cars [plotxy attribute_2 ticks]]

Я получаю следующее сообщение об ошибке: You can't use BREED in an observer context, because BREED is turtle/link-only.

Как я могу исправить эту проблему?

Спасибо за помощь.


person still_learning    schedule 28.10.2019    source источник


Ответы (1)


Давайте начнем с того, что посмотрим, почему ваша первая попытка ничего не отображает:

ask cars with [breed = buyers ][plotxy attribute_1 ticks]
ask cars with [breed = sellers ] [plotxy attribute_2 ticks]

Когда вы объявляете породу в NetLogo, он создает специальный набор агентов, имя которого совпадает с именем породы. Если вы напишете:

breed [ buyers buyer ]
breed [ sellers seller ]
breed [ cars car ]

NetLogo создает три специальных набора агентов: buyers, sellers и cars. Каждый из этих наборов агентов содержит только черепах соответствующей породы. Также существует специальный turtles набор агентов, который содержит всех черепах в вашей модели, независимо от их породы.

Кроме того, у всех черепах есть переменная breed, которая относится к набору агентов породы, к которой они принадлежат. Каждая черепаха может быть либо «не разводимой» и иметь turtles в качестве значения своей breed переменной, либо принадлежать к одной (но не более чем одной) породе и иметь набор агентов этой породы в качестве значения их переменной breed.

Одна вещь, которую следует знать о переменной breed, заключается в том, что обычно вам не нужно ее использовать. Написание:

ask turtles with [ breed = cars ] [ do-something ]

Имеет тот же эффект, что и письмо:

ask cars [ do-something ]

За исключением того, что версия ask cars намного быстрее (и удобнее для чтения), чем версия ask turtles with ....

Теперь мы можем увидеть, что не так с ask cars with [breed = buyers ]? Все автомобили по определению имеют cars в качестве значения переменной breed, поэтому условие breed = buyers всегда будет ложным. Вот почему заявление ничего не делает. (И у него также нет причин выдавать вам сообщение об ошибке. Это все равно, что просить turtles with [ color = red ] сделать что-то, когда нет красных черепах: ничего не происходит, но нет ничего плохого в том, чтобы спросить.)

Теперь давайте посмотрим на вашу вторую попытку:

ask cars [plotxy attribute_1 ticks] 
ask cars [plotxy attribute_2 ticks]

Вы говорите, что «кажется, что он учитывает все породы», но, учитывая наше понимание того, как работают породы, вы должны быть в состоянии увидеть, что все, что с этим не так, этого не может быть. Насколько я могу судить, должно работать.

Я предполагаю, что вы где-то создавали дополнительные автомобили, не осознавая этого. А может это что-то другое. Мы не можем точно сказать с помощью предоставленной вами информации.

(Одно небольшое примечание: галочки обычно ставят на оси x, но вы наносите их на ось y.)

Наконец, ваша последняя попытка:

if breed = buyers [ask cars [plotxy attribute_1 ticks]]
if breed = sellers [ask cars [plotxy attribute_2 ticks]]

Мы видели, что breed - это переменная черепахи, поэтому к ней можно получить доступ только в контексте конкретной черепахи, и именно поэтому вы получаете предупреждение о попытке использовать ее в контексте наблюдателя (т. Е. При попытке использовать это вне контекста черепахи).


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

Может быть, последнее, что нужно прояснить, - это сказать что-то вроде:

ask one-of sellers [ hatch-cars 1 ]

не создает никаких отношений между только что вылупившимся автомобилем и породой sellers. Машина не знает, что ее вылупил продавец. И нет никакого способа запросить NetLogo «все автомобили, которые были выпущены продавцами», если вы не сохраните эту информацию где-нибудь в другой переменной. Но как это сделать - другой вопрос (при необходимости вы можете задать его на этом сайте).

person Nicolas Payette    schedule 29.10.2019
comment
Спасибо, Николас. У меня есть объяснение. Тем не менее, у меня все еще есть сомнения, например, как я могу построить две отдельные линейные диаграммы для автомобилей, купленных покупателями, например. К сожалению, мне это до сих пор непонятно. - person still_learning; 29.10.2019