NetLo go - черепахи, чтобы запечатлеть «кто» на патчах и только переходы на переходы, которые соответствуют их «кто» - PullRequest
1 голос
/ 02 апреля 2020

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

# 1 - ошибка: невозможно использовать who в контексте патча

Я хотел использовать переменную 'who', чтобы пометить участки земли как принадлежащие черепахе, которая преобразовала участок, например, черепаха 0 отправляется в лес, превращает ее в землю, и этот участок земли должен быть «принадлежат» черепахе 0, т. е. переменная, принадлежащая участкам, должна быть эквивалентна «кто» черепахи. Проблема здесь в том, что «кто» является собственной переменной черепах. Поэтому, когда я использую его в контексте патча, он выдает ошибку. Например, ask smallholders [move-to one-of patches with [[owner = who]] -> ошибка.

# 2 - не удается установить глобальную переменную = 'who'

Два, я пытался Обойти это можно с помощью прокси-переменной: глобальная переменная с именем 'owner-ID'. Я бы использовал set owner-ID who, чтобы впечатать индивидуальный номер черепахи в идентификатор владельца. Похоже, это работает до некоторой степени, а именно, что переменная 'владельца' патчей соответствует черепахе, которая конвертировала патч. Он также работает при подсчете количества патчей сертифицированных и обычных черепах на полях (см. Команду set-land-ownership ниже). Тем не менее, когда запускаются команды smallholders-certify-crop-land, черепахи не придерживаются патчей, которыми они владеют, а «прыгают» по всему миру. При запросе черепах через командный центр ask turtles [print owner-ID] все они возвращают одно и то же значение идентификатора владельца. Я чувствую, что в моей командной строке перехода может быть ошибка, но я просто не могу ее найти.

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

Соответствующий код приведен ниже (я надеюсь)!

Большое спасибо и надеюсь, что все в безопасности! Мариус

globals [owner-ID]
turtles-own [conventional-land-ownership certified-land-ownership]
patches-own [owned-by owner certified?]

to setup [ 
  ask patches [
    set pcolor green     ;; green = forest
    set certified? "no"
    set owner "nobody"
    ]
]

to go
  ask turtles [set-land-ownership]
  ask smallholders [check-smallholder-status]
  tick
end

to set-land-ownership
  ask smallholders [
    set owner-ID who
    set conventional-land-ownership count patches with [owner = owner-ID and certified? = "no"]
    set certified-land-ownership count patches with [owner = owner-ID and certified? = "yes"]
  ]
end

to check-smallholder-status
  if wealth >= 0 and (conventional-land-ownership + certified-land-ownership) < SH_max-land-ownership [
    smallholders-choose-activity
    ]

  if wealth < 0 [
      set color red
      set shape "cow skull"
  ]

  if (conventional-land-ownership + certified-land-ownership) >= SH_max-land-ownership [
      set color orange + 2
  ]
end

;; smallholders-choose-activities is a reporter-based command where turtles choose the most economical option available. One of the outcomes is: smallholders-certify-crop-land 



to smallholders-certify-crop-land
  let available-patch max-one-of patches with [owner = owner-ID and certified? = "no"] [count neighbors with [certified? = "yes"]]

  ifelse not any? turtles-on available-patch [
    move-to available-patch
    ]
  []

  set wealth wealth - smallholder-certification-cost
  set pcolor brown + 1
  set certified? "yes"
end


1 Ответ

2 голосов
/ 02 апреля 2020

Ваш первый подход - определенно путь к go, и его можно исправить с помощью одной небольшой корректировки.

ask smallholders [move-to one-of patches with [owner = who]]

должно быть

ask smallholders [move-to one-of patches with [owner = [who] of myself]]

Внутри блока после with переменные находятся в контексте исправлений, но myself относится к агенту, который попросил исправления проверить их владельца, в данном случае каждого мелкого владельца. Глобальная переменная owner-ID тогда не нужна. Если вы проделаете это через остальную часть кода, ваша вторая проблема может решить сама.

НО, в общем, лучше вообще не использовать числа who, а обращаться к агенту напрямую. (Вы на самом деле применили этот подход неявно, когда инициализируете owner в nobody, что означает «нет агента».) Я не вижу, где вы запрашиваете патч для установки его владельца, но если smallholder включен патч, smallholder будет

ask patch-here [set owner myself]

, а строка выше теперь будет читать

ask smallholders [move-to one-of patches with [owner = myself]]

Гуру NetLo go предполагают, что мы используем who числа только тогда, когда есть нет другого подхода.

Надеюсь, это поможет, Чарльз

...