NetLogo 6.2如何调整文件导出数据?

How to adjust files to export data in NetLogo 6.2?

我正在尝试在 NetLogo 6.2 中导出文件。但是我有两个困难:

  1. 在输出中只输入 1 header。它只出现多个 header 或没有 header(见下图)

多个header个:

没有header:

我希望它看起来像这样(如下)。可能吗?

  1. 关闭文件以免多个结果写入同一个文件。当我使用“小心”和“file-delete”和“[]”命令时,只出现了一只乌龟的结果:

如果我删除命令“小心地”和“file-delete”和“[]”,所有海龟的结果都会出现。但是,如果我多次运行模型,结果将保存在最上面。如何在不改变结果的情况下关闭文件?

代码:

globals [ outifile ]
turtles-own [ my-xcor my-ycor my-timer ]

to output 
;  carefully ;; using this command to close the file only saves the path of the last turtle
;  [ file-delete ( word outfile name ".csv" ) ] ;; using this command to close the file only saves the path of the last turtle
;  [ ] ;; using this command to close the file only saves the path of the last turtle
  file-open ( word outifile ".csv" )
  file-print ( word "id;my_xcor;my_ycor;my_timer" ) ;; when removing this line, there is no header
  file-print ( word self  " ; " my-xcor " ; " my-ycor " ; " my-timer )  
  file-close
end

这两个问题的原因相同,解决方法相同。

第 1 点

这是因为显然 to output 每只海龟 执行,这意味着每只海龟将首先打印 headers 然后打印值。请注意,这正是您要求他们做的,让每只海龟执行以下两行代码:

file-print ( word "id;my_xcor;my_ycor;my_timer" )
file-print ( word self  " ; " my-xcor " ; " my-ycor " ; " my-timer )

因此,在要求海龟做任何事情之前,你必须先打印 headers(即观察者是必须打印 headers,然后必须要求海龟做任何事情的人)打印值)。

对于第 2 点

这个问题也是因为你有 每只乌龟 执行整个 to output 过程。在这种情况下,这意味着每只乌龟都会 运行

carefully
 [file-delete (word outfile name ".csv")]
 []

因此,每只乌龟在写入输出之前都会确保文件已被删除(或文件不存在)。

同样,这是观察者应该做的事情,因为它只需要做一次。

修复

要解决这些问题,您有两个完全等价的选择:

选项 1

保留 to output 一个 turtle-context 过程(即由海龟执行的过程)并将观察者的任务放在代码中的其他地方,您知道它们将被执行 仅一次 - 例如在setup 或某个等效位置:

to setup
 ; Here you have your normal 'setup' code, plus:
 prepare-output
end

to prepare-output
 carefully
  [file-delete (word outfile name ".csv")]
  []

 file-open (word outifile ".csv")
 file-print (word "id;my_xcor;my_ycor;my_timer")
 file-close
end

因此观察者将负责清理文件并创建 headers,当海龟 运行 to output 时,它们只需要打印它们的值。

选项 2

to output 从海龟执行的过程更改为观察者执行的过程。在这种情况下,在程序开始时,观察者将做一次它的观察者的事情,然后才要求所有海龟打印它们的值。海龟完成后,观察者关闭文件。例如:

to go
 ; Here you have your normal 'go' code, plus something like:
 if (stop-condition-reached?) [
  output
  stop
 ]
end

to output
 carefully
  [file-delete (word outfile name ".csv")]
  []

 file-open (word outifile ".csv")
 file-print (word "id;my_xcor;my_ycor;my_timer")

 ask turtles [
  file-print (word self  " ; " my-xcor " ; " my-ycor " ; " my-timer)  
 ]

 file-close
end


这两个选项背后的逻辑完全相同:观察者只做一次(删除旧文件并使用 headers 创建一个新文件),然后每只海龟打印其值。

这两个选项之间的区别仅在于代码的组织方式 - 即 to output 是由海龟执行的过程,还是由观察者(然后要求海龟打印)执行的过程?

一般来说,跟踪谁在执行什么很重要。 出于这个原因,在我的代码中,我总是用一条注释来注释每个过程的声明,说明从什么上下文执行这样的过程(例如观察者上下文、海龟上下文、补丁上下文、link 上下文)。