Может ли черепаха переменная "регистрироваться" для разных патчей?

    [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
Другие вопросы по тегам