Участок в НетЛого разных пород с люком - PullRequest
1 голос
/ 28 октября 2019

У меня есть некоторые проблемы в построении пород. В частности, у меня есть три породы, 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.

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

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

1 Ответ

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

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

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 для «всех автомобилей, которые были заштрихованы продавцами», если вы не сохраните эту информацию в другой переменной где-нибудь. Но как это сделать - другой вопрос (который вы можете задать на этом сайте, если это необходимо).

...