Всякий раз, когда вы хотите извлечь информацию из отдельных агентов (включая ссылки), используя BehaviorSpace, хороший способ сделать это - использовать расширение csv
, как описано в этом ответе:
https://stackoverflow.com/a/52406247/487946
Общая идея заключается в том, что мы можем встроить csv в наш csv, а затем использовать read_csv
-подобную функцию в R (или Python, или Julia, или что-то еще), чтобы извлечь "внутренний csv" из наших результатов в BehaviorSpace.
В случае ссылок было бы полезно включить номер who
каждого конца ссылки, чтобы однозначно идентифицировать его. (Это один из очень немногих случаев, когда я буду выступать за использование числа who
для чего-либо.)
Давайте возьмем эту глупую примерную модель:
extensions [ csv ]
links-own [ attribute ]
to setup
clear-all
create-turtles 3 [
create-links-with other turtles [
set attribute random-float 1
]
]
reset-ticks
end
to go
ask links [ set attribute attribute * 0.5 ]
tick
end
Она просто создает триЧерепахи со ссылками между ними, устанавливают attribute
ссылки на случайное число и многократно удваивают это число по мере того, как модель тикает.
Чтобы сгенерировать CSV, который мы будем встраивать в наши результаты BehaviorSpace, мы пишемследующий репортер:
to-report link-attributes-csv
report csv:to-string
fput ["who1" "who2" "attribute" ]
[ (list [ who ] of end1 [ who ] of end2 attribute) ] of links
end
Если вы попробуете это в командном центре после запуска setup
, он выдаст что-то вроде этого:
observer> setup
observer> print link-attributes-csv
who1,who2,attribute
0,1,0.9409784968740699
1,2,0.9079884204004846
0,2,0.9070292656950991
Как вы можете видеть, мы имеемаккуратная маленькая таблица csv, где каждая строка представляет определенную ссылку, идентифицированную числом who
черепах, которых она соединяет.
Поскольку этот репортер сообщает о строке (и эта строка может содержать разрывы строк), мы можем использовать его непосредственно в эксперименте BehaviorSpace:
Запуск этого эксперимента (с «выводом таблицы») дает следующий выходной файл:
"BehaviorSpace results (NetLogo 6.1.1)"
"link-attributes-example.nlogo"
"experiment"
"10/16/2019 11:00:12:495 +0100"
"min-pxcor","max-pxcor","min-pycor","max-pycor"
"-16","16","-16","16"
"[run number]","[step]","link-attributes"
"1","0","who1,who2,attribute
1,2,0.15670083797389645
0,2,0.40055350697928993
0,1,0.34892645306446335"
"2","0","who1,who2,attribute
0,1,0.2831244347856665
1,2,0.27721328746715357
0,2,0.5221352362751627"
"2","1","who1,who2,attribute
0,1,0.14156221739283326
0,2,0.26106761813758134
1,2,0.13860664373357678"
"1","1","who1,who2,attribute
0,2,0.20027675348964497
1,2,0.07835041898694822
0,1,0.17446322653223167"
"1","2","who1,who2,attribute
1,2,0.03917520949347411
0,2,0.10013837674482248
0,1,0.08723161326611584"
"2","2","who1,who2,attribute
1,2,0.06930332186678839
0,1,0.07078110869641663
0,2,0.13053380906879067"
Это выглядит немного странно со всеми переносами строк, но ваши инструменты анализа данных должны быть в состоянии справиться с этим. Вот как это сделать, используя R и Tidyverse:
library(tidyverse)
df <-
read_csv("experiment-table.csv", skip = 6) %>%
mutate(`link-attributes` = map(`link-attributes`, read_csv)) %>%
unnest()
Функции purrr::map
и tidyr::unnest
являются ключевыми. Я не буду их здесь объяснять, но стоит посмотреть их и ознакомиться с ними.
Наш конечный результат выглядит следующим образом:
# A tibble: 18 x 5
`[run number]` `[step]` who1 who2 attribute
<dbl> <dbl> <dbl> <dbl> <dbl>
1 1 0 1 2 0.157
2 1 0 0 2 0.401
3 1 0 0 1 0.349
4 2 0 0 1 0.283
5 2 0 1 2 0.277
6 2 0 0 2 0.522
7 2 1 0 1 0.142
8 2 1 0 2 0.261
9 2 1 1 2 0.139
10 1 1 0 2 0.200
11 1 1 1 2 0.0784
12 1 1 0 1 0.174
13 1 2 1 2 0.0392
14 1 2 0 2 0.100
15 1 2 0 1 0.0872
16 2 2 1 2 0.0693
17 2 2 0 1 0.0708
18 2 2 0 2 0.131
Надеюсь, это поможет.