Может ли черепаха переменная "регистрироваться" для разных патчей?
[ifelse ( random-float 1 < 0.99 ) [
set security-apprehension security-apprehension + 1 ][
set successful-shoplifts successful-shoplifts + 1 ]
Привет.
Вышеприведенный фрагмент взят из раздела кодирования, связанного с поведением магазинного вора, и показывает две собственные переменные черепахи (восприятие безопасности и успешные похищения магазина), одна из которых будет увеличиваться, а другая останется прежней. Это может произойти, только когда черепаха находится на определенном участке (магазин). Я бы хотел, чтобы "security-repreating" возвращался к 0, когда черепаха не находится в этом патче, и чтобы счет был "зарегистрирован", то есть вернуться к тому, что было ранее, когда черепаха вернулась в патч, чтобы я мог установить критерии, позволяющие определить, следует ли считать, что магазинный вор является преступником в отдельных магазинах.
Пожалуйста, кто-нибудь может подсказать, как это может быть достигнуто?
1 ответ
Добро пожаловать в stackru! Возможно, вы захотите взглянуть на справочную систему, чтобы узнать, как включить вопрос. Часто полезно включить минимальный рабочий код (например, очень базовую / игрушечную версию кода вашей модели), чтобы обеспечить контекст того, как вы структурируете свою модель. На самом деле, я не уверен на 100% в выводе, который вам нужен, но вот попытка, которая использует table
расширение для создания специального словаря черепахи для хранения координат патча в виде ключа в паре с уровнем восприятия безопасности соответствующего патча.
Во-первых, настройка:
extensions [ table ]
turtles-own [ security-table current-security-apprehension]
to setup
ca
ask n-of 20 patches [
set pcolor green
]
crt 1 [
setxy random-xcor random-ycor
set security-table table:make
set current-security-apprehension "NA"
]
reset-ticks
end
Теперь вы можете попросить своих черепах проверить, находятся ли они в "магазине". Если они есть, проверьте, есть ли у магазина уже связанный уровень восприятия безопасности - если нет, назначьте его. Затем запросите эту таблицу, чтобы получить соответствующий уровень восприятия безопасности для текущего хранилища (более подробно в комментариях).
to go
ask turtles [
set current-security-apprehension "NA"
rt random 91 - 45
fd 1
; If you're at a 'store'
if [ pcolor ] of patch-here = green [
; Use the pxcor-pycor pair in a list as a dictionary
; key to store/check security apprehension in a table
let this-key list pxcor pycor
; Check if the store has been visited
if not table:has-key? security-table this-key [
; If not, store the security value for this store
; (randomly chosen, in this example- how you set this
; depends on your model)
table:put security-table this-key one-of [ "high" "medium" "low" ]
]
; Get the security apprehension level for the current patch
set current-security-apprehension table:get security-table this-key
]
if current-security-apprehension != "NA" [
show ( word "Security apprehension on " patch-here " is " current-security-apprehension )
]
]
tick
end
Если это не совсем то, что вы имеете в виду, возможно, вы захотите предоставить немного больше подробностей в своем вопросе - в том числе больше кода или описание того, что вы уже пробовали, возможно, будет полезно.
Редактировать:
Модифицированная версия вышеуказанного согласно пояснениям в комментариях:
extensions [ table ]
turtles-own [ security-table shoplift-table current-security-apprehension]
to setup
ca
ask n-of 20 patches [
set pcolor green
]
crt 1 [
setxy random-xcor random-ycor
set security-table table:make
set shoplift-table table:make
set current-security-apprehension 0
]
reset-ticks
end
to go
ask turtles [
set current-security-apprehension "NA"
rt random 91 - 45
fd 1
; If you're at a 'store'
if [ pcolor ] of patch-here = green [
; Use the pxcor-pycor pair in a list as a dictionary
; key to store/check security apprehension in a table
let this-key list pxcor pycor
; Check if the store has been visited, add shoplift
; and security values as needed
if not table:has-key? security-table this-key [
table:put security-table this-key 0
table:put shoplift-table this-key 0
]
; Try to shoplift- if random value 0-1 is less than
; 0.98, count as a success. Otherwise, add one to
; security score
ifelse random-float 1 < 0.98 [
; Increase the current shoplifting value by one
let cur-shop table:get shoplift-table this-key
table:put shoplift-table this-key cur-shop + 1
] [
; Otherwise, increase the security apprehension by 1
let cur-sec table:get security-table this-key
table:put security-table this-key cur-sec + 1
print "Caught you red-handed."
; Check if they have been caught here 2 or more times:
if table:get security-table this-key >= 2 [
print "CALL THE POLICE!"
]
]
]
]
tick
end