Соответствие двум различным типам агентов по их свойствам в Netlogo - PullRequest
0 голосов
/ 24 мая 2019

У меня есть агенты двух типов в Netlogo (фирмы и работники), и они связаны через общий идентификатор, который, однако, является свойством агента (называемый ID для фирм и FirmID для работников).Я заинтересован в том, чтобы попросить фирмы отобразить свою рабочую силу, выполнив запрос для фирм, попросив их отобразить число всех работников, чтобы переменная «firmID» работников равнялась переменной «ID» фирмы, как описано ниже:

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

какой-нибудь воспроизводимый игрушечный код:

breed [Firms firm]
breed [Workers worker]
Firms-own[
 ID
] 

Workers-own[
 FirmID
]

to agent-creation
create-workers 3; There are 3 workers
create-firms 2; There are 2 firms
  ask worker 0 [set FirmID "333-1"]
  ask worker 1[set FirmID "333-1"]
  ask worker 2[set FirmID "444-1"]
  ask firm 3 [set ID "333-1"]
  ask firm 4 [set ID "444-1"]
end
; Thus, firm 333-1 has 2 workers, 444-1 has only one.

и теперь

to matching-procedure
  ask firms [show count workers with [FirmID = [ID] of self]]
end

не работает, но

ask firms with [ID = "333-1"][show count workers with [FirmID = "333-1"]]

делает.

Процедура должна вывести [2 1] (я положу результат в список, но ясно, что идея состоит в том, что на фирме 333-1 работают 2 работника, а на 444-1 только один). Таким образом, фирма 333-1 должнаобъявить 2 и 444-1 только один.

1 Ответ

2 голосов
/ 24 мая 2019

Очень часто смешивать self и myself, что вы и сделали. Попробуйте:

to matching-procedure
  ask firms [show count workers with [FirmID = [ID] of myself]]
end

Причина, по которой вам нужно myself, заключается в том, что идентификатор переменной принадлежит фирме, которая является агентом, выполняющим запрос. Напротив, self это тот, о котором спрашивают. Таким образом, ваш исходный код генерирует ошибку, сообщающую, что работникам не принадлежит идентификатор атрибута.

Это решает твою проблему. Так же, как общий комментарий о связывании фирм / работников или других компаний со многими отношениями в NetLogo, лучше избегать использования идентификаторов и просто хранить агента. Это будет выглядеть так:

breed [Firms firm]
breed [Workers worker]
Firms-own[
 my-workers
] 

Workers-own[
 my-firm
]

to agent-creation
  clear-all
  create-firms 2; There are 2 firms
  create-workers 3
  [ set my-firm one-of Firms
  ]
  ask Firms
  [ set my-workers workers with [my-firm = myself]
  ]
end

to check-allocation
  ask Firms [show my-workers]
  ask Workers [show my-firm]
end

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

...