gpt4 book ai didi

csv - NetLogo - 使用BehaviorSpace获取所有海龟位置作为每次重复的结果

转载 作者:行者123 更新时间:2023-12-02 20:15:56 26 4
gpt4 key购买 nike

我正在使用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 文件中,因此我无法判断每次运行的情况。

最佳答案

Seth 的合并建议 behaviorspace-run-number另一种选择是在 csv 输出的文件名中添加。它允许您将该文件与主BehaviorSpace 输出文件中的摘要数据关联起来。

另一种选择是将报告者列表作为“度量”包含在行为空间实验定义中。例如,在您的情况下:

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

然后,您可以用您最喜欢的数据分析语言“手动”解析结果列表。我之前在 Julia 中使用过以下函数:

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

我确信您可以轻松地用 Python 或 R 或​​您正在使用的任何语言编写一些等效代码。

在上面的示例中,我为海龟的 xcorycor 输出了单独的列表。您还可以输出单个“列表列表”,但解析会更加棘手。


编辑:如何使用 csv 扩展和 R

执行此操作

巧合的是,我今天必须为另一个项目做类似的事情,并且我意识到 csv extension 的组合R 可以让这变得非常简单。

总体思路如下:

  • 在 NetLogo 中,使用 csv:to-string将列表数据编码为字符串,然后直接将该字符串写入BehaviorSpace 输出中。

  • 在 R 中,使用 purrr::mapreadr::read_csv ,然后是 tidyr::unnest ,将所有内容解压到一个整洁的“每行一个观察”数据框中。

换句话说:我们喜欢 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

然后,我们使用我们的 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

Julia 也有同样的情况:

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)

关于csv - NetLogo - 使用BehaviorSpace获取所有海龟位置作为每次重复的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52391934/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com