Netlogo-如何在模拟过程中从txt/CSV文件中读取部分数据



我有一个很大的文件,其中包含地块信息列表。我将每个地块建模为一个代理,在我的模型中具有独特的属性。总共有230万个包裹。

问题是,如果我在设置过程中一次对所有地块进行文件读取并将其创建为代理,它将占用大量内存,并可能在最初的几次滴答声中导致OOM。因此,我必须更改策略,以便在模拟运行期间批量导入数据和创建代理。

例如,我的数据看起来像这样:第一列是以分钟为单位的到达时间,第二列是每个包裹的属性。我运行我的模拟模型一次勾选=一分钟,所以所有具有相同到达时间的包裹都将被激活以执行某些操作,一旦它们完成,它们就会死于

arr_time    property
94  T6
197 T4
202 T4
252 T6
252 T6
252 T4
252 T6
252 T6
252 T6
252 T6
252 T6
252 T6
252 T6
252 T6
252 T6
252 T6
252 T6
252 T6
252 T6
252 T6
252 T6
252 T6
252 T6
252 T6
252 T6
665 T4
665 T6
665 T6
665 T6
665 T6
665 T4
846 T4
1355    T4
1407    T6
1411    T6
1426    T6
1426    T6
1426    T6
1426    T6

实际的文件比这个大得多。我不想一次读取一次,而是想在模拟运行期间多次读取文件,例如,每120个刻度(分钟)运行一次文件读取命令,以读取接下来的120分钟数据,并创建在此期间到达的代理。因此,我的模拟世界中的代理总数可以减少,以防止"内存不足",尤其是在执行并行运行时。(顺便说一句,我更喜欢用.txt文件读取文件)

我将给出一个很好的ol’file io示例。我特别不打算使用csv扩展名,因为它会读取.中的完整文件

从本质上讲,这个想法是,如果是当前刻度,则逐行加载代理。你需要解析你的行并将arr时间转换为int。你还需要在模拟中的每个tick调用这个函数(节省时间,但节省空间!)

to load-agents
file-open "my-file.txt"
while [not file-at-end?]
[
let line file-readline
let delimiter-index position " " line
let arr-time read-from-string substring 0 delimiter-index
let property substring (delimiter-index + 1) length line
if arr-time > ticks [file-close stop]
if arr-time = ticks [load-agent arr-time property]
] 
end

最新更新