NetLogo - с помощью BehaviorSpace получить все местоположения черепах в результате каждого повторения - PullRequest
0 голосов
/ 18 сентября 2018

Я использую BehaviorSpace для запуска модели сотни раз с разными параметрами.Но мне нужно знать местоположение всех черепах в результате, а не только количество черепах.Как я могу добиться этого с BehaviorSpace?

В настоящее время я вывожу результаты в файл CSV с помощью этого кода:

to-report get-locations
  report (list xcor ycor)
end

to generate-output
  file-open "model_r_1.0_locations.csv"
  file-print csv:to-row get-locations
  file-close
end

, но все результаты отображаются в одном файле CSV, поэтому я могуне говорите условия каждого бега.

1 Ответ

0 голосов
/ 19 сентября 2018

Предложение Сета о включении behaviorspace-run-number в имя файла вашего вывода csv является одной из альтернатив.Это позволит вам связать этот файл со сводными данными в вашем основном выходном файле BehaviorSpace.

Другой вариант - включить репортеров списков в качестве «мер» в определение эксперимента в пространстве поведения.Например, в вашем случае:

map [ t -> [ xcor ] of t ] sort turtles
map [ t -> [ ycor ] of t ] sort turtles

Затем вы можете проанализировать полученный список «вручную» на вашем любимом языке анализа данных.Ранее я использовал для этого следующую функцию в Джулии:

parselist(strlist, T = Float64) = parse.(T, split(strlist[2:end-1]))

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

В приведенном выше примере я вывел отдельные списки для xcor и ycor черепах.Вы также можете вывести один «список списков», но анализ будет более сложным.


Редактировать: Как сделать это, используя расширение csv и R

По совпадению,Мне пришлось сделать что-то подобное сегодня для другого проекта, и я понял, что комбинация csv extension и R. может сделать это очень легко.

Общая идея заключается в следующем:

  • В NetLogo используйте csv:to-string для кодирования данных списка в строку, а затем запишите эту строку непосредственно в вывод BehaviorSpace.

  • В R используйте purrr::map и readr::read_csv, а затем tidyr::unnest, чтобы распаковать все в аккуратный "один"наблюдение за строкой "dataframe.

Другими словами: нам нравится CSV, поэтому мы помещаем CSV в наш CSV, чтобы мы могли анализировать, пока мы анализируем.

Вотполноценный пример.Допустим, у нас есть следующая модель NetLogo:

extensions [ csv ]

to setup
  clear-all
  create-turtles 2 [ move-to one-of patches ]
  reset-ticks
end

to go
  ask turtles [ forward 1 ]
  tick
end

to-report positions
  let coords [ (list who xcor ycor) ] of turtles
  report csv:to-string fput ["who" "x" "y"] coords
end

Затем мы определим следующий крошечный эксперимент BehaviorSpace, только с двумя повторениями и ограничением по времени, используя наш репортер positions в качестве вывода:

enter image description here

Код R для его обработки приятно прост:

library(tidyverse)

df <- read_csv("experiment-table.csv", skip = 6) %>%
  mutate(positions = map(positions, read_csv)) %>%
  unnest()

Что приводит к следующему кадру данных, все аккуратно и аккуратно:

> df
# A tibble: 12 x 5
   `[run number]` `[step]`   who      x        y
            <int>    <int> <int>  <dbl>    <dbl>
 1              1        0     0  16     10     
 2              1        0     1  10     -2     
 3              1        1     1   9.03  -2.24  
 4              1        1     0 -16.0   10.1   
 5              1        2     1   8.06  -2.48  
 6              1        2     0 -15.0   10.3   
 7              2        0     1 -14      1     
 8              2        0     0  13     15     
 9              2        1     0  14.0   15.1   
10              2        1     1 -13.7    0.0489
11              2        2     0  15.0   15.1   
12              2        2     1 -13.4   -0.902 

То же самое у Юлии:

using CSV, DataFrames
df = CSV.read("experiment-table.csv", header = 7)
cols = filter(col -> col != :positions, names(df))
df = by(df -> CSV.read(IOBuffer(df[:positions][1])), df, cols)
...