2015-09-11 1 views
1

У меня есть модель в NetLogo, где агенты (черепахи) перемещаются по ландшафту и производят другие агенты (яйца) с заданной скоростью. Последние не двигаются. Моя цель - собрать координаты яиц и измерить такие вещи, как расстояние до ближайшего соседа.В RNetLogo, как я могу экспортировать список деталей агентов, не переписывая список каждый раз?

В RNetLogo У меня есть некоторый код, чтобы сделать это:

NLCommand("setup") 
NLDoCommandWhile("day < 10", "go") 
eggcoords <- list() 
eggcoords <- NLGetAgentSet(c("who","xcor","ycor"), "eggs") 

Проблема заключается в том, что модель замедляется, так как количество яиц увеличивается. Одно из решений заключается в том, чтобы убить яйца в конце дня, но сохранить их данные в списке, который я могу обновлять каждый день, не перезаписывая ничего. И вот где я застрял.

Надеюсь, вы сможете помочь.

ответ

2

Если день является постоянное число тиков (скажем, 24), вы могли бы сделать что-то вроде этого:

  1. Создать end-of-day процедуру в модели NetLogo где вы очистить яйца.

  2. Затем вызовите вашу модель, как это:

    turtles <- list() 
    
    NLCommand("setup") 
    
    # run for 10 days: 
    for (day in 1:10) { 
        NLCommand("repeat 24 [go]") 
        agent_set <- NLGetAgentSet(c("who", "xcor", "ycor", 
               "min [ distance myself ] of other turtles"), 
              "turtles") 
        names(agent_set) <- c("who", "xcor", "ycor", "nnd") 
        agent_set$day = day 
        turtles[[day]] <- agent_set 
        NLCommand("end-of-day") 
    } 
    

Примечание:

  1. В for цикле go выполняется 24 раз с одним NLCommand вызова
  2. Вы можете использовать любой NetLogo репортер в agent.var аргумент NLGetAgentSet, так что вы можете вычислить поздно ближайшего соседнего расстояния на лету с min [ distance myself ] of other turtles.
  3. Результат (turtles) - это список фреймов данных. Вы можете связать их с одной рамкой данных с помощью df_turtles <- do.call(rbind, turtles)
+0

Спасибо! Это действительно ускоряет модель и делает именно то, что я хочу. Затем я получаю пространственную статистику с пакетом plststat 'dist <- nndist (x, y), mean (dist)'. Мне было интересно, могу ли я включить оператор if в строку 'agent_set', чтобы избежать проблемы с получением ошибки, если не производится никаких яиц? –

+1

Да, вы можете изменить репортера NetLogo, используя ['ifelse-value'] (http://ccl.northwestern.edu/netlogo/docs/dict/ifelse-value.html). Проверьте, например, «подсчет других черепах> 0». – bergant

Смежные вопросы