Почему NetLogo создает Blob вместо четкой формы? - PullRequest
0 голосов
/ 28 февраля 2019

Я новичок в кодировании.Я рад получить конструктивную критику не только о своих проблемах, но и о том, как я их описываю.

У меня проблема с этим кодом в NetLogo:

patches-own[grass]
to setup
  clear-all
  ask one-of patches              ;;pic a random patch as center of the pasture
    [set grass 1]                 ;;and plant grass on it
  ask patches                     ;;search through all the patches to find the one (or several ones) 
    [if grass > 0                 ;;with grass on it
      [ask patches in-radius 3    ;;select the area arround the patch with the grass
        [set grass 1]]]             ;;and also plant grass here
   ask patches                     ;;search through all the patches to find the one (or several ones)
    [if grass > 0                 ;;with grass on it
      [set pcolor green]]         ;;and paint them green
  reset-ticks
  end

Первоначальный код былбольше, но я сузил проблему до этого фрагмента.Это часть процесса настройки модельного мира, и цель здесь состоит в том, чтобы случайным образом создать пастбище определенного размера в модельном мире.(Чтобы коровы искали и поели, но сейчас это не предмет)

Я ожидал, что код случайным образом выберет патч и посадит на нем траву, а затем увеличит площадь вокруг этого участка до определенного размера.То, что я ожидал в качестве результата, было примерно таким:

ожидаемый результат

Но вместо этого я получаю зеленую область переменных размеров и форм, которая иногда охватывает весь мир,Так же, как Blob.Вот несколько примеров его отличного внешнего вида:

BLOB-объектов

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

Код очень прост и понятен.Так что, я думаю, это скорее проблема понимания интерпретации команд Netlogos.

Почему NeLogo не выполняет команды так, как я ожидаю?

1 Ответ

0 голосов
/ 28 февраля 2019

Отличный вопрос!Ключевая часть этого бита:

  ask patches                     ;;search through all the patches to find the one (or several ones) 
    [if grass > 0                 ;;with grass on it
      [ask patches in-radius 3    ;;select the area arround the patch with the grass
        [set grass 1]]]

ask выполняет итерацию каждого из патчей, каждый из которых запускает прилагаемый код по очереди.ask делает это в случайном порядке (или, точнее, наборы агентов, такие как patches, неупорядочены).Например, предположим, что patch 0 0 запускает этот код и дает траву окружающим патчам.Патч 0 1 случается следующим.Так как теперь у него есть трава (переданная ему патчем 0 0), он также дает траву своим соседям.Теперь предположим, что следующий путь 0 2, и так далее.Таким образом, форма большого двоичного объекта будет зависеть от порядка, в котором патчи запускают код. Если патч получил траву от одного из своих соседей, он даст его соседям траву.

К счастью,исправить это просто.Вместо того, чтобы проверять, есть ли у патча трава, когда он запускает этот блок кода, вы можете попросить просто патчи с травой запустить его, используя with.Это выглядит следующим образом:

  ask patches with [ grass > 0 ] ;;search through all the patches to find the one (or several ones) 
    [ask patches in-radius 3     ;;select the area arround the patch with the grass
      [set grass 1]]

patches with [ grass > 0 ] относится только к тем патчам с травой (до того, как какие-либо патчи что-либо сделают), так что патчи, которые получают траву во время выполнения запроса, не заканчиваются его выполнениемсами по себе.

...